Как центрировать плавающие элементы?

Я использую разбиение на страницы, и его нужно центрировать. Проблема в том, что ссылки нужно отображать в виде блоков, поэтому их нужно перемещать. Но тогда text-align: center; с ними не работает. Я мог бы добиться этого, задав отступу div для оболочки left, но на каждой странице будет разное количество страниц, так что это не сработает. Вот мой код:

.pagination {
  text-align: center;
}
.pagination a {
  display: block;
  width: 30px;
  height: 30px;
  float: left;
  margin-left: 3px;
  background: url(/images/structure/pagination-button.png);
}
.pagination a.last {
  width: 90px;
  background: url(/images/structure/pagination-button-last.png);
}
.pagination a.first {
  width: 60px;
  background: url(/images/structure/pagination-button-first.png);
}
<div class='pagination'>
  <a class='first' href='#'>First</a>
  <a href='#'>1</a>
  <a href='#'>2</a>
  <a href='#'>3</a>
  <a class='last' href='#'>Last</a>
</div>
<!-- end: .pagination -->

Чтобы понять, что я хочу:

alt text


person Mike    schedule 22.01.2011    source источник
comment
Вся цель свойства float состоит в том, чтобы расположить элемент вдоль левой или правой стороны его контейнера.   -  person Rob    schedule 22.01.2011
comment
@Rob: Ну, мне нужно было определить ширину и высоту для элементов ссылок, что можно сделать только для блочных элементов, но когда вы делаете блоки ссылок, они распространяются на новую строку, поэтому я сделал их плавающими.   -  person Mike    schedule 22.01.2011
comment
Альтернативное решение, когда вы не хотите / не можете использовать встроенный блок. stackoverflow.com/questions/1232096/   -  person hakunin    schedule 19.04.2013
comment
Я считаю, что этот вопрос заслуживает внимания модератора, так как его нынешнее название и ответы вводят в заблуждение. Вопрос не в плавающем в центре контенте, а в его центрировании. Плавающий означает, что неплавающий контент-брат должен заполнить оставшиеся пробелы, а это явно нежелательно и здесь не достигается.   -  person tao    schedule 12.03.2017
comment
@AndreiGheorghiu, если вы так думаете, предложите отредактировать его вместо того, чтобы отмечать его для модификаций. Кто угодно может редактировать эти вопросы, поэтому отредактируйте вопрос и напишите подробное объяснение в причине редактирования. Это может сделать любой пользователь, ему не обязательно быть модератором. Нет ничего плохого в вопросе или любых ответах, требующих вмешательства модератора   -  person Zoe    schedule 04.11.2017


Ответы (11)


Удаление floats и использование inline-block может решить ваши проблемы:

 .pagination a {
-    display: block;
+    display: inline-block;
     width: 30px;
     height: 30px;
-    float: left;
     margin-left: 3px;
     background: url(/images/structure/pagination-button.png);
 }

(удалите строки, начинающиеся с -, и добавьте строки, начинающиеся с +.)

.pagination {
  text-align: center;
}
.pagination a {
  + display: inline-block;
  width: 30px;
  height: 30px;
  margin-left: 3px;
  background: url(/images/structure/pagination-button.png);
}
.pagination a.last {
  width: 90px;
  background: url(/images/structure/pagination-button-last.png);
}
.pagination a.first {
  width: 60px;
  background: url(/images/structure/pagination-button-first.png);
}
<div class='pagination'>
  <a class='first' href='#'>First</a>
  <a href='#'>1</a>
  <a href='#'>2</a>
  <a href='#'>3</a>
  <a class='last' href='#'>Last</a>
</div>
<!-- end: .pagination -->

inline-block работает в кросс-браузере, даже в IE6, если элемент изначально является встроенным.

Цитата из quirksmode:

Встроенный блок размещается встроенным (т. Е. В той же строке, что и соседний контент), но он ведет себя как блок.

это часто может эффективно заменить поплавки:

