CSS 动态响应式列布局

标签 css dynamic-columns

我一直在寻找答案,但找不到任何能解决我问题的东西。

我有一个包含动态内容的网站。我想要的是尽可能让内容流入列中,以最大限度地减少滚动。

元素具有动态高度。

  xxx item 1 xxx  |  xxx item 4 xxx
  xxxxxxxxxxxxxx  |  xxxxxxxxxxxxxx
  xxxxxxxxxxxxxx  |------------------
------------------|  xxx item 5 xxx
  xxx item 2 xxx  |  xxxxxxxxxxxxxx
  xxxxxxxxxxxxxx  |------------------
------------------|  xxx item 6 xxx
  xxx item 3 xxx  |  xxxxxxxxxxxxxx
  xxxxxxxxxxxxxx  |  xxxxxxxxxxxxxx

但是当浏览器窗口调整大小时,我想把内容放在一个列表中,所以一个单列表。

我知道媒体查询,但我应该如何配置它以便在窗口足够宽时它流入 2 列布局?

同样重要的是元素(下面 HTML 中的“组”div)不要在底部分成两半。

内容HTML(动态数据使用KnockoutJS,由于groupsContainer中的foreach属性,groupsContainer中的内容重复):

<div data-bind="foreach: $data.groups" class="groupsContainer">
    <div class="group">
        <div data-bind="text: $data.name" class="groupTitle"></div>
        <table data-bind="foreach: $data.fields" class="fieldsContainer">
            <tr>
                <td data-bind="text: $data.name" class="fieldName"></td>
                <td data-bind="template: { name: $data.typeId, data: $data}" class="fieldValue"></td>
                <td class="valueChanged" data-bind="if:$data.valueChanged"><img
                    src="resources/images/control-state-edited.png" /></td>
            </tr>
        </table>
    </div>
</div>

CSS:

.groupsContainer {
    -webkit-column-width: 20em;
    -webkit-column-gap: 2em;
    -webkit-column-rule: 1px solid #eee;
    -webkit-column-count: 2;
    -moz-column-width: 20em;
    -moz-column-gap: 2em;
    -moz-column-rule: 1px solid #eee;
    -moz-column-count: 2;
    -ms-column-width: 20em;
    -ms-column-gap: 2em;
    -ms-column-rule: 1px solid #eee;
    -ms-column-count: 2;
    column-width: 20em;
    column-gap: 2em;
    column-rule: 1px solid #eee;
    column-count: 2;
}

最佳答案

虽然您使用的是元素而不是文本 - 下面仍然有效,只需将元素包装到一个应用了下面 CSS 的容器中(将 div 替换为 id或此容器的 class)。

请看下面的内容 - 这些列将自动压缩为较小的屏幕尺寸,无需媒体查询。

Demo Fiddle

CSS:

html, body {
    width:100%;
}
div {
    -webkit-column-width: 20em;
    -webkit-column-gap: 2em;
    -webkit-column-rule: 1px solid #eee;
    -webkit-column-count: 2;
    -moz-column-width: 20em;
    -moz-column-gap: 2em;
    -moz-column-rule: 1px solid #eee;
    -moz-column-count: 2;
    -ms-column-width: 20em;
    -ms-column-gap: 2em;
    -ms-column-rule: 1px solid #eee;
    -ms-column-count: 2;
    column-width: 20em;
    column-gap: 2em;
    column-rule: 1px solid #eee;
    column-count: 2;
}

Alternatively- with Media Queries

如果你想要更多的控制——你可以简单地使用媒体查询来应用大于指定大小的列(小于 1024)

html, body {
    width:100%;
}
@media screen and (min-width: 1024px){
    div {
        -webkit-column-width: 20em;
        -webkit-column-gap: 2em;
        -webkit-column-rule: 1px solid #eee;
        -webkit-column-count: 2;
        -moz-column-width: 20em;
        -moz-column-gap: 2em;
        -moz-column-rule: 1px solid #eee;
        -moz-column-count: 2;
        -ms-column-width: 20em;
        -ms-column-gap: 2em;
        -ms-column-rule: 1px solid #eee;
        -ms-column-count: 2;
        column-width: 20em;
        column-gap: 2em;
        column-rule: 1px solid #eee;
        column-count: 2;
    }
}

防止元素在列之间中断

为避免元素在列之间被打断,您可以使用以下内容:

.group{ /* class to restrict breaking on */
    break-inside: avoid-column;
    -webkit-column-break-inside: avoid;
    page-break-inside: avoid;
    overflow: hidden; /* optional */
    display:inline-block; /* optional */
}

也就是说,请注意浏览器之间的功能支持可能是不完整的,如果它没有按预期工作,请将 display:inline-block; 替换为 display:table; 或完全删除。

关于CSS 动态响应式列布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23560796/

相关文章:

c# - WPF MVVM 动态列多线程

python - python中相同列名的自动前导零

join - 出现重复值时在sql server 2014中创建动态列

html - 如何在此菜单中添加粗体?

javascript - 只关注第一个元素

javascript - jQuery RS Carousel - 重命名 rs-carousel div

python - 使用 Python 和 Beautiful Soup 仅从页面上的 div 标签中提取文本

Java网格布局: variable column count depending on Panel width

java - 如何获取 <p :column> in a facelet using EL 的嵌套组件

html - 让我的文字覆盖背景图片