6 способов центрирования элемента неизвестного размера по вертикали и горизонтали
Один из современных и самых простых способов центрирования – использование display: flex .
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ display: flex; align-items: center; justify-content: center; >
Вариант №2: CSS Grid
Grid – наше ближайшее и светлое будущее! Никогда прежде выравнивание блоков не была такой простой и вряд ли в скором времени что-то превзойдет CSS Grid. Хотя этот пример и похож очень на предыдущий, возможности Grid гораздо шире. В общем, если не научились работать с flexbox – можете смело его пропускать и разбираться с CSS Grid.
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ display: grid; align-items: center; justify-content: center; >

Вариант №3: центрирование через псевдоэлемент
Мой самый любимый способ. Несмотря на то, что в последнее время стал использовать flexbox – выравнивание через псевдоэлемент навсегда останется в моём сердце.
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ text-align: center; >body:before < content: ''; height: 100%; display: inline-block; vertical-align: middle; >.block

Вариант №4: line-height
Один из самых глупых вариантов, который хоть и подходит для выравнивание блока неизвестной высоты, но требует фиксированную высоту родителя (в других способах высота родителя указана лишь для примера). Кстати, этот способ также не подойдет для многострочного текста.
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ >.block < line-height: 100vh; text-align: center; >.block img

Вариант №5: position absolute
Один из моих любимых вариантов. Идеально подходит для позиционирования попапов – они должны быть поверх остального контента, а их высота никогда неизвестна, как и высота экрана пользователя.
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ position: relative; >.block

Вариант №6: table-cell
Самый древний вариант, которым пользовались на заре Интернета и во времена рассвета табличной вёрстки. Таблицами уже давно никто не верстает, но имитировать их поведение через CSS ради достижения результата – почему бы и нет?
body < margin: 0; /* for Demo only */ height: 100vh; /* for Demo only */ background: black; /* for Demo only */ display: table; width: 100%; >.block

