#html #css #flexbox
#HTML #css #flexbox
Вопрос:
У меня есть гибкий контейнер, который будет динамически заполняться элементами. Контейнер не имеет фиксированной ширины (я использую max-width: max-content;
) и может содержать столько элементов, сколько я хочу. Проблема в том, что мне нужен интервал между этими элементами, но не нужен интервал слева и справа между элементом и контейнером.
Конечно, я могу сделать это с помощью .element{margin-right: 10px}
и .element:last-child{margin-right: none;}
, но есть ли способ добиться этого без псевдоклассов и JS?
<div class="container">
<div class="element">my element</div>
<div class="element">my element</div>
...
<!-- nubmer of elements changing -->
...
</div>
Комментарии:
1. Вы могли бы получить последний элемент с помощью javascript, а затем добавить класс к этому элементу, но это более утомительно, чем просто использовать
:last-child
селектор2. о да, я забыл добавить, что я не могу использовать JS здесь
3. Кажется, это решение, оно просто еще не работает в разных браузерах (не работает на Хроне) —
column-gap: 20px;
— developer.mozilla.org/en-US/docs/Web/CSS/column-gap#Flex_layout4. Кажется, полностью или частично поддерживается — caniuse.com/#search=column-gap
5. @Yas’ka зачем все усложнять, просто используйте псевдоселекторы, вы можете сделать
.element:not(:first-child) { margin-left: whatever }
Ответ №1:
Вы можете использовать flex со column-gap
свойством.
Кроме того, настройка justify-content: space-between
обеспечит равномерное пространство между элементами, если ширина родительского контейнера увеличится.
.container {
display: flex;
column-gap: 20px;
justify-content: space-between;
}
.element {
background: yellow;
}
<div class="container">
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
</div>
Ответ №2:
Контейнер не имеет фиксированной ширины (я использую max-width: max-content;) и может содержать столько элементов, сколько я хочу.
Вы можете использовать inline-flex
контейнер, потому что встроенные элементы будут соответствовать его содержимому и останутся в одной строке.
Мне нужен интервал между этими элементами, но не нужен интервал слева и справа между элементом и контейнером.
Вы можете установить, скажем, a margin: 10px
для элементов flex, а затем установить margin-left: 0
для первого элемента flex и margin-right: 0
для последнего элемента flex — смотрите демонстрацию ниже:
body {
margin: 0;
}
.container {
display: inline-flex;
background: cadetblue;
}
.element {
margin: 10px;
background: pink;
padding: 5px;
}
.element:first-child {
margin-left: 0;
}
.element:last-child {
margin-right: 0;
}
<div class="container">
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
</div>
Ответ №3:
Используйте подход, противоположный тому, который вы уже предложили. Задайте для всех элементов, кроме первого, оставшееся поле.
Затем вы можете использовать селектор родственных элементов:
.container {
display: inline-flex;
border: solid 1px red;
}
.element {
background: yellow;
}
.element .element {
margin-left: 20px;
}
<div class="container">
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
<div class="element">my element</div>
</div>
Ответ №4:
Я нашел макет CSS с несколькими столбцамиhttps://www.w3schools.com/CSS/css3_multiple_columns.asp , это, вероятно, то, что я искал.
Комментарии:
1. Нет, макет с несколькими столбцами позволит вам распределять текст по нескольким столбцам, а не по разделам. Ответ @kukkuz — это правильный путь.