Как выровнить по центру блок с элементами DIV, UL, LI

Admin CSS, HTML

Разбираем центровку блочных элементов в CCS. Располагаем по центру несколько DIV или LI элементов. Предлагаю несколько своих вариантов на большинство случаев.

В этой статье нет цели привести все варианты центровки и переписать то, что уже где-то есть. Не помню уже почему, но меня часто не устраивали предлагаемые варианты. Либо там были фиксированные блоки либо все слетало при адаптивной вёрстке либо ещё какие недостатки.

Иногда для выравнивания по центру достаточно добавить пару атрибутов и не нужно ничего сложного городить. Например, так я центрировал рекламу РТБ от Яндекс.

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

Вариант 1

Простое выравнивание всех блоков по центру страницы.

Отцентрируем содержимое UL из 4 элементов LI, которые находятся в блоке DIV с классом container.

<div class="container">
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>

В таком случае в CSS достаточно следующих правил:

.container {
    width: 100%;
}

.container ul {
    text-align: center;
    list-style: none;
}

.container li {
    display: inline-block;
}

Получим следующий вид:

Здесь отцентрировано 4 элемента LI. При уменьшении размеров экрана не помещающиеся элементы уходят вниз.

Если блоки LI с этими свойствами не устанавливаются по центру, значит какое-то другое свойство им мешает. Например, это может быть свойство float:left или display: table; или какое-то иное.

Теперь верхнюю структуру (в базовый каркас выравнивания CSS) можно добавить и другие стили. Например, сделать фиксированного размера блоки и отступы друг от друга:

.container li {
    display: inline-block;
    margin: 5px;
    width: 100px;
}

Получим следующее:

Но в таком варианте есть один минус. Блоки расположены по центру, но слева и справа огромные расстояния. Их можно уменьшить изменяя width.

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

Тогда мы уберём margin и добавим ширину такого width, чтобы он полностью покрывал область.

.container li {
  vertical-align: top;
  display: inline-block;
  width: 32.899%;
}

Между блоками останется небольшой участок пустого пространства. А чтобы его сделать ещё больше, можно отступать внутри с помощью параметра padding.

В блоках я специально не добавляю ничего лишнего, чтобы оставить ровно те стили которые непосредственно влияют на выравнинвание. Но если вы сделаете тоже самое, то такие блоки не получить. Хотя бы потому что, во-первых, нужно добавить цвет к блоку, а во-вторых, если он пустой поставить height: 100px;. Другие атрибуты уже по своему вкусу.

Итоговый вариант такой:

В приведенном скриншоте выше я оставил другие участки сайта, чтобы было понятно, где границы блоков, потому что если они прилегают к краю, то самого края уже не видно. А на картинке белые края слева и справа — это уже другая центровка, не имеющая ничего общего с рассматриваемым примером. Повторюсь, сами блоки прилегают к краям, которых не видно, потому что блоки их полностью покрывают.

Вариант 2

Для центровки блоков придумано очень много способов. А вот если нужно центровку сделать более умной, тут приходиться поломать голову. К счастью, я вывел один интересный способ для следующих целей:

Как выровнять все блоки div по центру так, чтобы блок на следующей строке выравнивался по левому краю?

Имеем следующую структуру:

<div class="archive-container-for-articles">
    <article class="archive-article">
    Блок 1
    </article>
    <article class="archive-article">
    Блок 2
    </article>
    <article class="archive-article">
    Блок 3
    </article>
    <article class="archive-article">
    Блок 4
    </article>
    <article class="archive-article">
    Блок 5
    </article>
</div>

Для них прописываем классы:

.archive-container-for-articles {
    width: 90%;
    margin: 0 auto;
}

.archive-article {
    display: inline-block;
    vertical-align: top;

    width: calc(33.3333% - ( 0.666666666667 * 36px ) );
    margin: 0 10px 0 11px;
}

Следует обратить внимание, что если менять размеры calc, то затем надо подстраивать экспериментальным путём размеры margin. Иначе блоки не будет располагаться по центру.