Знакомство с Flexbox
Модуль гибких блоков (англ. Flexible Box Layout Module) был представлен W3C как более эффективный инструмент для создания разметки, выравнивания и распределения элементов на веб-странице, даже если их размеры неизвестны (отсюда и слово «flex», что в переводе с английского означает «гибкость»).
Основная идея flexbox (так сокращенно называют этот модуль) — это дать возможность контейнеру изменять ширину, высоту и порядок дочерних элементов так, чтобы доступное пространство заполнялось наилучшим образом (в основном это нужно для обеспечения адаптивности веб-страницы). Flex-контейнер расширяет свои элементы с целью заполнения свободного места либо сжимает их, чтобы предотвратить переполнение.
Отличия Flexbox от обычной разметки
На прошлых уроках мы изучали, как создать макет с использованием свойства float . В процессе работы нам то и дело приходилось решать какие-то проблемы, искать обходные пути и применять различные хаки вместо того, чтобы просто создать макет.
Почему так сложно сделать обычный макет, используя привычные средства CSS? Дело в том, что HTML и CSS развивались очень стремительно. Сегодня с помощью CSS вы можете сотворить с веб-страницей практически всё что угодно. Но в самом начале, когда инструментов было не так много, веб-разработчики использовали доступные возможности для создания макетов. Именно поэтому раньше многие сайты верстались с помощью таблиц, так как это был единственный удобный способ управлять расположением элементов на странице. Позже разработчики стали использовать в макетах свойство loat , а также inline-block . А вертикальное выравнивание элементов — головная боль почти каждого верстальщика.
В итоге мы имеем множество разных хитроумных способов построить макет и выровнять элементы. И каждый из этих способов имеет свои недостатки, с которыми нужно либо мириться, либо бороться. Набирающий популярность модуль Flexbox призван кардинально изменить эту ситуацию и сильно облегчить работу веб-разработчикам. Флексбокс позволяет контролировать размеры элементов, управлять их выравниванием по нескольким осям, назначать порядок вывода и многое другое.
Преимущества Flexbox
Flexbox — мощный модуль, который включает в себя большой набор свойств и обладает большими возможностями. Рассмотрим основные преимущества flexbox:
- Блоки легко становятся гибкими, элементы могут сжиматься и растягиваться, заполняя пространство.
- Нет никаких проблем с тем, чтобы выровнять элементы по вертикали и горизонтали.
- Неважно, в каком порядке расположены HTML-элементы. Вы можете изменить их порядок через CSS.
- Элементы могут самостоятельно выстраиваться в ряд или образовывать столбец.
- Очень простая адаптация под направление текста RTL (right-to-left). Если в браузере установлена локаль RTL, все flex-элементы автоматически отобразятся в обратном порядке.
Модель Flexbox
Как мы уже говорили, у модуля flexbox есть широкий набор свойств. Некоторые из этих свойств необходимо применять к контейнеру (родительскому элементу, т. н. flex-контейнеру), а некоторые — к его дочерним элементам (т. н. flex-элементам). В этом уроке мы рассмотрим те свойства, которые предназначены для flex-контейнера.
Чтобы получить возможность пользоваться модулем flexbox, первым делом необходимо задать родительскому контейнеру свойство display: flex , вот так:
.container
Это свойство превратит обычный блок во flex-контейнер. После этого дочерние элементы контейнера автоматически преобразуются во flex-элементы. Кроме этого, можно задать значение inline-flex , которое сделает flex-контейнер инлайновым (строчным).
Теперь давайте разберемся с принципом работы flex-раскладки. В отличие от блочной и строчной моделей, где размещение элементов основывается на принципах блочного и строчного потоков, flex-модель основана на гибких потоках.
Чтобы стало понятнее, ниже мы покажем схематическую иллюстрацию с основной терминологией flexbox, а также объясним каждый термин отдельно:
Оси Flexbox
Итак, оси flexbox — это основное понятие данной модели.
Главная ось flex-контейнера — это направление, в котором располагаются его дочерние элементы. У главной оси есть начало и конец (они обозначены на схеме).
Поперечная ось flex-контейнера — это направление, перпендикулярное главной оси. У поперечной оси тоже есть начало и конец (отмечены на схеме).
Если вашей актуальной локалью является LTR (left-to-right), то направление главной оси пролегает слева направо. Направление поперечной оси пролегает сверху вниз.
В следующем уроке вы узнаете, какие существуют специальные CSS-свойства для flex-контейнера.
Flexbox CSS — (Практика) #1
Flexbox CSS #1 — Практика выравнивания элементов
В текущем видео уроке разберем три основных свойства Flexbox CSS — display | justify-content | align-items . При помощи их можно выравнивать flex-элементы по горизонтали и вертикали.
Нам понадобится заготовка, можете ее скачать или набрать код самостоятельно.
Заготовка к уроку — скачать
Пробежимся по ее структуре заготовки. В index файле подключаю иконки через cdn, ниже подключаю файл стилей, а в теле body создан блок с классом dws-wrapper который служит оберткой всего контента. Файл стилей пустой, в папке img картинка на задний фон и изображение для примера.
#1 Практика по Flexbox (выравнивание элементов)
Базовая разметка HTML
Начинаем как всегда с базовой разметки блоков. Нам понадобится контейнер, для него зададим класс img-box , в котором расположим следующие элементы. Изображение, заключаем в отдельный блок с классом img-wrapper , он будет для нее оберткой.
Для иконок сделаем UL, в нем четыре списка и в каждом расположим по ссылке.
ul>(li>a)*4
Дописываем решетку в тег href , и подберем ряд иконок под нашу тематику.
- fa-cog
- fa-envelope-open
- fa-heart
- fa-share-alt
Ниже делаем заголовок четвертого уровня, и параграф с произвольным текстом.
CSS image hover effect
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eveniet.
На этом разметка HTML завершена, переходим к описанию стилей.
Описываем CSS стили
Частенько в комментариях задают мне вопросы, зачем я выравниваю блок обертку при помощи transform , таким способом.
body < margin: 0; padding: 0; font-family: Verdana, sans-serif; >.dws-wrapper
Все довольно просто, при таком методе не нужно задавать контейнеру высоту, в то же время когда выравниваем через flexbox , нам она необходима для flex-контейнера . Без нее мы не сможем выровнять дочерние элементы по вертикали.
Давайте покажу, как это выглядит, к тому же закрепим пройденный материал.
Сейчас dws-wrapper является контейнером, притом обратите, какое пространство он занимает по высоте.
.dws-wrapper
Теперь сделаем его flex-контейнером, применяем правило display: flex и в итоге, что мы видим, что наш единственный flex-элемент img-box прижался в верхний угол, и это хорошо видно, если зададим для него обводку.
.dws-wrapper
.img-box
В тоже время flex-контейнер dws-wrapper занял всю ширину окна браузера.
Далее применяем свойство justify-content со значением center и flex-элемент выровнялся по центру.
Затем при помощи свойства align-items пытаемся выровнять его по вертикали, но безрезультатно. Потому что, высота flex-контейнера, это все-то пространство, которое занимает его элемент и для того что бы его выровнять по вертикали, нужно соответственно задать высоту окна браузера height: 900px .
.dws-wrapper
Вот таким образом мы добились выравнивания flex-элемента в нашем случае.
Просто мне для записи уроков проще первый вариант, так как в нем высоту контейнера задавать не приходится.
В данном примере оставлю второй вариант, так как все же урок по flexbox , только уберу задний фон /*background: #ccc;*/, который задавал для примера. Взамен ему сделаем фон body .
background: url("img/ignasi_pattern_s.png");
Все это не обязательно делать, данный код я использую для записи уроков, вы ее можете не прописывать, а начинать с данного момента.
Переходим к оформлению блока img-box и наша задача иконки расположить с правой стороны картинки. Тут нам поможет flexbox . В начале урока я говорил, что блок с классом img-box будет flex-контейнером, и полагаю, многие из вас зададут вопрос, что у нас может быть два flex-контейнера? Да почему бы нет! Хоть десять их наштопайте, это допустимо документацией и мы можем делать их многоуровневые вложенности.
Задаем для блока с классом img-box правило display: flex . Далее что бы выровнять элементы по вертикали пропишем свойство align-items и уберем обводку.
.img-box
Временно скрываем элементы, с которыми не работаем это блок UL и текст, что бы они нам не мешали. Приучайте себя с самого начала, убирать со странице те элементы, которые на данный момент не используете, это вас лишний раз не будет отвлекать от основной задачи, и сможете концентрироваться на определенном этапе работы.
.img-box ul, .img-box h4, .img-box p
Приступим к оформлению первого элемента, это блок с картинкой. Отбираем его .img-wrapper img и задаем ширину в 300 пик., добавляем серую обводку.
Так как этот элемент будет, перемещается по наведению, добавим плавность при помощи transition .
.img-wrapper img
Ниже описываем стили по наведению. Делаем закругление углов при помощи transform , сдвинем блок по оси X влево на 80 пик. и добавим фильтр.
.img-box:hover img
Основному блоку .img-box пропишем свойство overflow: hidden что бы картинка при смещение по наведению не выходила за его пределы. Затем добавим бордюр с левой стороны, что бы изображение не выглядела, как обрезанное.
.img-box
Убираем у картинки с левой стороны бордюр.
.img-wrapper img
Вы, наверняка обратили внимание, что вложенный блок с картинкой немного меньше по высоте, о чем говорит выступ бордюра и если задать контейнеру .img-box обводку outline: 1px solid orange это станет заметнее.
Что бы исправить такое дело, делаем блок .img-wrapper flex-контейнером и картинка занимает все его пространство блока.
.img-wrapper
Блок с картинкой оформлять закончи и временно пока закомментирую анимацию, что бы она нам не мешала.
/*.img-box:hover img */
Далее переходим к оформлению списков с иконками.
Отображаем блок UL , отбираем его .img-box ul , скрываем маркеры, добавлю плавность анимации, задаем фон, обводку в два пикселя и закруглим углы.
.img-box ul
Затем оформляем списки Li , делаем отступы, выравниваем иконки по горизонтали, и делаем разделители.
.img-box li
Последний разделитель нам не нужен, его сразу скрываем.
.img-box li:last-child
Затем оформляем иконки по наведению.
.img-box li i < color: #fff; font-size: 30px; text-shadow: 2px 2px 3px #133648; >.img-box li a:hover i
В заключение делаем плавную анимацию, делаем перемещение блока UL по наведению на изображение.
.img-box ul < … margin-left: -114px; transform: translateX(-20px); … >.img-box:hover ul
Проверяем, как все работает в комплексе.
Для того что бы блок с иконкой ушел на задний план, для картинки задаем z-index .
.img-wrapper img
Временно все закомментируем и приступим к оформлению текстовых блоков. Отображаем текст, и позиционируем его относительно контейнера .img-box . Временно overflow: hidden закомментирую.
.img-box < /*overflow: hidden;*/ position: relative; … >
Затем задаем полупрозрачный фон красного цвета, цвет текста делаем белый, позиционируем с права 100 пик, с низу 70 пик., задаем внутренние отступы и плавность анимации в 1s.
.img-box h4, .img-box p
Оформляем текст параграфа.
.img-box p
Заголовку добавляем text-transform .
.img-box h4
Теперь делаем анимацию, текст смещаем на 200 пик. при помощи transform по оси X в левую сторону и делаем невидимым.
.img-box h4, .img-box p
По наведению на блок .img-box отображаем текст при помощи transform , и перемещаем в изначальное положение.
.img-box:hover h4, .img-box:hover p
Затем отображаем весь закомментированный код, и смотрим, какой результат получили.
Не появились блоки с текстом, для них зададим приоритетность z-index в два.
.img-box h4, .img-box p
В принципе, закончили данный пример, получили такого рода анимация.
Урок подготовил Горелов Денис.
Все, что нужно знать по CSS Flexbox: шпаргалка
Макет CSS flexbox позволяет легко форматировать HTML. Flexbox упрощает выравнивание элементов по вертикали и горизонтали с помощью строк и столбцов. Предметы будут «сгибаться» до разных размеров, чтобы заполнить пространство. Это упрощает адаптивный дизайн.
CSS Flexbox отлично подходит для общего макета веб-сайта или приложения. Его легко освоить, он поддерживается всеми современными браузерами, и не требуется много времени, чтобы разобраться в основах. К концу этого руководства вы будете готовы начать использовать flexbox в своих веб-проектах.
В статью включены полезные анимированные гифки от Scott Domes, которые сделают flexbox еще проще для понимания и визуализации.
Все свойства CSS Flexbox
Вот список всех свойств CSS flexbox, которые можно использовать для позиционирования элементов в CSS. Далее вы увидите, как они работают.
CSS, который можно применить к контейнеру
display: flexbox | inline-flex; flex-direction: row | row-reverse | column | column-reverse; flex-wrap: nowrap | wrap | wrap-reverse; flex-flow: || justify-content: flex-start | flex-end | center | space-between | space-around; align-items: flex-start | flex-end | center | baseline | stretch; align-content: flex-start | flex-end | center | space-between | space-around | stretch;
CSS, который можно применить к элементам / элементам в контейнере
order: ; flex-grow: ; /* default 0 */ flex-shrink: ; /* default 1 */ flex-basis: | auto; /* default auto */ flex: none | [ ? || ] align-self: auto | flex-start | flex-end | center | baseline | stretch;
Терминология

