html - 将可变宽度网格居中,同时将其元素左对齐

标签 html css alignment

考虑以下问题

<div class="container">
     <div class="grid">
         <div class="unit"></div>
         <div class="unit"></div>
         <div class="unit"></div>
         <div class="unit"></div>
         <div class="unit"></div>
         <div class="unit"></div>
          ....
      </div>
</div>

使用图像,基本上我有这样的东西

enter image description here

如您所见,绿色 block 和容器向左对齐

我想要实现的是这样的。

enter image description here

.unit 元素具有恒定宽度

.grid 元素应随宽度扩展(以便更多的 unit 元素适合 1 行),同时始终在 .container 中居中>.

任何线索如何仅使用 CSS(如果需要,可能还有一些 html 包装器)实现这一目标?

最佳答案

首先让我说这是一个有趣的问题,我的第一个想法是 flexbox 是解决这个问题的方法。我已经尝试过各种 flexbox 安排,但这种解决方案让我望而却步。因此,下面是使用 float 查询、清除查询和媒体查询的解决方案。

对于此示例,我假设每行至少有 3 个且不超过 9 个框。但是,您可以扩展此解决方案以处理 1 到 9 个以上的盒子。

这是 HTML:

<div class="grid">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>

这是一个 CSS,它 (1) 执行一个小型重置以消除浏览器应用的可能会干扰大小调整的填充和边距,以及 (2) 格式化 .grid 及其 div children :

* {
    margin: 0;
    padding: 0;
}

.grid {
    display: table;
    outline: 1px solid blue;
    min-width: 330px;
    margin: 0 auto;
}

.grid > div {
    width: 100px;
    height: 61px;
    margin: 5px;
    background-color: teal;
    float: left;
}

.container block 已被删除,因为 .grid 显示为表格。后者是一个围绕其子项收缩包裹的 block ,可以应用 margin: 0 auto 使其在页面上居中。 .gridmin-width 为 330px,确保每行至少可以容纳三个 block 。每当在 table 元素内发生 float 时,它的边距都不会折叠,因此不需要显式清除 float (例如,通过 clearfix)。

每个 .grid div 子级占用 110px 的水平空间(100px 宽度 + 10px 左右边距)。这个数字对于下面的媒体查询代码很重要:

@media screen and (min-width: 330px) and (max-width: 439px) {
    .grid > div:nth-of-type(3n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 440px) and (max-width: 549px) {
    .grid > div:nth-of-type(4n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 550px) and (max-width: 659px) {
    .grid > div:nth-of-type(5n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 660px) and (max-width: 769px) {
    .grid > div:nth-of-type(6n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 770px) and (max-width: 879px) {
    .grid > div:nth-of-type(7n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 880px) and (max-width: 989px) {
    .grid > div:nth-of-type(8n + 1) {
        clear: left;
    }
}

@media screen and (min-width: 990px) {
    .grid > div:nth-of-type(9n + 1) {
        clear: left;
    }    
}

代码背后的基本原理是这样的:如果有足够的空间每行只包含 n 个 block ,那么每第 (n + 1) 个 block 的左边缘都会被清除,这会将 block 移动到新的一行。

还有,这是一个 fiddle :http://jsfiddle.net/5hWXw/ .调整预览窗口的大小以查看调整。

关于html - 将可变宽度网格居中,同时将其元素左对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728772/

相关文章:

javascript - 进度条使用样式更新进度

javascript - Ext-js : How to resize/close browser window?

html - CSS:创建 Material 设计阴影问题

html - 如何制作水平描述列表?

html - 一种将 TD 置于 TR 中心的方法?

c - 此代码如何将指针对齐到 64 位边界?

php - jQuery 将每个 PHP 响应视为状态为 0

jquery - 如何动画/显示隐藏的 div?

php - 从数据库值填充下拉列表

css - 如何使 float 元素列表跳过居中元素(书脊对齐/中心标记)?