CSS 流体棘手网格

标签 css grid margin fluid

所以我的问题很简单,尽管我花了几天时间试图找到解决方案。

下面的代码显示了我用像素值得到的结果:

html 部分:

<div id="wrapper">
    <ul>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
</div>

css 部分:

#wrapper { margin:30px auto; width:768px; }
#wrapper ul { width:771px; list-style:none; list-style-type:none; padding:0; margin:0; overflow:hidden; }
#wrapper li { width:254px; height:254px; margin-right:3px; margin-bottom:3px; background:#ebebeb; float:left; }

这是一个总结以上内容的链接:http://jsfiddle.net/7aXLu/

我试图让整个事情变得“流畅”,以便在调整大小时,结构保持不变。

所以这里有一个问题:为了不使用大量的媒体查询,我想用百分比来表达我的值(value),我知道:

  • 盒子宽度必须等于 wrapper 的 1/3
  • 盒子的高度必须等于它的宽度(已解决:Responsively change div size keeping aspect ratio)
  • 右边距应等于 3px
  • 下边距必须等于右边距
  • 没有额外的边距或填充(也没有丑陋的作弊)

我试图坚持使用 100% CSS 解决方案,但我想我可能被迫使用 Javascript。

即使您没有确切的线索,我也乐于接受任何建议。

提前致谢。

最佳答案

http://cssdeck.com/labs/6w8wczs5

#wrapper {
    margin: 30px auto;
    width: 100%;
    position: relative;
    overflow: hidden;
}

#wrapper:before {
  display: block;
  content: '';
  padding-bottom: 100%;
}

#wrapper ul {
    position: absolute;
    top: 0;
    right: -3px; /* to offset margin-right (use 0 if you don't want the offset) */
    bottom: -3px; /* to offset margin-bottom (use 0 if you don't want the offset) */
    left: 0;
    list-style: none;
    padding: 0;
    margin: 0;
}

#wrapper li {
    width: 33.33333%;
    height: 33.33333%;
    /* using borders here instead of margins for box-sizing purposes
    to avoid using extra elements */
    border-right: 3px solid white;
    border-bottom: 3px solid white;
    background: #ebebeb;
    box-sizing: border-box;
    display: inline-block;
}

调整标记以便可以使用内联 block 而不是 float :

<div id="wrapper">
    <ul>
      <li>a</li><!--
      --><li>b</li><!--
      --><li>c</li><!--
      --><li>d</li><!--
      --><li>e</li><!--
      --><li>f</li><!--
      --><li>g</li><!--
      --><li>h</li><!--
      --><li>i</li>
    </ul>
</div>

请注意,我在 li 上使用边框而不是边距来获得更小的 CSS。要改为使用边距,您必须使用额外的元素。

调整 CSS 以避免使用边框和额外元素:

http://cssdeck.com/labs/6w8wczs5

#wrapper li {
    width: 33.33333%;
    height: 33.33333%;
    padding-right: 3px; /* may be optional */
    padding-right: 3px; /* may be optional */
    box-sizing: border-box;
    display: inline-block;
    position: relative;
}

#wrapper li:before {
  position: absolute;
  background: #ebebeb;
  top: 0;
  right: 3px;
  bottom: 3px;
  left: 0;
  content: '';
  z-index: -1;
}

关于CSS 流体棘手网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901012/

相关文章:

python - 大型不规则网格到规则网格的二维插值

java - JButtons 标签网格

mvvm - KendoUI Grid - MVVM Bindings - object Object] 没有方法 'isNew'

latex - 如何在 LyX 中显示更多文本?让页面更宽?

javascript - 如何在展开的 div 中使滚动条与对话框一起移动

css - 带有CSS的波浪形状

jquery - Bootstrap 模式添加文本

html - 两个盒子的背景颜色相同(左和右),但左框内容很多,右框内容很少?

html - 为什么 "margin: auto"不使元素垂直居中?

html - 在 CSS 中的 HTML 元素上设置背景时不需要的边距