【问题标题】:How can I lay out divs in swimlanes using html/css?如何使用 html/css 在泳道中布置 div?
【发布时间】:2019-09-19 00:49:34
【问题描述】:

我正在开发类似于看板的东西,我在列中(也由 div 表示)布置卡片(由 div 表示)。图 1 说明了我的应用的当前状态:

每张卡片都是一个 div。这些卡片按列(红色虚线)分组,这些列是在 flexbox 布局中布局的 div。着色说明了卡片映射到哪个版本。

一些代码: index.html:

<!doctype html>
<html>
<head>
    <title>Some code to copy & paste into your project</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="map">
        <div class="column">
            <div class="card release-1"></div>
            <div class="card release-2"></div>
            <div class="card release-3"></div>
        </div>
        <div class="column">
            <div class="card release-1"></div>
            <div class="card release-1"></div>
            <div class="card release-3"></div>
            <div class="card release-3"></div>
        </div>
        <div class="column">
            <div class="card release-2"></div>
            <div class="card release-2"></div>
            <div class="card release-3"></div>
            <div class="card release-3"></div>
        </div>
    </div>
</body>
</html>

styles.css:

.map {
    display: flex;
    flex-direction: row;
}

.column {
    display: flex;
    flex-direction: column;

}

.card {
    width: 100px;
    height: 80px;
    border: 1px solid black;
    margin: 10px;
}

.release-1 {
    background-color: #f90;
}

.release-2 {
    background-color: #0a0;
}

.release-3 {
    background-color: #0af;
}

现在我想为发布添加泳道。结果应如下所示:

我没有找到任何方法将“断点”之类的内容放入弹性列中以将卡片移动到下一个泳道。

网格可以工作,但我需要事先知道我将拥有多少列和泳道。由于地图是动态渲染的,我也需要动态渲染 css。看起来对我来说不是最好的方法:-P

很明显,这可以通过 html 表格完成,但有两个原因使我无法使用它们:

  1. 在基于 div 和 css 的浮动布局取代表格布局的时代,我了解到表格只能用于数据,不能用于布局
  2. 我的整个布局已经基于 div。切换到表格需要我想避免的重大努力

支持表格的事实是,用表格实现这种布局非常容易。我也不希望有任何负面影响,因为这种布局无论如何都不意味着浮动或中断。它只是两个固定尺寸,视口之外的所有内容都会滚动。

无论如何:在我重新编写所有内容之前,我想知道这是否也可以通过 flex/flexbox 布局或任何其他我还没有听说过的方式来实现。

现在我没有使用前端框架,只是简单的 html 和 css。我想 尽可能保持这种状态。

你有什么建议吗?

提前致谢! 弗雷德

【问题讨论】:

  • FWIW - CSS-Grid 将是要走的路。
  • 你的 Github 模拟对理解没有任何帮助
  • @yuzen:这就是我一开始没有发布它的原因。我刚刚添加了它,因为似乎 stackoverflow 法律要求我在获得好的建议之前发布一个不好的方法。
  • 所以我添加了一些你可以c&p到你自己的项目的代码。我猜你们脑子里已经有了相同的代码,因为你们似乎都是真正的专业人士。我还解释了为什么网格不是我最喜欢的解决方案。

标签: html css layout flexbox css-grid


【解决方案1】:

朝这个方向发展?

document.querySelector('.toggle-lanes')
  .addEventListener('click', toggleLanes)

function toggleLanes(e) {
document.querySelector('.toggle-lanes-target').classList.toggle('lanes')
  
}
:root {
  --column: 1;
  --release: 1;
}

.cards {
  display: grid;
  grid-auto-columns: 1fr;
  grid-auto-rows: auto;
  grid-auto-flow: row dense;
}
.cards .card {
  padding: 20px;
  box-sizing: border-box;
  border-radius: 20px;
  border: 3px solid silver;
  border: 1px solid silver;
  background-color: gold;
  grid-column-start: var(--column);
}
.cards .card.release-1 {
  background-color: orange;
}
.cards .card.release-2 {
  background-color: green;
}
.cards .card.release-3 {
  background-color: blue;
}

.cards.lanes {
  grid-auto-flow: column dense;
}
.cards.lanes .card {
  grid-row-start: calc(var(--release) * 1000 + var(--num));
}

.card[style*="--release:1"],
.card[style*="--release: 1"] {
  background-color: orange;
}

.card[style*="--release:2"],
.card[style*="--release: 2"] {
  background-color: green;
}

.card[style*="--release:3"],
.card[style*="--release: 3"] {
  background-color: blue;
}
<button class="toggle-lanes">Click to toggle swimming lanes</button>

<div class="cards toggle-lanes-target">
  <div class="card" style="--column: 1; --release: 1; --num: 1">C1 R1 A</div>
  <div class="card" style="--column: 2; --release: 1; --num: 1">C2 R1 B</div>
  <div class="card" style="--column: 2; --release: 1; --num: 2">C2 R1 C</div>
  <div class="card" style="--column: 1; --release: 2; --num: 1">C1 R2 D</div>
  <div class="card" style="--column: 3; --release: 2; --num: 1">C3 R2 E</div>
  <div class="card" style="--column: 3; --release: 2; --num: 2">C3 R2 F</div>
  <div class="card" style="--column: 1; --release: 3; --num: 1">C1 R3 G</div>
  <div class="card" style="--column: 2; --release: 3; --num: 1">C2 R3 H</div>
  <div class="card" style="--column: 2; --release: 3; --num: 2">C2 R3 I</div>
  <div class="card" style="--column: 3; --release: 3; --num: 1">C3 R3 J</div>
  <div class="card" style="--column: 3; --release: 3; --num: 2">C3 R3 J</div>
