【问题标题】:Horizontal list element evenly spaced and responsive水平列表元素均匀分布且响应迅速
【发布时间】:2014-11-20 02:57:13
【问题描述】:

我正在创建一个包含图像和文本的无序列表,并且希望每个项目的宽度为宽度的 1/3,并带有边距,并且间隔均匀。我不知道如何确保在响应式网站中,项目总是正好是宽度的 1/3,包括边距。各个浏览器的百分比似乎并不一致。

HTML

<ul>
    <li><img>Text</li>
    <li><img>Text</li>
    <li><img>Text</li>
    <li><img>Text</li>
    <li><img>Text</li>
    <li><img>Text</li>
</ul>

CSS

ul {list-style:none; text-align:center; margin:0;}
ul li {display:inline-block; zoom:1; *display:inline; vertical-align:top; width:32%; margin:10px 1%;}

如果我想要两行三列,有时它看起来不错,而其他时候将第三项向下推到下一行——几乎就像某些浏览器在某处添加一两个像素一样。是否有 CSS 可用于将其均匀地分布在父元素的整个宽度上?

请注意,该网站是响应式的,因此无法计算精确的像素。如果可能的话,我也宁愿避免为不同的浏览器编写单独的 CSS。

【问题讨论】:

    标签: html css responsive-design


    【解决方案1】:

    有几种方法可以解决这个问题,但最简单的 CSS 解决方案是对 li 元素使用内联块。现在 inline-block 的问题是,它们会考虑空格,破坏你的布局,但是在标记中有两个简单的解决方案:

    1. li 元素之间的 HTML cmets;
    2. 压缩的 HTML 代码。

    HTML cmets 示例:

    <ul>
        <li><img>Text</li><!--
     --><li><img>Text</li><!--
     --><li><img>Text</li><!--
     --><li><img>Text</li><!--
     --><li><img>Text</li><!--
     --><li><img>Text</li>
    </ul>
    

    压缩 HTML 示例:

    <ul><li><img>Text</li><li><img>Text</li><li><img>Text</li><li><img>Text</li><li><img>Text</li><li><img>Text</li></ul>
    

    对于 CSS,这应该可以解决问题(您可以在媒体查询中修改“列”的宽度)。

    ul {
      list-style-type: none;
      margin: 0;
      padding: 0;
    }
    
      li {
        display: inline-block;
        width: 50%;
      }
    
    @media screen and (min-width: 20em) {
    
      li {
        width: 33.33333%;
      }
    
    }
    

    另外需要注意的是,您不能在这些项目的左侧和右侧使用边距,因为它们不会成为原始宽度的一部分,但您可以在内部使用填充将元素“隔开”。这也是一些响应式网格系统的构建方式(稍微高级一点,但原理相同)。

    这是实时代码:http://codepen.io/TheDutchCoder/pen/zxxwom

    【讨论】:

    • 雷尼尔,谢谢。这是一个有趣的解决方案。首先,我需要考虑任何跨浏览器异常吗?其次,我现在正在玩,并使用
    • 元素上的边距作为百分比,从
    • 的宽度中减去它。您认为以这种方式修改有问题吗?
  • 在下面查看我的解决方案以获得完全支持的跨浏览器解决方案。我已经看到这个 inline-block hack 的问题(添加 cmets 以删除空间)。如果您将 box-sizing 定义为border-box,那么您可以使用 padding 而不是 margin 来分隔 li 元素。上述答案中有趣的元素是 @media 查询的使用,您将需要它在响应式布局中定义断点。祝你好运!
  • 首先:这不是一个 hack,它是一个非常好的解决方案,但是有些诗人没有意识到空格在这种情况下起作用。浮动元素很好,但它会将元素从当前文档流中取出,这并不总是一个好主意。内联块对于布局来说确实很强大,直到我们得到一个大多数浏览器都支持的更好的解决方案。 Flexbox 也是一个很好的例子。
  • @NathanS 没什么好担心的,它受 IE8+ 的支持,并且可以与 IE7 一起使用,并添加了一些小功能。所有其他浏览器都可以正常工作。使用百分比作为边距是可以的,只要百分比相加当然是很好的间隔元素的方法,但它当然取决于容器的宽度。
  • @ReinierKaper 我并不是说这不是一个好的解决方案,我只是说我看到人们对这种技术有疑问。布局的浮动与内联块一直是无用的争论:这两种技术都不是为了布局目的而设计的。已经研究了两个模块来构建灵活的布局:CSS 模板布局模块(这只是一个草稿)和灵活框布局模块,如果您不需要针对 IE10 和 Opera Mini 以下的浏览器,这是一个可行的解决方案。用于学习目的:css-tricks.com/snippets/css/a-guide-to-flexbox
  • 【解决方案2】:

    这是一个跨浏览器的解决方案。如果您需要在列表中包含图像,我已经添加了一个 html5 结构。

    /* the two following properties modify the box-model so that padding is removed from the width instead of being added */
    html {
      box-sizing: border-box;
    }
    *, *:before, *:after {
      box-sizing: inherit;
    }
    ul {
      list-style-type: none;
      margin: 0;
      padding: 0;
    }
    ul:after { /* to clearfix your ul list */
      content: "";
      display: table;
      clear: both;
    }
    ul li {
      display: block; /* inline-block have an extra 4px margin wich makes it harder to use in this situation */
      width: 33.3333333%; /* You get it (100/3) but use exact number */
      padding: 10px 5px;
      float: left; /* if you use block elements you have to float them */
      text-align: center;
    }
    figure {
      margin: 0; /* to normalize figure element */
    }
    figure img {
      max-width: 100%;
      max-height: 100%;
    }
    <ul>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
      <li>
        <figure>
          <img src="http://placehold.it/500x500" />
          <figcaption>Text</figcaption>
        </figure>
      </li>
     
    </ul>

    【讨论】:

    【解决方案3】:

    试试这个:http://jsfiddle.net/j13889cx/

    我添加了一个 div 元素,将所有内容包裹在每个名为 .ul-wrapli 元素中。

    这允许您添加任何您想要的边距/填充,因为.ul-wrap 是一个块元素。

    尝试更改.ul-wrap 的边距或内边距。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签