- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想找到一种方法,在单个容器中将元素包装到一条与前一行相反的新行中,就像一条蛇自己 flex 一样。我无法使用flexbox以及flex-direction和flex-wrap属性的任何组合来实现此结果。
flexbox结果与期望结果的图像比较:
这是显示flexbox结果与期望结果(伪造)的摘要:
body {
font: 400 14px 'Arial', sans-serif;
}
.title {
font-size: 1em;
padding: 20px 0;
}
.title:first-child {
padding: 0 0 20px;
}
.flex-container, .fake-container, .fake-row {
width: 500px;
background: orange;
display: flex;
}
.flex-container {
flex-flow: row wrap; /* any combination of row/reverse & wrap/reverse */
}
.item {
display: inline-block;
background: purple;
width: 80px;
max-width: 80px;
height: 80px;
margin: 10px;
line-height: 80px;
color: white;
font-weight: bold;
font-size: 2em;
text-align: center;
}
.fake-container {
flex-flow: column nowrap;
}
.fake-row {
flex-flow: row wrap;
height: 100px;
}
.fake-row:nth-child(2) {
flex-flow: row-reverse wrap;
}
<div class="title">Flexbox result:</div>
<div class="flex-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
</div>
<div class="title">Desired result (faked):</div>
<div class="fake-container">
<div class="fake-row">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
<div class="fake-row">
<div class="item">6</div>
<div class="item">7</div>
</div>
</div>
最佳答案
CSS网格解决方案similar to this one,每行处理固定数量的元素(也称为固定列数)。
.flex-container {
width: 500px;
background: orange;
display: grid;
grid-template-columns:repeat(5,1fr); /*define the number of column*/
grid-auto-flow:dense; /* this is important to fill all the space*/
grid-gap:20px;
padding:10px;
}
.item {
background: purple;
height: 80px;
line-height: 80px;
color: white;
font-weight: bold;
font-size: 2em;
text-align: center;
}
.item:nth-child(10n + 6) {grid-column:5}
.item:nth-child(10n + 7) {grid-column:4}
.item:nth-child(10n + 8) {grid-column:3}
.item:nth-child(10n + 9) {grid-column:2}
/*.item:nth-child(10n + 10) {grid-column:1} not needed*/
/* For N = number of columns
.item:nth-child((2xN)n + (N+1)) { grid-column:N; }
.item:nth-child((2xN)n + (N+2)) { grid-column:(N-1); }
....
.item:nth-child((2xN)n + (2xN)) { grid-column:1; }
*/
.item:before {
content:counter(num);
counter-increment:num;
}
body {
font: 400 14px 'Arial', sans-serif;
counter-reset:num;
}
<div class="flex-container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
order
属性。我将依靠
this old answer进行大部分计算,以便找到行数/列数:
//total number of element
var elems = document.querySelectorAll('.item');
var n_t = elems.length;
//width of an element
var w = parseInt(document.querySelector('.item').offsetWidth);
//full width of element with margin
var m = document.querySelector('.item').currentStyle || window.getComputedStyle(document.querySelector('.item'));
w = w + parseInt(m.marginLeft) + parseInt(m.marginRight);
//width of container
var w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//padding of container
var c = document.querySelector('.flex-container').currentStyle || window.getComputedStyle(document.querySelector('.flex-container'));
var p_c = parseInt(c.paddingLeft) + parseInt(c.paddingRight);
var adjust = function(){
//only the width of container will change
w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//Number of columns
nb = Math.min(parseInt((w_c - p_c) / w),n_t);
//Number of rows
nc = Math.ceil(n_t/nb);
for(var j = 0;j<nb;j++) {
for(var i = 0;i<nc;i++) {
if(j + i*nb >= n_t) /* we exit if we reach the number of elements*/
break
if(i%2!=1)
elems[j + i*nb].style.order=j + i*nb; /* normal flow */
else
elems[j + i*nb].style.order=(nb - j) + i*nb; /* opposite flow */
}
}
}
adjust()
window.addEventListener('resize', function(){adjust()})
.flex-container {
background: orange;
display: flex;
flex-wrap:wrap;
}
.item {
background: purple;
height: 80px;
width:80px;
margin:10px;
line-height: 80px;
grid-gap:20px;
color: white;
font-weight: bold;
font-size: 2em;
text-align: center;
}
.item:before {
content:counter(num);
counter-increment:num;
}
body {
font: 400 14px 'Arial', sans-serif;
counter-reset:num;
}
<div class="flex-container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
//total number of element
var elems = document.querySelectorAll('.item');
var n_t = elems.length;
//width of an element
var w = parseInt(document.querySelector('.item').offsetWidth);
//full width of element with margin
var m = document.querySelector('.item').currentStyle || window.getComputedStyle(document.querySelector('.item'));
w = w + parseInt(m.marginLeft) + parseInt(m.marginRight);
//width of container
var w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//padding of container
var c = document.querySelector('.flex-container').currentStyle || window.getComputedStyle(document.querySelector('.flex-container'));
var p_c = parseInt(c.paddingLeft) + parseInt(c.paddingRight);
var adjust = function(){
//only the width of container will change
w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//Number of columns
nb = Math.min(parseInt((w_c - p_c) / w),n_t);
//Number of rows
nc = Math.ceil(n_t/nb);
for(var j = 0;j<nb;j++) {
for(var i = 0;i<nc;i++) {
if(j + i*nb >= n_t) /* we exit if we reach the number of elements*/
break
elems[j + i*nb].style.marginLeft='10px'; /*we rest the margin*/
if(i%2!=1)
elems[j + i*nb].style.order=j + i*nb; /* normal flow */
else {
elems[j + i*nb].style.order=(nb - j) + i*nb; /* opposite flow */
/*margin fix*/
if(i == (nc - 1) && (j + i*nb == (n_t - 1)) && j<(nb-1)) {
elems[j + i*nb].style.marginLeft=((nb*nc - n_t)*w + 10) + 'px';
}
}
}
}
}
adjust()
window.addEventListener('resize', function(){adjust()})
.flex-container {
background: orange;
display: flex;
flex-wrap:wrap;
}
.item {
background: purple;
height: 80px;
width:80px;
margin:10px;
line-height: 80px;
grid-gap:20px;
color: white;
font-weight: bold;
font-size: 2em;
text-align: center;
}
.item:before {
content:counter(num);
counter-increment:num;
}
body {
font: 400 14px 'Arial', sans-serif;
counter-reset:num;
}
<div class="flex-container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
if(i%2!=1)
更改为
if(i%2!=0)
,即可轻松切换到其他方向
//total number of element
var elems = document.querySelectorAll('.item');
var n_t = elems.length;
//width of an element
var w = parseInt(document.querySelector('.item').offsetWidth);
//full width of element with margin
var m = document.querySelector('.item').currentStyle || window.getComputedStyle(document.querySelector('.item'));
w = w + parseInt(m.marginLeft) + parseInt(m.marginRight);
//width of container
var w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//padding of container
var c = document.querySelector('.flex-container').currentStyle || window.getComputedStyle(document.querySelector('.flex-container'));
var p_c = parseInt(c.paddingLeft) + parseInt(c.paddingRight);
var adjust = function(){
//only the width of container will change
w_c = parseInt(document.querySelector('.flex-container').offsetWidth);
//Number of columns
nb = Math.min(parseInt((w_c - p_c) / w),n_t);
//Number of rows
nc = Math.ceil(n_t/nb);
for(var j = 0;j<nb;j++) {
for(var i = 0;i<nc;i++) {
if(j + i*nb >= n_t) /* we exit if we reach the number of elements*/
break
elems[j + i*nb].style.marginLeft='10px'; /*we rest the margin*/
if(i%2!=0)
elems[j + i*nb].style.order=j + i*nb; /* normal flow */
else {
elems[j + i*nb].style.order=(nb - j) + i*nb; /* opposite flow */
/*margin fix*/
if(i == (nc - 1) && (j + i*nb == (n_t - 1)) && j<(nb-1)) {
elems[j + i*nb].style.marginLeft=((nb*nc - n_t)*w + 10) + 'px';
}
}
}
}
}
adjust()
window.addEventListener('resize', function(){adjust()})
.flex-container {
background: orange;
display: flex;
flex-wrap:wrap;
}
.item {
background: purple;
height: 80px;
width:80px;
margin:10px;
line-height: 80px;
grid-gap:20px;
color: white;
font-weight: bold;
font-size: 2em;
text-align: center;
}
.item:before {
content:counter(num);
counter-increment:num;
}
body {
font: 400 14px 'Arial', sans-serif;
counter-reset:num;
}
<div class="flex-container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
关于html - Flexbox:自动换行方向/ "Snake Wrap",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481712/
我创建了一个包含社交图标的列表。这些图标应该环绕在小屏幕上。 我使用 flex-wrap: wrap; 它在 Firefox 和 Chrome 中完美运行: 但是 Internet Explorer
我很惊讶地发现我的 white-space: pre-wrap;文本在 > 换行和 "人物。我以为它只会换行,- , 以及一个或多个空格之后。 这是一个fiddle . 它在" 之后换行, 在
我被分配了重新创建以下网站的任务:https://plantanapp.com/learn 我做了一些事情,但是每次我解决一个问题时,都会出现另外两个问题。 我是HTML和CSS的新手,并不真正了解元
我偶然发现了 jQuery 的 wrap() 函数。 当我试图包装两个 div 标签时,它们之间有一些文本,而不是两个 div 之间没有文本时,它的行为不知何故不同。 j查询: var wrapper
我正在尝试在 w3c css 验证器上验证一个 css 文件。当它被测试时,它返回一个错误,指出 “属性 flex-wrap- 不存在:wrap”。这是我 css 验证器认为错误的部分。 .row {
这个问题在这里已经有了答案: Flex items create space between them when they wrap [duplicate] (1 个回答) 关闭 6 年前。 我正在
我正在制作一个网页,其中的标题有一个主要主题和一个描述符,每个都包含在标签中。 我已经查找了 标签,它似乎只在你有长字符串时才有效没有空格。但是我在文本中断断续续地有空格。 我需要的是我可以在两个元
我听到很多关于 wrap 面板加载速度较慢的消息,因此我们需要一个虚拟化面板。 有人可以给我一个小的环绕面板示例,它可以证明加载速度较慢等它需要一个虚拟面板。 我设置了一个环绕面板作为列表框的面板控件
我需要用 sinon 多次包装一个方法,以便能够根据参数返回不同的对象。我该怎么做? 我要测试的 Controller 看起来像这样: const servicePackagesOfferingRep
我在运行测试时收到了上述错误消息。下面是我的代码(我正在使用 Backbone JS 和 Jasmine 进行测试)。有谁知道为什么会这样? $(function() { describe("Ca
问题是关于.text-wrapper,它有display:flex; flex-wrap:wrap 应用于它。使用 flex-wrap:wrap 的原因是,否则 .text-wrapper 和 .ta
我有三个带有 Bootstrap 3 的 DIV 容器,其中前两个在第一行,第三个在下一行,直到浏览器宽度直到 991 px。高于 992 px,所有三个容器应排成一行。每行容器的高度应该是最高的 (
(我使用的是 Chrome v.39+) 我正在尝试使用 flex-wrap 属性水平和垂直堆叠子 div,但我看到了一些非常奇怪的行为。例如,如果有 3 个子 div,最后一个的宽度为 100%(使
我必须这样做。适用于宽屏、中屏和小屏 https://pp.vk.me/c629328/v629328337/21bd7/izp9QG8Qcg4.jpg 这是我的代码 .section-items-c
我想要一个每行 3 个元素的容器 flex div,问题是当我添加第四个元素时(它应该自动换行到第二行),而不是它停留在一行并缩小其他元素。我启用了 flex-wrap: wrap; 这是我的代码:
假设我正在使用一个带有 flex-direction:row 和 flex-wrap:wrap 的 flexbox 容器。 根据浏览器窗口的大小,每行中可能有 2、3、4 或更多项。 我想在每隔一行的
我已经添加了所有属性。当我更改浏览器宽度时,它们开始相互粘连,这是因为我有太多图像而无法正常工作? 无法将图像换行: #skills>div { margin-top: 80px; displ
我想制作一个网格,其中每行有两张图片。我正在使用 flex-wrap: wrap;它在 android 4.4+ 上运行良好,但不适用于低于 android 4.4 的系统。我想在不使用 flex-w
我的网站出现异常行为。我最近在网站管理员工具上发现,它发现我网站上的许多网页都出现抓取错误 404。我无法理解这些页面是如何创建的,因为所有 404 页面最后都包含这几个字 wrap-function
我正在使用 MongoDB C# 驱动程序构建一些更新语句。 The C# API在 Builder 命名空间中包括 Wrapped 和“Un-Wrapped”方法。 从表面上看,这些似乎因泛型不同而
我是一名优秀的程序员,十分优秀!