</div>

使用 CSS 自定义属性有助于解决无限列/行问题

唯一的小困难在于--num属性值的计算。这基本上是计算具有相同 --column--release 值的卡片。

只有在您使用无限多个版本时才需要动态样式表。

【讨论】:

  • 这是一个非常酷的方法!非常感谢!不幸的是,由于我没有足够的声誉,所以我无法投票:-P 将来的某一天可能会被计算在内……
  • @Fred 你可以接受答案:点击投票下方的灰色棋子标记,它会变成绿色。我会得到 15 分,你会得到 2 分。
  • @Fred BTW 在我的示例中,您不能将grid-gap0 之外的任何其他值一起使用。
【解决方案2】:

感谢@yunzen 的帮助,我想出了一个解决方案。基本上,这一切都归结为将版本放在一个网格中。卡片将在释放容器中找到它们的位置。

这种方法的缺点是,部分 CSS 需要根据网格中的列数和发布数动态生成。但与@yunzen 的答案相比,它更容易理解代码。

最小解决方案

HTML:

<!doctype html>
<html>
<head>
    <title>Grid</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="map">

        <div class="release column-1 release-1">
            <div class="card"></div>
        </div>
        <div class="release column-1 release-2">
            <div class="card"></div>
        </div>
        <div class="release column-1 release-3">
            <div class="card"></div>
        </div>

        <div class="release column-2 release-1">
            <div class="card"></div>
            <div class="card"></div>
        </div>
        <div class="release column-2 release-3">
            <div class="card"></div>
            <div class="card"></div>
        </div>

        <div class="release column-3 release-2">
            <div class="card"></div>
            <div class="card"></div>
        </div>
        <div class="release column-3 release-3">
            <div class="card"></div>
            <div class="card"></div>
        </div>

    </div>
</body>
</html>

CSS:

/* STATIC */

.map {
    display: grid;
    grid-auto-columns: min-content;
    grid-auto-rows: min-content;
}

.card {
    width: 100px;
    height: 80px;
    border: 1px solid black;
    margin: 10px;
}

/* DYNAMIC */

.column-1 {
    grid-column-start: 1;
    grid-column-end: 2;
}

.column-2 {
    grid-column-start: 2;
    grid-column-end: 3;
}

.column-3 {
    grid-column-start: 3;
    grid-column-end: 4;
}

.release-1 {
    grid-row-start: 1;
    grid-row-end: 2;
}

.release-2 {
    grid-row-start: 2;
    grid-row-end: 3;
}

.release-3 {
    grid-row-start: 3;
    grid-row-end: 4;
}

/* DEBUG */

.release-1 .card {
    background-color: #f90;
}

.release-2 .card {
    background-color: #0a0;
}

.release-3 .card {
    background-color: #0af;
}

带列容器

因为我想保留我的列容器,所以我扩展了上面的代码:

HTML:

<!doctype html>
<html>
<head>
    <title>Grid with Columns</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="map">

        <div class="column column-1">
            <div class="release release-1">
                <div class="card"></div>
            </div>
            <div class="release release-2">
                <div class="card"></div>
            </div>
            <div class="release release-3">
                <div class="card"></div>
            </div>
        </div>

        <div class="column column-2">
            <div class="release release-1">
                <div class="card"></div>
                <div class="card"></div>
            </div>
            <div class="release release-3">
                <div class="card"></div>
                <div class="card"></div>
            </div>
        </div>

        <div class="column column-3">
            <div class="release release-2">
                <div class="card"></div>
                <div class="card"></div>
            </div>
            <div class="release release-3">
                <div class="card"></div>
                <div class="card"></div>
            </div>
        </div>

    </div>
</body>
</html>

CSS:

/* STATIC */

.map {
    display: grid;
    grid-auto-columns: min-content;
    grid-auto-rows: min-content;
}

.column {
    display: contents;
}

.card {
    width: 100px;
    height: 80px;
    border: 1px solid black;
    margin: 10px;
}

/* DYNAMIC */

.column-1 .release {
    grid-column-start: 1;
    grid-column-end: 2;
}

.column-2 .release {
    grid-column-start: 2;
    grid-column-end: 3;
}

.column-3 .release {
    grid-column-start: 3;
    grid-column-end: 4;
}

.release-1 {
    grid-row-start: 1;
    grid-row-end: 2;
}

.release-2 {
    grid-row-start: 2;
    grid-row-end: 3;
}

.release-3 {
    grid-row-start: 3;
    grid-row-end: 4;
}

/* DEBUG */

.release-1 .card {
    background-color: #f90;
}

.release-2 .card {
    background-color: #0a0;
}

.release-3 .card {
    background-color: #0af;
}

其中最有趣的部分是“显示:内容;”对于列容器。 Browser support is still bad for this feature,所以我可能需要回到第一个示例。如果您想了解更多信息,请look here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多