gpt4 book ai didi

css - 柔性 : wrapped items with same width as the rest

转载 作者:行者123 更新时间:2023-12-04 20:02:35 27 4
gpt4 key购买 nike

我正在使用 flex 创建一个多列列表,它根据容器的宽度调整列数。

我发现的问题是,如果我想通过将 flex-grow 设置为 1 来使用父级的整个宽度,最后一个换行中的元素会错位,因为它们试图填充父级。

我发现了两个对我不起作用的解决方法:一个使用了媒体查询,我不能使用它,因为父级与视口(viewport)的宽度不同;另一个使用的是 columns,但我不能使用它,因为它会导致轮廓被切断和包裹的问题,我在实际设置中遇到了这种情况。

Last two items' witdth is different

问:有没有办法让所有元素都具有相同的宽度,同时在整行中填充父级?

* {
box-sizing: border-box;
}

.wrapper {
border: 1px solid red;
width: 50%;
}

ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
margin: -1em -1em 0 0;
}

li {
border: 1px solid black;
padding: 1em;
margin: 1em 1em 0 0;
flex: 1 1 10em;
}
<div class="wrapper">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
</ul>
</div>

https://plnkr.co/edit/0u2QxcdLkDfhwV3zASrM

调整大小直到最后一行有 2 个元素。

最佳答案

添加一些额外的 flex 元素并通过将它们的高度/填充/边框设置为 0/无使它们“不可见”。根据您需要的列数,它需要少一列才能工作。

* {
box-sizing: border-box;
}

.wrapper {
border: 1px solid red;
width: 100%;
max-width: 800px;
}

ul {
list-style: none;
margin: 0;
padding: 0;

display: flex;
flex-wrap: wrap;
margin: -1em -1em 0 0;
}

li {
border: 1px solid black;
padding: 1em;
margin: 1em 1em 0 0;
flex: 1 1 10em;
}

li:nth-last-child(-n+3) {
height: 0;
border: none;
padding: 0;
margin: 0 1em 0 0;
}
<!DOCTYPE html>
<html>

<head>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>

<body>
<div class="wrapper">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>

<li></li>
<li></li>
<li></li>
</ul>
</div>
</body>

</html>


如果除额外元素外的所有元素都有内容,您也可以使用此 CSS 规则(感谢 Rick Hitchcock)

li:empty {
height: 0;
border: none;
padding: 0;
margin: 1em 1em 0 0;
}

如果列数永远不会超过 3,可以使用伪元素。 (好吧,列数可以更多,只要最后一行永远不会丢失超过 2 个元素)

* {
box-sizing: border-box;
}

.wrapper {
border: 1px solid red;
width: 100%;
max-width: 800px;
}

ul {
list-style: none;
margin: 0;
padding: 0;

display: flex;
flex-wrap: wrap;
margin: -1em -1em 0 0;
}

li {
border: 1px solid black;
padding: 1em;
margin: 1em 1em 0 0;
flex: 1 1 10em;
}

ul::before, ul::after {
content: '';
height: 0;
border: none;
padding: 0;
margin: 0 1em 0 0;
flex: 1 1 10em;
order: 999; /* they need to be last */
}
<!DOCTYPE html>
<html>

<head>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>

<body>
<div class="wrapper">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
</ul>
</div>
</body>

</html>

关于css - 柔性 : wrapped items with same width as the rest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com