Я хочу создать временную шкалу, которая будет содержать элементы div, представляющие периоды времени. Я столкнулся с проблемой. При использовании grid-auto-flow: column
, чтобы сделать все элементы div горизонтальными, промежутки между элементами div очень велики.
.timelineBox {
border: 1px solid red;
}
.timelineBox>.timeline>div.main {
height: 50px;
display: grid;
grid-auto-flow: column;
grid-gap: 0px;
}
._1 {
background-color: red;
}
._2 {
background-color: blue;
}
._3 {
background-color: lime;
}
._4 {
background-color: purple;
}
.timelineBox>.timeline>div.main>div {
height: 100%;
}
<div class='timelineBox'>
<div ident='tl1' class='timeline'>
<div class='main'>
<div style='width: 5px;' class='_1'>
</div>
<div style='width: 120px;' class='_2'>
</div>
</div>
</div>
</div>
Как уменьшить этот зазор без изменения размера родительского div?
ТД;ДР: Как сделать div палка друг к другу при использовании grid-auto-flow: column
?
Вы можете просто использовать justify-content: flex-start
, чтобы выровнять все элементы сетки слева от сетка-контейнер — см. демонстрацию ниже:
.timelineBox {
border: 1px solid red;
}
.timelineBox>.timeline>div.main {
height: 50px;
display: grid;
justify-content: flex-start;
grid-auto-flow: column;
grid-gap: 0px;
}
._1 {
background-color: red;
}
._2 {
background-color: blue;
}
._3 {
background-color: lime;
}
._4 {
background-color: purple;
}
.timelineBox>.timeline>div.main>div {
height: 100%;
}
<div class='timelineBox'>
<div ident='tl1' class='timeline'>
<div class='main'>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
</div>
</div>
</div>
Но здесь у вас больше возможностей, потому что вы не указали grid-template-columns
свойство, с которым имеете дело неявные сетки. Ширина рассчитанный для элементы сетки, которую вы видите, обусловлена свойством по умолчанию grid-auto-columns: auto
, которое обрабатывает размер столбцы сетки для неявные сетки.
Таким образом, вы можете указать grid-auto-columns: min-content
, как показано ниже, для достижения того же результата:
.timelineBox {
border: 1px solid red;
}
.timelineBox>.timeline>div.main {
height: 50px;
display: grid;
grid-auto-flow: column;
grid-auto-columns: min-content; /* ADDED */
grid-gap: 0px;
}
._1 {
background-color: red;
}
._2 {
background-color: blue;
}
._3 {
background-color: lime;
}
._4 {
background-color: purple;
}
.timelineBox>.timeline>div.main>div {
height: 100%;
}
<div class='timelineBox'>
<div ident='tl1' class='timeline'>
<div class='main'>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
</div>
</div>
</div>
Вы можете прочитать больше о Implicit and Explicit Grids here
.
В другом варианте используйте встроенная сетка — автоматическое размещение элементов сетки теперь будет занимать столько же ширины, сколько и его содержимое:
.timelineBox {
border: 1px solid red;
}
.timelineBox>.timeline>div.main {
height: 50px;
display: inline-grid; /* changed to inline*/
vertical-align: top; /* align inline element */
grid-auto-flow: column;
grid-gap: 0px;
}
._1 {
background-color: red;
}
._2 {
background-color: blue;
}
._3 {
background-color: lime;
}
._4 {
background-color: purple;
}
.timelineBox>.timeline>div.main>div {
height: 100%;
}
<div class='timelineBox'>
<div ident='tl1' class='timeline'>
<div class='main'>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
<div style='width: 5px;' class='_1'></div>
<div style='width: 120px;' class='_2'></div>
</div>
</div>
</div>
Вы можете увидеть хороший example of using inline grids here
.
Спасибо. Очень полный ответ. Я знал о min-content
, потому что делал то же самое около года назад. Просто забыл, что он существует :) Опять же. Спасибо.
justify-content: flex-start;
?