Прежде чем вы узнаете, что делают свойства flexbox, важно понять связанную с ними терминологию. Вот определения ключевых терминов flexbox:
- main-axis: основная ось гибкого контейнера — это основная ось, вдоль которой располагаются гибкие элементы. Направление основано на свойстве flex-direction.
- main-start | main-end: гибкие элементы помещаются в контейнер, начиная со стороны main-start и заканчивая стороной main-end.
- main size: ширина или высота гибкого контейнера или гибкого элемента, в зависимости от того, какое значение находится в основном измерении, является основным размером этого блока. Таким образом, его основным свойством размера является свойство ширины или высоты, в зависимости от того, что находится в основном измерении.
- cross axis: ось, перпендикулярная главной оси, называется поперечной осью. Его направление зависит от направления главной оси.
- cross-start | cross-end: гибкие линии заполняются элементами и помещаются в контейнер, начиная с поперечной стороны гибкого контейнера и идя к поперечной стороне.
- cross size: ширина или высота гибкого элемента, в зависимости от того, что находится в поперечном измерении, является поперечным размером элемента. Свойство поперечного размера — это то, что находится в поперечном измерении: «ширина» или «высота».
CSS Display Flex
display: flex он сообщает вашему браузеру: «Я хочу использовать гибкий бокс с этим контейнером». По div умолчанию для элемента используется значение display:block . Элемент с этой настройкой отображения занимает всю ширину линии, на которой он находится. Вот пример четырех цветных div в родительском div с настройкой отображения по умолчанию:
Это инициализирует этот контейнер как гибкий контейнер и применит некоторые свойства гибкости по умолчанию.
Направление гибкости
flex-direction позволяет управлять отображением элементов в контейнере. Вы хотите, чтобы они были слева направо, справа налево, сверху вниз или снизу вверх? Вы можете легко сделать все это, установив flex-direction для контейнера.
По умолчанию после применения display: flex элементы располагаются вдоль главной оси слева направо. Анимация ниже показывает, что происходит при flex-direction: column добавлении к элементу контейнера.
Вы также можете установить flex-direction в row-reverse и column-reverse .
Justify Content
justify-content — это свойство выравнивания элементов в контейнере по главной оси (см. терминологическую схему выше). Он меняется в зависимости от того, как отображается контент. Он позволяет нам заполнить любое пустое пространство в строках и определить, как мы хотим его «оправдать».
Вот наиболее распространенные варианты , используемые для обоснования содержания: flex-start | flex-end | center | space-between | space-around .
Вот как выглядят разные варианты:
Элементы Flex Align
align-items позволяет выравнивать элементы по поперечной оси (см. терминологическую схему выше). Это позволяет размещать контент по-разному, используя выравнивание контента и выравнивание элементов вместе.
Вот наиболее распространенные варианты выравнивания элементов: flex-start | flex-end | center | baseline | stretch
Чтобы все stretch работало так, как вы ожидаете, необходимо установить высоту элементов, auto а не конкретную высоту.
На этой анимации показано, как выглядят параметры:
Теперь мы будем использовать оба justify-content и align-items . Это продемонстрирует разницу между главными осями и поперечными осями.
Align Self
align-self позволяет настроить выравнивание отдельного элемента.
Он имеет все те же свойства, что и align-items .
В следующей анимации родительский div имеет CSS align-items: center и flex-direction: row . Первые два квадрата проходят через разные align-self значения.
Flex Wrap
Flexbox по умолчанию пытается уместить все элементы в одну строку. Однако вы можете изменить это с помощью flex-wrap свойства. Есть три значения, которые вы можете использовать, чтобы определить, когда элементы переходят в другую строку.
Значение по умолчанию — flex-wrap: nowrap . Это приведет к тому, что все останется в одном ряду слева направо.
flex-wrap: wrap позволит элементам перемещаться в следующую строку, если в первой строке недостаточно места. Элементы будут отображаться слева направо.
flex-wrap: wrap-reverse позволяет элементам перемещаться в следующую строку, но на этот раз элементы отображаются справа налево.
Flex Flow
flex-flow сочетает в себе использование flex-wrap и flex-direction в одно свойство. Он используется, сначала устанавливая направление, а затем обертку. Вот пример: flex-flow: column wrap;
Align Content
align-content используется для выравнивания элементов с несколькими линиями. Он предназначен для выравнивания по поперечной оси и не влияет на содержимое одной строки.
Вот варианты: align-content: flex-start | flex-end | center | space-between | space-around | stretch;
Вертикальное центрирование с помощью Flexbox
Если вы хотите центрировать все содержимое внутри родительского элемента по вертикали, используйте align-items . Вот код для использования:
.parent
Зарегистрируйтесь на Портале
и получите красивый адрес своей странички вида: senior.ua/sergey.ivanov

senior.ua/ |
Потом все адреса будут Заняты 🙁

