Почему не работает justify content space between
Перейти к содержимому

Почему не работает justify content space between

  • автор:

Css flexbox justify-content: space-between; не работает

Итак, дайте прикинем результат, который мы бы хотели получить:

pic1

и вариант, который получается:

pic1

Все дело в свойстве flex-grow установленном в любое значение отличное от 0.

Чаще эта проблема возникает при использовании которой записи flex: 1 1 150px; (первая единица). Т.е. верная запись, для данного примера будет flex: 0 1 150px;.

Также напомню, что flex-basis имеет приоритет перед height и width (в зависимости от того, как идет главная ось).

.flex < display: flex; border: 1px solid blue; justify-content: space-between; padding: 20px; >.flex > div

Почему justify-content: space-between не работает?

Ankhena

Расскажу, как научится самому разбираться с такими вопросами.
Если не умеете пользоваться инструментами разработчика, то просто обводите блоки цветными рамочками.
И сразу увидите, что нет никакого space, чтобы сработал space-between, да и любое другое выравнивание.

Решения вопроса 0
Ответы на вопрос 2

noder_ss

Линуксоид-энтузиаст и SQL разработчик
Если я правильно понял, то вы не указали размеры .nav , пропишите ему width:100%
Ответ написан 05 февр.
Комментировать
Нравится Комментировать
Myakish999 @Myakish999

Попробуйте добавить следующий код:
*::after, *::before content: none;
>
У меня был такой глюк. Если установлен content: »; , то space-between у меня работал почти как space-around — крайние элементы не прижимались к краям.
И не слушайте всяких умников, советующих почитать чего-нибудь. Они, как правило, бездари.
p.s. не забудьте удостовериться, что правило заработало. :))

Ответ написан 07 мар.
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

html

  • HTML
  • +2 ещё

Не работает overflow: auto, как решить эту проблему?

  • 1 подписчик
  • час назад
  • 21 просмотр

Не работает justify-content: space-between

есть блок отзыва с фиксированными размерами, нужно чтобы между кнопкой-ссылкой «Подробнее» и текстом было свободное пространство. Я задал элементам флекс-раскладку, направление оси column и выравнивание space-between, но по итогу оно не срабатывает, хотя место для выравнивания есть. Использовал и обёртку дивами, и задавал минимальную высоту блоку с текстом, что не особо правильно — всё равно не работает. Подскажите что можно изменить. [![введите сюда описание изображения][1]][1]

.review_text-block < margin-left: 65px; display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start; padding-top: 35px; >.review_text < display: block; margin: 0; padding: 0; font-family: 'NotoSans'; font-style: normal; font-weight: normal; font-size: 15px; line-height: 24px; color: #E5E6EC; >.more

Отслеживать
задан 14 сен 2021 в 13:19
3 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Чтобы в данном примере работал justify-content: space-between , нужно свободное пространство между элементами. А у Вашего .review_text-block нет высоты, соответственно элементы прижаты друг к другу. Если есть такая необходимость, задайте блоку-обёртке высоту, бОльшую, чем сумма высот цитаты и кнопки, — тогда всё заработает.

Но для того, чтобы между кнопкой и цитатой было пространство, достаточно кнопке задать margin-top :

body < background-color: gray; >.review_text-block < margin-left: 65px; display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start; padding-top: 35px; >.review_text < display: block; margin: 0; padding: 0; font-family: 'NotoSans'; font-style: normal; font-weight: normal; font-size: 15px; line-height: 24px; color: #E5E6EC; >.more

Отслеживать
ответ дан 14 сен 2021 в 13:50
humster_spb humster_spb
13.5k 4 4 золотых знака 24 24 серебряных знака 47 47 бронзовых знаков

С заданным margin-top кнопке есть проблема — она сама должна иметь отступ снизу. Мне показалось решение проблемы через предложенный вами способ с заданием высоты контейнеру-обёртке (сделал через min-height) более подходящим в моём случае. Спасибо.

14 сен 2021 в 14:23

@Alexey, а в чём проблема сделать margin и снизу, и сверху? Я вот в своём примере так сделал — вроде норм )

