居中 CSS 取决于动态内容计数的网格项目
Centre CSS Grid Items Dependent On Dynamic Content Count
我有一系列从数据库中获取的图像,当添加三个或更多图像时,它会直观地显示三列。
当出现的图像少于三个时,因为我正在使用 display: grid;
它目前在父容器的左侧对齐(在代码示例中我只是使用红色框来表示图像).
有没有办法让它在出现一两个图像时对齐到父元素的中心。我很感激我可以使用 javascript 来检测有多少图像存在,如果少于三个,添加一个 class 并将包装器更改为 display: flex
,但我想知道这样的布局是否只有 CSS 才有可能吗?
由于布局的性质,当出现三个以上的图像时,我确实需要使用 CSS 网格。
注意: 我已经注释掉了 HTML 中的两个红框,以显示只有一个红框存在时的初始问题。
代码笔:https://codepen.io/anna_paul/pen/xxXrVJQ
body {
display: flex;
justify-content: center;
margin: 0
width: 100%;
height: 100vh;
}
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-gap: 1rem;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
}
<div class="wrapper">
<div class="box"></div>
<!-- <div class="box"></div>
<div class="box"></div> -->
</div>
使用 auto
而不是 fr
并使用 align-content
解决您的问题。
body {
display: flex;
justify-content: center;
margin: 0
width: 100%;
height: 100vh;
}
.wrapper {
display: grid;
grid-template-columns: auto auto auto;
align-content : start;
/* grid-gap: 1rem; */
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
margin: 1rem ;
}
<div class="wrapper">
<div class="box"></div>
<!-- <div class="box"></div>
<div class="box"></div> -->
</div>
因为您为每个栏目使用 1fr,即使栏目没有内容,它也会占用 33% 的免费 space。您需要指定 fr
(可用 space 的分数)以外的单位:
grid-template-columns: auto auto auto;
grid-template-columns: repeat(3, auto);
grid-template-columns: repeat(3, minmax(min-content, max-content));
使用以上任何一项。 auto
和minmax(min-content, max-content)
之间有个small difference.
以下是 3 个容器的演示,分别包含 1、2 和 >3 个项目:
body {
margin: 0;
width: 100%;
height: 100vh;
}
.demo {
display: flex;
justify-content: center;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, minmax(min-content, max-content));
grid-gap: 1rem;
width: auto;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
border: 1px solid;
}
<p>Grid with one item</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
</div>
</div>
<hr>
<p>Grid with two items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
</div>
</div>
<hr>
<p>Grid with >3 items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
</div>
即使列的宽度为 0,1rem grid-gap
也会保留。因此,在您的设置中,flex 内部的网格,一个项目网格中的项目将从中心偏离 2rem(2grid-gaps)。如果这不是什么大问题,那么不用担心。
但是如果你想要精确的中心那么你需要grid-gap:0
。并在 margin: 0.5rem;
或 padding:0.5rem
等侧网格项目(.box)中使用间距来制作人工网格间隙。
body {
margin: 0;
width: 100%;
height: 100vh;
}
.demo {
display: flex;
justify-content: center;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, minmax(min-content, max-content));
width: auto;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
border: 1px solid;
margin: 0.5rem;
}
<p>Grid with one item</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
</div>
</div>
<hr>
<p>Grid with two items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
</div>
</div>
<hr>
<p>Grid with >3 items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
</div>
按如下方式操作:
.wrapper {
display: grid;
grid-auto-flow:column; /* column flow */
justify-content:center; /* center everything */
grid-gap: 1rem;
max-width: 600px;
border:1px solid;
margin:10px auto;
}
/* make sure you only have 3 columns*/
.box:nth-child(3n + 1) {grid-column:1}
.box:nth-child(3n + 2) {grid-column:2}
.box:nth-child(3n + 3) {grid-column:3}
/**/
.box {
width: 100px;
height: 100px;
background: red;
}
<div class="wrapper">
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
我有一系列从数据库中获取的图像,当添加三个或更多图像时,它会直观地显示三列。
当出现的图像少于三个时,因为我正在使用 display: grid;
它目前在父容器的左侧对齐(在代码示例中我只是使用红色框来表示图像).
有没有办法让它在出现一两个图像时对齐到父元素的中心。我很感激我可以使用 javascript 来检测有多少图像存在,如果少于三个,添加一个 class 并将包装器更改为 display: flex
,但我想知道这样的布局是否只有 CSS 才有可能吗?
由于布局的性质,当出现三个以上的图像时,我确实需要使用 CSS 网格。
注意: 我已经注释掉了 HTML 中的两个红框,以显示只有一个红框存在时的初始问题。
代码笔:https://codepen.io/anna_paul/pen/xxXrVJQ
body {
display: flex;
justify-content: center;
margin: 0
width: 100%;
height: 100vh;
}
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-gap: 1rem;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
}
<div class="wrapper">
<div class="box"></div>
<!-- <div class="box"></div>
<div class="box"></div> -->
</div>
使用 auto
而不是 fr
并使用 align-content
解决您的问题。
body {
display: flex;
justify-content: center;
margin: 0
width: 100%;
height: 100vh;
}
.wrapper {
display: grid;
grid-template-columns: auto auto auto;
align-content : start;
/* grid-gap: 1rem; */
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
margin: 1rem ;
}
<div class="wrapper">
<div class="box"></div>
<!-- <div class="box"></div>
<div class="box"></div> -->
</div>
因为您为每个栏目使用 1fr,即使栏目没有内容,它也会占用 33% 的免费 space。您需要指定 fr
(可用 space 的分数)以外的单位:
grid-template-columns: auto auto auto;
grid-template-columns: repeat(3, auto);
grid-template-columns: repeat(3, minmax(min-content, max-content));
使用以上任何一项。 auto
和minmax(min-content, max-content)
之间有个small difference.
以下是 3 个容器的演示,分别包含 1、2 和 >3 个项目:
body {
margin: 0;
width: 100%;
height: 100vh;
}
.demo {
display: flex;
justify-content: center;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, minmax(min-content, max-content));
grid-gap: 1rem;
width: auto;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
border: 1px solid;
}
<p>Grid with one item</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
</div>
</div>
<hr>
<p>Grid with two items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
</div>
</div>
<hr>
<p>Grid with >3 items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
</div>
即使列的宽度为 0,1rem grid-gap
也会保留。因此,在您的设置中,flex 内部的网格,一个项目网格中的项目将从中心偏离 2rem(2grid-gaps)。如果这不是什么大问题,那么不用担心。
但是如果你想要精确的中心那么你需要grid-gap:0
。并在 margin: 0.5rem;
或 padding:0.5rem
等侧网格项目(.box)中使用间距来制作人工网格间隙。
body {
margin: 0;
width: 100%;
height: 100vh;
}
.demo {
display: flex;
justify-content: center;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, minmax(min-content, max-content));
width: auto;
max-width: 1250px;
}
.box {
width: 200px;
height: 200px;
background: red;
border: 1px solid;
margin: 0.5rem;
}
<p>Grid with one item</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
</div>
</div>
<hr>
<p>Grid with two items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
</div>
</div>
<hr>
<p>Grid with >3 items</p>
<div class="demo">
<div class="wrapper">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
</div>
按如下方式操作:
.wrapper {
display: grid;
grid-auto-flow:column; /* column flow */
justify-content:center; /* center everything */
grid-gap: 1rem;
max-width: 600px;
border:1px solid;
margin:10px auto;
}
/* make sure you only have 3 columns*/
.box:nth-child(3n + 1) {grid-column:1}
.box:nth-child(3n + 2) {grid-column:2}
.box:nth-child(3n + 3) {grid-column:3}
/**/
.box {
width: 100px;
height: 100px;
background: red;
}
<div class="wrapper">
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="wrapper">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>