Эту центровку приходиться делать на глаз. Зато, если на новой строке блоков меньше, чем на строке выше, этот одинокий блок будет с левой стороны. И это смотрится куда симпатичнее, чем когда на следующей строке один единственный блок располагается по центру.

Применив технику выше, мы получим адаптивную вёрстку, со всеми равными краями, которая не будет портиться при изменении размеров экрана.

А если мы хотим, чтобы на мобильной версии было не 3 блока, а 2, то в ccs для разрешения 768 пикселей, разобьём блоки иначе:

@media screen and (max-width: 768px) {
    .archive-article {
        width: calc(47.3333% - ( 0.666666666667 * 25px ) );
        margin: 0 10px 0 20px;
    }
}

Получим те же блоки в мобильном варианте, но уже по два блока на строку:

Вариант 3

Теперь будем выравнивать с помощью flex. Может показаться, что это идеальный способ выравнивания, потому что он действительно работает очень просто. Однако FLEX не справляется с задачей описанной в варианте 2. По крайней мере, у меня не получалось достигнуть тех же результатов.

К следующей секции:

<section id="cssmenu">
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</section>

Добавляем стили:

#cssmenu {
  margin: 20px auto;
}

#cssmenu ul {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

#cssmenu > ul > li {
  margin: 1px;
}

Получаем:

В приведенном примере:

flex-wrap: wrap;

Перекидывает блоки на следующую строку, если они заполняют контейнер. Иначе они будут уходить дальше за окно браузера.

А этим:

justify-content: center;

Мы выравниваем содержимое блоков по центру.

Вариант 4

Ещё один вариант выравнивания с помощью технологии flex.

Имеем контейнер с двумя блоками внутри. Нам нужно, чтобы эти 2 блока делили ширину на две равные стороны.

<div class="container">
<div class="block">Блок 1</div>
<div class="block">Блок 2</div>
</div>

Для этого пропишем в стилях следующие свойства:

.container {
display: flex;
}

.block {
flex-basis: 100%;
}

Вариант 5

Есть ещё один вариант центровки блоков, если их строго равное количество. Например: блоков 9, по 3 на каждую строчку. И вы знаете, что так будет оставаться всегда. Например, вы делаете лендинг пейдж и знаете наверняка, что ничего лишнего между этими блоками добавляться на сайт не будет.

Итак, имеем 9 блоков следующего вида (не стал дублировать 9 раз строки, но имейте ввиду, что блоков 9):

<div class="archive-container-for-articles">
    <article class="archive-article">
    Блок 1
    </article>
    <article class="archive-article">
    Блок 2
    </article>
    <article class="archive-article">
    Блок 3
    </article>
</div>

Применяем стили для них:

.archive-container-for-articles {
    width: 100%;
    text-align: center;
}

.archive-article {
  width: 25%;
  vertical-align: top;
  display: inline-block;
  text-align: left;
}

.archive-article:nth-child(1),
.archive-article:nth-child(4),
.archive-article:nth-child(7) {
    margin: 20px 0 30px 40px;
}

.archive-article:nth-child(2),
.archive-article:nth-child(5),
.archive-article:nth-child(8) {
    margin: 20px 40px 30px;
}

.archive-article:nth-child(3),
.archive-article:nth-child(6),
.archive-article:nth-child(9) {
    margin: 20px 40px 30px 0;
}

Получим тоже адаптивную вёрстку. При уменьшении экрана не помещающийся блок будет уходить в центр низа

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

А главный недостаток, что внутрь блоков нельзя ничего поместить. Любой элемент:

<article class="archive-article"></article>
вот здесь
<article class="archive-article"></article>

будь то div или p или ещё что-то, будет считаться как внутренний элемент nth-child. В результате на него наложится стили CSS и все отступы сделанные с помощью margin сместят блоки не так как было задумано изначально.

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Как выровнить по центру блок с элементами DIV, UL, LI"