Полное руководство по Flexbox

Модуль Flexbox-лейаута (flexible box — «гибкий блок», на данный момент W3C Candidate Recommendation) ставит задачу предложить более эффективный способ вёрстки, выравнивания и распределения свободного места между элементами в контейнере, даже когда их размер неизвестен и/или динамический (отсюда слово «гибкий»).

Главная задумка flex-вёрстки в наделении контейнера способностью изменять ширину/высоту (и порядок) своих элементов для наилучшего заполнения пространства (в большинстве случаев — для поддержки всех видов дисплеев и размеров экранов). Flex-контейнер растягивает элементы для заполнения свободного места или сжимает их, чтобы предотвратить выход за границы.

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

Замечание: Flexbox-лейаут лучше всего подходит для составных частей приложения и мелкомасштабных лейаутов, в то время как Grid-лейаут больше используется для лейаутов большого масштаба.

Основы

Т.к. flexbox — это целый модуль, а не просто единичное свойство, он объединяет в себе множество свойств. Некоторые из них должны применяться к контейнеру (родительскому элементу, так называемому flex-контейнеру), в то время как другие свойства применяются к дочерним элементам, или flex-элементам.

Если обычный лейаут основывается на направлениях потоков блочных и инлайн-элементов, то flex-лейаут основывается на «направлениях flex-потока». Ознакомьтесь с этой схемой из спецификации, разъясняющей основную идею flex-лейаутов.

Flexbox

В основном элементы будут распределяться либо вдоль главной оси (от main-start до main-end), либо вдоль поперечной оси (от cross-start до cross-end).

  • main-axis — главная ось, вдоль которой располагаются flex-элементы. Обратите внимание, она необязательно должна быть горизонтальной, всё зависит от свойства flex-direction (см. ниже).
  • main-start | main-end — flex-элементы размещаются в контейнере от позиции main-start до позиции main-end.
  • main size — ширина или высота flex-элемента в зависимости от выбранной основной величины. Основная величина может быть либо шириной, либо высотой элемента.
  • cross axis — поперечная ось, перпендикулярная к главной. Её направление зависит от направления главной оси.
  • cross-start | cross-end — flex-строки заполняются элементами и размещаются в контейнере от позиции cross-start и до позиции cross-end .
  • cross size — ширина или высота flex-элемента в зависимости от выбранной размерности равняется этой величине. Это свойство совпадает с width или height элемента в зависимости от выбранной размерности.

Свойства

display: flex | inline-flex;

Применяется к: родительскому элементу flex-контейнера.

Определяет flex-контейнер (инлайновый или блочный в зависимости от выбранного значения), подключает flex-контекст для всех его непосредственных потомков.

display: other values | flex | inline-flex; 
  • CSS-столбцы columns не работают с flex-контейнером
  • float , clear и vertical-align не работают с flex-элементами
flex-direction

Применяется к: родительскому элементу flex-контейнера.

Устанавливает главную ось main-axis , определяя тем самым направление для flex-элементов, размещаемых в контейнере.

flex-direction: row | row-reverse | column | column-reverse 
  • row (по умолчанию): слева направо для ltr , справа налево для rtl ;
  • row-reverse : справа налево для ltr , слева направо для rtl ;
  • column : аналогично row , сверху вниз;
  • column-reverse : аналогично row-reverse , снизу вверх.
flex-wrap

Применяется к: родительскому элементу flex-контейнера.

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

flex-wrap: nowrap | wrap | wrap-reverse 
  • nowrap (по умолчанию): однострочный / слева направо для ltr , справа налево для rtl ;
  • wrap : многострочный / слева направо для ltr , справа налево для rtl ;
  • wrap-reverse : многострочный / справа налево для ltr , слева направо для rtl .
flex-flow

Применяется к: родительскому элементу flex-контейнера.

Это сокращение для свойств flex-direction и flex-wrap , вместе определяющих главную и поперечную оси. По умолчанию принимает значение row nowrap .

flex-flow: 'flex-direction'> || 'flex-wrap'> 
justify-content

Применяется к: родительскому элементу flex-контейнера.