На самом деле это значение используется, когда вы хотите задать ширину встроенному элементу. В некоторых случаях некоторые браузеры не допускают ширину реального встроенного элемента, но если вы переключитесь на display: inline-block, вам разрешено установить ширину ». (http://www.quirksmode.org/css/display.html#inlineblock).

Из спецификации W3C:

[inline-block] заставляет элемент генерировать контейнер блока встроенного уровня. Внутренняя часть встроенного блока форматируется как блок-блок, а сам элемент форматируется как атомарный блок встроенного уровня.

person Arnaud Le Blanc    schedule 22.01.2011
comment
Совет: не забывайте о выравнивании по вертикали. - person Synexis; 06.12.2012
comment
Да, это один из немногих случаев, которые я обнаружил, когда vertical-align действительно делает то, что вы от него ожидаете. - person Mike Turley; 11.01.2013
comment
Обратной стороной этого метода является то, что трудно контролировать горизонтальный интервал, поскольку между элементами могут появляться пробелы. - person Xavier Poinas; 25.04.2014
comment
@XavierPoinas: используйте размер шрифта: 0; на родителя, чтобы исправить эту проблему - person roelleor; 19.01.2016
comment
Имейте в виду, что font-size: 0 раньше не работал на устройствах Android. Не уверен, что это все еще верно для последних версий. - person Andreas Baumgart; 31.03.2016
comment
Также в MS Edge у вас есть точки типа стиля списка, даже если вы не установили для него значение «Нет». - person Alex; 15.01.2018

Поскольку много лет я использую старый трюк, которому научился в каком-то блоге, извините, я не помню имя, чтобы отдать ему должное.

В любом случае, чтобы центрировать плавающие элементы, это должно работать:

Вам нужна такая структура:

    .main-container {
      float: left;
      position: relative;
      left: 50%;
    }
    .fixer-container {
      float: left;
      position: relative;
      left: -50%;
    }
<div class="main-container">
  <div class="fixer-container">
    <ul class="list-of-floating-elements">

      <li class="floated">Floated element</li>
      <li class="floated">Floated element</li>
      <li class="floated">Floated element</li>

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

уловка заключается в том, чтобы оставить плавающее значение, чтобы контейнеры изменяли ширину в зависимости от содержимого. Это вопрос позиции: относительные и оставленные 50% и -50% на двух контейнерах.

Хорошо то, что это кроссбраузер и должен работать с IE7 +.

person lukart    schedule 02.02.2014
comment
Напоминание, что это работает, если есть только 1 единственный элемент с плавающей запятой. - person Wtower; 17.12.2014
comment
Проблема в том, что появится горизонтальная полоса прокрутки, потому что внешний div выходит за пределы экрана. Кроме того, когда список переносится на другую строку, все это выравнивается по левому краю. - person cleversprocket; 19.12.2014
comment
Это не будет иметь значения без установки максимальной ширины контейнера, margin: 0 auto; в этом случае лучше справляется со своей задачей - person Murhaf Sousli; 10.02.2015
comment
Для меня float: left; не нужен на .main-container и .fixer-container. - person csum; 07.01.2016
comment
@cleversprocket Я решил горизонтальную прокрутку, заключив все в один div с overflow: hidden; - person csum; 09.01.2016
comment
Цель плавающего элемента состоит в том, чтобы остальное содержимое документа заполнило пространство вокруг этого элемента, что, похоже, не происходит в этом случае, поэтому он не совсем плавающий, не так ли? - person tao; 12.03.2017
comment
Если поплавок сломается из-за размера окна, его больше нет! - person Dollique; 08.08.2017
comment
Это мог быть я: webmonkeyswithlaserbeams.wordpress.com/2008/07/09 / float-center. Я искал свой старый блог, и этот ТАК вопрос возник первым. - person Jon Wolski; 07.02.2019

Центрировать поплавки очень просто. Просто используйте стиль для контейнера:

.pagination{ display: table; margin: 0 auto; }

изменить маржу для плавающих элементов:

.pagination a{ margin: 0 2px; }

or

.pagination a{ margin-left: 3px; }
.pagination a.first{ margin-left: 0; } 

а остальное оставьте как есть.

Для меня это лучшее решение для отображения таких вещей, как меню или разбиение на страницы.

Сильные стороны:

  • кроссбраузерность для любых элементов (блоков, списков и т. д.)

  • простота

Недостатки:

  • он работает только тогда, когда все плавающие элементы находятся в одной строке (что обычно подходит для меню, но не для галерей).

@ arnaud576875 Использование элементов inline-block будет отлично работать (кроссбраузерность) в этом случае, поскольку разбиение на страницы содержит только якоря (встроенные), без элементов списка или div:

Сильные стороны:

  • работает для многострочных элементов.

Слабые стороны:

  • пробелы между строчно-блочными элементами - работают так же, как пробелы между словами. Это может вызвать некоторые проблемы с вычислением ширины контейнера и полей стиля. Ширина зазоров не постоянна, но зависит от браузера (4-5 пикселей). Чтобы избавиться от этих пробелов, я бы добавил в код arnaud576875 (не полностью протестирован):

    .pagination {интервал между словами: -1em; }

    .pagination a {word-spacing: .1em; }

  • он не будет работать в IE6 / 7 на элементах блоков и списков

person romprzy    schedule 05.06.2013
comment
display: table невероятный трюк, просто сделал все как следует, всего в нескольких строках. Мне нужно это помнить. Ваше здоровье - person kilop; 24.11.2014
comment
Техника инлайн-блока работает очень хорошо. К счастью, элементы, которые я использую (вложенные элементы div), могут хорошо справиться с пробелом. - person karolus; 12.06.2015
comment
Вы также можете удалить промежутки между встроенными блоками, сбросив размер шрифта до нуля, а затем восстановив предыдущее значение внутри дочерних элементов. - person Mike Causer; 09.08.2016

Установите width вашего контейнера в px и добавьте:

margin: 0 auto;

Справочник.

person Community    schedule 19.09.2013
comment
для меня это лучший ответ: P. - person alansiqueira27; 08.06.2014
comment
Это будет работать только при подходящей ширине контейнера, что является проблемой, когда он содержит плавающие элементы. - person Wtower; 17.12.2014

Использование Flex

.pagination {
  text-align: center;
  display:flex;
  justify-content:center;
}
.pagination a {
  display: block;
  width: 30px;
  height: 30px;
  float: left;
  margin-left: 3px;
  background: url(/images/structure/pagination-button.png);
}
.pagination a.last {
  width: 90px;
  background: url(/images/structure/pagination-button-last.png);
}
.pagination a.first {
  width: 60px;
  background: url(/images/structure/pagination-button-first.png);
}
<div class='pagination'>
  <a class='first' href='#'>First</a>
  <a href='#'>1</a>
  <a href='#'>2</a>
  <a href='#'>3</a>
  <a class='last' href='#'>Last</a>
</div>
<!-- end: .pagination -->

person Santosh Khalse    schedule 25.01.2017

Я думаю, что лучше всего использовать margin вместо display.

I.e.:

.pagination a {
    margin-left: auto;
    margin-right: auto;
    width: 30px;
    height: 30px;    
    background: url(/images/structure/pagination-button.png);
}

Проверяем результат и код:

http://cssdeck.com/labs/d9d6ydif

person Tarod    schedule 28.05.2015
comment
Работает только с маржей: авто; вместо отдельных свойств left и right. - person cellepo; 13.11.2015

Вы также можете сделать это, изменив .pagination, заменив "text-align: center" двумя-тремя строками CSS для left, transform и, в зависимости от обстоятельств, position.

.pagination {
  left: 50%; /* left-align your element to center */
  transform: translateX(-50%); /* offset left by half the width of your element */
  position: absolute; /* use or dont' use depending on element parent */
}
.pagination a {
  display: block;
  width: 30px;
  height: 30px;
  float: left;
  margin-left: 3px;
  background: url(/images/structure/pagination-button.png);
}
.pagination a.last {
  width: 90px;
  background: url(/images/structure/pagination-button-last.png);
}
.pagination a.first {
  width: 60px;
  background: url(/images/structure/pagination-button-first.png);
}
<div class='pagination'>
  <a class='first' href='#'>First</a>
  <a href='#'>1</a>
  <a href='#'>2</a>
  <a href='#'>3</a>
  <a class='last' href='#'>Last</a>
</div>
<!-- end: .pagination -->

person mwag    schedule 22.03.2019

IE7 не знает inline-block. Вы должны добавить:

display:inline;
zoom: 1;
person Krisada Art    schedule 08.10.2013

Добавьте это к своему стилю

position:relative;
float: left;
left: calc(50% - *half your container length here);

* Если ширина вашего контейнера 50 пикселей, поставьте 25 пикселей, если 10 em, положите 5 em.

person phurst-so    schedule 23.05.2017

<!DOCTYPE html>
<html>
<head>
    <title>float object center</title>
    <style type="text/css">
#warp{
    width:500px;
    margin:auto;
}
.ser{
width: 200px;
background-color: #ffffff;
display: block;
float: left;
margin-right: 50px;
}
.inim{
    width: 120px;
    margin-left: 40px;
}

    </style>
</head>
<body>



<div id="warp">
            <div class="ser">
              <img class="inim" src="http://123greetingsquotes.com/wp-content/uploads/2015/01/republic-day-parade-india-images-120x120.jpg">

              </div>
           <div class="ser">
             <img class="inim" sr`enter code here`c="http://123greetingsquotes.com/wp-content/uploads/2015/01/republic-day-parade-india-images-120x120.jpg">

             </div>
        </div>

</body>
</html>

шаг 1

создайте два или более div, которые вы хотите, и дайте им определенную ширину, например 100 пикселей для каждого, затем поместите его влево или вправо

шаг 2

затем деформируйте эти два блока в другом блоке и задайте ему ширину 200 пикселей. к этому div применить маржу автоматически. бум работает очень хорошо. проверьте приведенный выше пример.

person Community    schedule 06.04.2018

Просто добавляю

left:15%; 

в мое меню css

#menu li {
float: left;
position:relative;
left: 15%;
list-style:none;
}

тоже сделал трюк с центрированием

person user3085662    schedule 05.08.2014
comment
15% просто произвольно. - person Wtower; 17.12.2014