重新排序不同容器中的 html 个元素
Reordering html elements within different containers
我尝试按照特定逻辑重新排序我的项目,但无法使用 css 网格完成。
我有这个 html 结构:
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
在桌面上,行水平显示,因此看起来像这样:
ITEM 1 | ITEM 4 | ITEM 7
ITEM 2 | ITEM 5 | ITEM 8
ITEM 3 | ITEM 6 | ITEM 9
现在我想实现的是当行垂直显示时在移动设备上跟随:
ITEM 1
ITEM 4
ITEM 7
ITEM 2
ITEM 5
ITEM 8
ITEM 3
ITEM 6
ITEM 9
而且即使列中的项目更多或更少,它也必须工作。
在你问为什么我不直接按这个顺序放置项目之前,每行 3 列 :) 是因为在桌面上我需要 3 列,里面有多个项目,就像一个砖石网格。
我感谢每一个帮助,甚至是 javascript 重新排序 dom 元素的解决方案
您可以添加媒体查询(https://www.w3schools.com/css/css_rwd_mediaqueries.asp)
ul {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
list-style-type: none;
}
<html>
<head>
</head>
<body>
<nav>
<ul>
<li>Home</li>
<li>Contact us</li>
<li>Report</li>
</ul>
</nav>
</body>
</html>
使用显示作为内联和内联块,您可以更改。此外,如果您将媒体查询添加到逻辑中,布局将根据屏幕宽度发生变化。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
@media screen and (max-width: 480px) {
.row {
display: inline;
}
}
@media screen and (min-width: 480px) {
.row {
display: inline-block;
}
}
</style>
</head>
<body>
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
</body>
</html>
这个答案不能很好地扩展,但可以使用 flexbox 和 display:contents
,然后对 .row
div 的内容进行排序。
.multi-column-row {
display: flex;
flex-direction: column;
}
.multi-column-row .row {
display: contents;
}
.multi-column-row .row :nth-child(1) {
order: 1;
}
.multi-column-row .row :nth-child(2) {
order: 2;
}
.multi-column-row .row :nth-child(3) {
order: 3;
}
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
您的移动显示示例重复 ITEM 3
。我认为这是一个错误。我想一定是 ITEM 2
?!
在我的示例中,row
类被删除,然后通过媒体查询对元素进行排序。
我将所有逻辑包装在 onresize
事件中。这样做是为了直观地了解更换浏览器时的操作原理window。在生产中,它需要替换为 window onload
事件。像那样:
window.onload = function() {
...
}
js中的逻辑是从屏幕767 pixels
触发的。
这样的结果有必要吗?
window.onresize = function() {
let media = window.matchMedia("(min-width: 767px)");
let unwrap_div = document.querySelectorAll('.multi-column-row .row');
if (media.matches) {
unwrap_div.forEach(function(unwrap_div_curr) {
unwrap_div_curr.outerHTML = unwrap_div_curr.innerHTML;
})
} else {}
}
.multi-column-row {
display: flex;
flex-direction: column;
}
@media (max-width: 767px) {
.multi-column-row div:nth-child(1) {
order: 1;
}
.multi-column-row div:nth-child(2) {
order: 7;
}
.multi-column-row div:nth-child(3) {
order: 4;
}
.multi-column-row div:nth-child(4) {
order: 2;
}
.multi-column-row div:nth-child(5) {
order: 5;
}
.multi-column-row div:nth-child(6) {
order: 8;
}
.multi-column-row div:nth-child(7) {
order: 3;
}
.multi-column-row div:nth-child(8) {
order: 6;
}
.multi-column-row div:nth-child(9) {
order: 9;
}
}
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
我尝试按照特定逻辑重新排序我的项目,但无法使用 css 网格完成。 我有这个 html 结构:
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
在桌面上,行水平显示,因此看起来像这样:
ITEM 1 | ITEM 4 | ITEM 7
ITEM 2 | ITEM 5 | ITEM 8
ITEM 3 | ITEM 6 | ITEM 9
现在我想实现的是当行垂直显示时在移动设备上跟随:
ITEM 1
ITEM 4
ITEM 7
ITEM 2
ITEM 5
ITEM 8
ITEM 3
ITEM 6
ITEM 9
而且即使列中的项目更多或更少,它也必须工作。 在你问为什么我不直接按这个顺序放置项目之前,每行 3 列 :) 是因为在桌面上我需要 3 列,里面有多个项目,就像一个砖石网格。
我感谢每一个帮助,甚至是 javascript 重新排序 dom 元素的解决方案
您可以添加媒体查询(https://www.w3schools.com/css/css_rwd_mediaqueries.asp)
ul {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
list-style-type: none;
}
<html>
<head>
</head>
<body>
<nav>
<ul>
<li>Home</li>
<li>Contact us</li>
<li>Report</li>
</ul>
</nav>
</body>
</html>
使用显示作为内联和内联块,您可以更改。此外,如果您将媒体查询添加到逻辑中,布局将根据屏幕宽度发生变化。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
@media screen and (max-width: 480px) {
.row {
display: inline;
}
}
@media screen and (min-width: 480px) {
.row {
display: inline-block;
}
}
</style>
</head>
<body>
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
</body>
</html>
这个答案不能很好地扩展,但可以使用 flexbox 和 display:contents
,然后对 .row
div 的内容进行排序。
.multi-column-row {
display: flex;
flex-direction: column;
}
.multi-column-row .row {
display: contents;
}
.multi-column-row .row :nth-child(1) {
order: 1;
}
.multi-column-row .row :nth-child(2) {
order: 2;
}
.multi-column-row .row :nth-child(3) {
order: 3;
}
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>
您的移动显示示例重复 ITEM 3
。我认为这是一个错误。我想一定是 ITEM 2
?!
在我的示例中,row
类被删除,然后通过媒体查询对元素进行排序。
我将所有逻辑包装在 onresize
事件中。这样做是为了直观地了解更换浏览器时的操作原理window。在生产中,它需要替换为 window onload
事件。像那样:
window.onload = function() {
...
}
js中的逻辑是从屏幕767 pixels
触发的。
这样的结果有必要吗?
window.onresize = function() {
let media = window.matchMedia("(min-width: 767px)");
let unwrap_div = document.querySelectorAll('.multi-column-row .row');
if (media.matches) {
unwrap_div.forEach(function(unwrap_div_curr) {
unwrap_div_curr.outerHTML = unwrap_div_curr.innerHTML;
})
} else {}
}
.multi-column-row {
display: flex;
flex-direction: column;
}
@media (max-width: 767px) {
.multi-column-row div:nth-child(1) {
order: 1;
}
.multi-column-row div:nth-child(2) {
order: 7;
}
.multi-column-row div:nth-child(3) {
order: 4;
}
.multi-column-row div:nth-child(4) {
order: 2;
}
.multi-column-row div:nth-child(5) {
order: 5;
}
.multi-column-row div:nth-child(6) {
order: 8;
}
.multi-column-row div:nth-child(7) {
order: 3;
}
.multi-column-row div:nth-child(8) {
order: 6;
}
.multi-column-row div:nth-child(9) {
order: 9;
}
}
<div class="multi-column-row">
<div class="row">
<div>ITEM 1</div>
<div>ITEM 2</div>
<div>ITEM 3</div>
</div>
<div class="row">
<div>ITEM 4</div>
<div>ITEM 5</div>
<div>ITEM 6</div>
</div>
<div class="row">
<div>ITEM 7</div>
<div>ITEM 8</div>
<div>ITEM 9</div>
</div>
</div>