Определяет выравнивание относительно главной оси. Помогает распределить оставшееся свободное место в случае, когда элементы строки не «тянутся», либо тянутся, но уже достигли своего максимального размера. Также позволяет в некотором роде управлять выравниванием элементов при выходе за границы строки.

justify-content: flex-start | flex-end | center | space-between | space-around 
  • flex-start (по умолчанию): элементы сдвигаются к началу строки;
  • flex-end : элементы сдвигаются к концу строки;
  • center : элементы выравниваются по центру строки;
  • space-between : элементы распределяются равномерно (первый элемент в начале строки, последний — в конце);
  • space-around : элементы распределяются равномерно с равным расстоянием между собой и границами строки.

justify-content

align-items

Применяется к: родительскому элементу flex-контейнера.

Определяет поведение по умолчанию для того, как flex-элементы располагаются относительно поперечной оси на текущей строке. Считайте это версией justify-content для поперечной оси (перпендикулярной к основной).

align-items: flex-start | flex-end | center | baseline | stretch 
  • flex-start : граница cross-start для элементов располагается на позиции cross-start ;
  • flex-end : граница cross-end для элементов располагается на позиции cross-end ;
  • center : элементы выравниваются по центру поперечной оси;
  • baseline : элементы выравниваются по своей базовой линии;
  • stretch (по умолчанию): элементы растягиваются, заполняя контейнер (с учётом min-width / max-width ).

align-items

align-content

Применяется к: родительскому элементу flex-контейнера.

Выравнивает строки flex-контейнера при наличии свободного места на поперечной оси аналогично тому, как это делает justify-content на главной оси.

Замечание: это свойство не работает с однострочным flexbox.

align-content: flex-start | flex-end | center | space-between | space-around | stretch 
  • flex-start : строки выравниваются относительно начала контейнера;
  • flex-end : строки выравниваются относительно конца контейнера;
  • center : строки выравниваются по центру контейнера;
  • space-between : строки распределяются равномерно (первая строка в начале строки, последняя — в конце);
  • space-around : строки распределяются равномерно с равным расстоянием между собой;
  • stretch (по умолчанию): строки растягиваются, заполняя свободное пространство.

align-content

order

Применяется к: дочернему элементу / flex-элементу.

По умолчанию flex-элементы располагаются в исходном порядке. Тем не менее, свойство order может управлять порядком их расположения в контейнере.

order: integer> 
flex-grow

Применяется к: дочернему элементу / flex-элементу.

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

Если у всех элементов свойство flex-grow задано как 1 , то каждый потомок получит внутри контейнера одинаковый размер. Если вы задали одному из потомков значение 2 , то он заберёт в два раза больше места, чем другие.

flex-grow: number> (по умолчанию 0) 

Отрицательные числа не принимаются.

flex-shrink

Применяется к: дочернему элементу / flex-элементу.

Определяет для flex-элемента возможность сжиматься при необходимости.

flex-shrink: number> (default 1) 

Отрицательные числа не принимаются.

flex-basis

Применяется к: дочернему элементу / flex-элементу.

Определяет размер по умолчанию для элемента перед распределением пространства в контейнере.

flex-basis: length> | auto (default auto) 
flex

Применяется к: дочернему элементу / flex-элементу.

Это сокращение для flex-grow , flex-shrink и flex-basis . Второй и третий параметры ( flex-shrink , flex-basis ) необязательны. Значение по умолчанию — 0 1 auto .

flex: none | [ 'flex-grow'> 'flex-shrink'>? || 'flex-basis'> ] 
align-self

Применяется к: дочернему элементу / flex-элементу.

Позволяет переопределить выравнивание, заданное по умолчанию или в align-items , для отдельных flex-элементов.

Обратитесь к описанию свойства align-items для лучшего понимания доступных значений.

align-self: auto | flex-start | flex-end | center | baseline | stretch 

Примеры

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

.parent < display: flex; height: 300px; /* Или что угодно */ > .child < width: 100px; /* Или что угодно */ height: 100px; /* Или что угодно */ margin: auto; /* Магия! */ > 

