Подтвердить что ты не робот

Как я могу центрировать поле неизвестной ширины в CSS?

У меня есть этот html:

<div class="object-box">
    <img ... />
    <span class="caption">This is the caption</span>
</div>

Что сопровождается этим CSS:

.object-box .caption, .object-box img {
    display: block;
}
.object-box {
    border: 1px solid;
}

Я хотел бы, чтобы окружающий div сжимался до содержимого. Я могу достичь этого, используя float: ... или display: inline-block. Тем не менее, мне также хотелось бы, чтобы это было сосредоточено на странице, используя margin: auto. Эти два подхода не кажутся совместимыми.

Можно ли создать такой контейнер с центрированным контуром, без добавления элемента оболочки?

EDIT:

jsFiddle здесь

4b9b3361

Ответ 1

<!doctype html>
<html>
    <head>
    <title>ugh</title>
    <style>
        div#not-floated {
        display:table;
        margin:0 auto;
        }

        div#floated {
        float:right;
        position:relative;
        right:50%;
        }

        div#floated-inner {
        float:left;
        position:relative;
        left:50%;
        }

    </style>
    <!--[if lt IE 8]>
        <style type="text/css">

            #container { text-align: center; }
                #container * { text-align: left; }
                div#not-floated {
                    zoom: 1;
                    display: inline;
                }
        </style>
    <![endif]-->

    </head>

    <body>


    <div id="container">
        <div id="not-floated">
        <img src="http://www.google.co.uk/logos/d4g_worldcup10_uk-hp.jpg"><br>
        ok.
        </div>
    </div>
    <div id="floated-container">
        <div id="floated"><div id="floated-inner">
        <img src="http://www.google.co.uk/logos/d4g_worldcup10_uk-hp.jpg">
        </div></div>
    </div>

    </body>

</html>

Простое объяснение.. display:table; заставляет его сжиматься в современных браузерах, это единственный способ централизовать уровень без ширины в современных браузерах с полем: 0 auto;.

В IE это вопрос использования родительского элемента для установки text-align: center на ваш элемент уровня блока display:inline, сжатый с помощью термоусадки.

Для float его только 50% -ная математика с использованием контейнеров для IE.

Ответ 2

Просто прошу много месяцев спустя. Центрирование div неизвестной ширины является общей проблемой, поэтому вы можете захотеть создать повторно используемое решение.

HTML, который обертывает div с неизвестной шириной, которую вы хотите центрировать:

<div class="centered-block-outer">
 <div class="centered-block-middle">
  <div class="centered-block-inner">

   <!-- div that you'd like to center goes here -->

  </div>
 </div>
</div>

CSS

 /* To center a block-level element of unknown width */
 .centered-block-outer { 
   overflow: hidden;
   position: relative;/* ie7 needs position:relative here*/
 }
.centered-block-middle {
  float: left;
  position:relative;
  left:50%;
}
.centered-block-inner {
  position:relative;
  left:-50%;
}

Причина, почему это работает, объясняется здесь: http://www.tightcss.com/centering/center_variable_width.htm

Досадная часть заключается в том, что вам нужно создать три div, чтобы заставить это работать - css действительно должен обеспечить лучший способ. Но хорошая часть этого решения работает в браузерах и на вашем сайте.

Удачи!

Ответ 3

Тег div не работал; однако, тег span сжимается, чтобы соответствовать. Надеюсь, код объясняет сам. Я добавил несколько выравниваний.

<html>
    <head>
        <title>TEST!</title>
        <style type="text/css"> 
            .object-box-wrapper{width:100%;text-align:center;}
            .object-box {
                border: 1px solid;
                text-align:left;
            }
        </style>
    </head>
    <body>
        <div class="object-box-wrapper">
            <span class="object-box">
                <span class="caption">This is the caption</span>
            </span>
        </div>
    </body>
</html>

Ответ 4

что-то по этому поводу должно работать

HTML:

<msgbox>
    <p>
        foo
    </p>
</msgbox>

и CSS:

msgbox {
    width: 100%;
    display: block;
    text-align: center;
}
p {
    display: inline-block;
}

... только грустная вещь - элемент msgbox, когда используется абсолютная позиция, блокирует его щелчок (но это только связанная проблема и может быть не для вас)

Ответ 5

В CSS теперь есть что-то, называемое макетом flex, и в моем ограниченном использовании до сих пор это работало очень хорошо.

https://www.w3.org/TR/css-flexbox-1/

Попробуйте что-то в этом направлении:

<html>
<head>
<style>
body {
    display: flex;
    align-items: center;
    justify-content: center;
}

.object-box {
    border: 1px solid;
}
</style>
</head>
<body>
  <div class="object-box">
    <img ... />
    <span class="caption">This is the caption</span>
  </div>
</body>
</html>

Ответ 6

Единственный способ, которым я знаю это сделать без javascript, - установить div в position:absolute и left:50%.

Ответ 7

Мне нужно было сделать это для фотогалереи jQuery... Что я в итоге сделал, когда была выбрана фотография, текущая фотография исчезнет, ​​и будет загружена новая картинка, а затем рассчитать разницу в ширине половина контейнера минус половина ширины фотографии. Затем я бы установил margin-left (и margin-top вертикально) с этим значением.

    thewidth = $('#thephoto').width();
    theheight = $('#thephoto').height();
    $('#thephoto').css("margin-top",250-(theheight/2));
    $('#thephoto').css("margin-left",287.5-(thewidth/2));
    $('#thephoto').fadeIn(300);

Вот где мой флэш-фон действительно пригодится:)