Этот пример основывается на том, что margin во flex-контейнере, заданный как auto , поглощает лишнее пространство, поэтому задание отступа таким образом выровняет элемент ровно по центру по обеим осям.

Теперь давайте используем какие-нибудь свойства. Представьте набор из 6 элементов фиксированного размера (для красоты), но с возможностью изменения размера контейнера. Мы хотим равномерно распределить их по горизонтали, чтобы при изменении размера окна браузера всё выглядело хорошо (без @media -запросов!).

.flex-container < /* Сначала создадим flex-контекст */ display: flex; /* Теперь определим направление потока и хотим ли мы, чтобы элементы переносились на новую строку * Помните, что это тоже самое, что и: * flex-direction: row; * flex-wrap: wrap; */ flex-flow: row wrap; /* Теперь определим, как будет распределяться пространство */ justify-content: space-around; > 

Готово. Всё остальное — уже дело оформления. Ниже размещён CodePen, демонстрирующий этот пример. Обязательно попробуйте растянуть/сжать окно браузера и посмотрите, что произойдёт.

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

/* Большие экраны */ .navigation < display: flex; flex-flow: row wrap; /* Сдвигает элементы к концу строки по главной оси */ justify-content: flex-end; > /* Экраны среднего размера */ @media all and (max-width: 800px) < .navigation < /* Для экранов среднего размера мы выравниваем навигацию по центру, равномерно распределяя свободное место между элементами */ justify-content: space-around; > > /* Маленькие экраны */ @media all and (max-width: 500px) < .navigation < /* На маленьких экранах вместо строки мы располагаем элементы в столбце */ flex-direction: column; > > 

Давайте попробуем кое-что получше и поиграем с гибкостью flex-элементов! Как насчёт ориентированного на мобильные устройства трёхколоночного макета с полноширинной шапкой и подвалом? И другим порядком расположения.

.wrapper < display: flex; flex-flow: row wrap; > /* Задаём всем элементам ширину в 100% */ .header, .main, .nav, .aside, .footer < flex: 1 100%; > /* В этом случае мы полагаемся на исходный порядок для ориентации на * мобильные устройства: * 1. header * 2. nav * 3. main * 4. aside * 5. footer */ /* Экраны среднего размера */ @media all and (min-width: 600px) < /* Оба сайдбара располагаются в одной строке */ .aside < flex: 1 auto; > > /* Большие экраны */ @media all and (min-width: 800px) < /* Мы меняем местами элементы .aside-1 и .main, а также сообщаем * элементу .main забирать в два раза больше места, чем сайдбары. */ .main < flex: 2 0px; > .aside-1 < order: 1; > .main < order: 2; > .aside-2 < order: 3; > .footer < order: 4; > > 

Похожие свойства

Другие ресурсы

  • Flexbox in the CSS specifications
  • Flexbox at MDN
  • Flexbox at Opera
  • Diving into Flexbox by Bocoup
  • Mixing syntaxes for best browser support on CSS-Tricks
  • Flexbox by Raphael Goetter (FR)
  • Flexplorer by Bennett Feely

Поддержка браузерами

  • (modern) означает поддержку нового синтаксиса из спецификации ( display: flex; )
  • (hybrid) означает поддержку старого неофициального синтаксиса из 2011 ( display: flexbox; )
  • (old) означает поддержку старого синтаксиса из 2009 ( display: box; )

Браузер Blackberry версии 10+ поддерживает новый синтаксис.

Для более подробной информации о том, как и когда использовать различные синтаксисы для обеспечения лучшей поддержки браузерами, обратитесь к этой статье (CSS-Tricks) или этой статье (DevOpera).

SASS- @mixin для облегчения боли:

@mixin flexbox() < display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; > @mixin flex($values) < -webkit-box-flex: $values; -moz-box-flex: $values; -webkit-flex: $values; -ms-flex: $values; flex: $values; > @mixin order($val) < -webkit-box-ordinal-group: $val; -moz-box-ordinal-group: $val; -ms-flex-order: $val; -webkit-order: $val; order: $val; > .wrapper < @include flexbox(); > .item < @include flex(1 200px); @include order(2); > 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *