我有一个显示在多列上的列表.每个列表项都是块元素(显示:块)并且附加了一些样式(底部有1px边框).它目前看起来像这样:
List item List item List item --------- --------- --------- List item List item List item --------- --------- --------- List item List item --------- ---------
我想在每列的第一个项目的顶部添加相同的边框,例如
--------- --------- --------- List item List item List item --------- --------- --------- List item List item List item --------- --------- --------- List item List item --------- ---------
我试过了:第一行和::第一行,在这个实例中似乎没有任何东西(可能因为它不适用于块元素?)
列表的长度可能不同,因此我无法确定每列中有多少项,因此我无法使用:nth-of-type().
有人知道这是否可以做到(或相反,如果它肯定不能?)
我的HTML
<ul> <li><a href="">List item</a></li> <li><a href="">List item</a></li> <li><a href="">List item</a></li> ... </ul>
我的CSS
ul { list-style: none; padding: 21px; -moz-column-count: 4; -webkit-column-count: 4; column-count: 4; -moz-column-gap: 21px; -webkit-column-gap: 21px; column-gap: 21px; } li { display: block; -moz-column-break-inside: avoid; -webkit-column-break-inside: avoid; -mx-column-break-inside: avoid; column-break-inside: avoid; padding: 1em 0; border-bottom: 1px dotted #000; }
解决方法
看到代码后编辑,1小时后:完成!用纯CSS!
我花了一段时间,因为我不想使用javascript.这里有一个关于http://jsfiddle.net/mEtF6/1/幕后真实情况的演示,这里是工作版:http://jsfiddle.net/mEtF6/2/.如果你什么都不懂,可以随意询问,因为它没有很好的记录.我不得不实际添加一个包裹’ul’的div,因为溢出:隐藏在ul上不会表现为border-top在元素之外.这是工作代码:
<div> <ul> <li><a href="">List item 1</a></li> <li><a href="">List item 2</a></li> <li><a href="">List item 3</a></li> <li><a href="">List item 4</a></li> <li><a href="">List item 5</a></li> <li><a href="">List item 6</a></li> <li><a href="">List item 7</a></li> <li><a href="">List item 8</a></li> <li><a href="">List item 9</a></li> </ul> </div>
和CSS:
div { /* This will hide the white space at the right (blue in the explanation) */ overflow: hidden; } ul { position: relative; /* Needed to place the :before pseudo element in the proper position */ list-style: none; border-top: 1px dotted #000; padding: 0; margin: 0; -moz-column-count: 4; -webkit-column-count: 4; column-count: 4; -moz-column-gap: 20px; -webkit-column-gap: 20px; column-gap: 20px; } /* This 'cuts' the top margin of ul so it's displayed in the same way as the other */ ul:before { content: " "; position: absolute; display: block; width: 100%; height: 1px; /* Put the gaps on the <ul> top margin */ top: -1px; /* Background-size = 1/4 of the width + 1/4 of the space between columns */ background-size: calc(25% + 5px) 1px; /* Or it will hide the border-top of the ul */ background-color: transparent; /* The actual white gaps at the top */ background-image: linear-gradient( 90deg,transparent calc(100% - 20px),/* All the <li> width minus the gap is transparent */ red 20px); /* Those 20px are white */ } li { -moz-column-break-inside: avoid; -webkit-column-break-inside: avoid; -mx-column-break-inside: avoid; column-break-inside: avoid; padding: 0; border-bottom: 1px dotted #000; } /* This will hide the top margin of the last columns without elements */ li:last-child:before { position: absolute; /* You want to place the top */ margin-left: calc(25% + 5px); content: " "; display: block; background-color: blue; width: 10px; height: 1px; top: -1px; width: 100%; } /* Make the <a> fill the whole space of the <li> */ li a { display: block; padding: 1em 0; }
注意:我为< a>添加了适当的支持.标签,使整个块可单击,而不仅仅是其中的文本.你可以扭转它.
注2:仅使用FIREFOX进行测试.您可能需要添加一些其他-webkit渐变以使其跨浏览器.对不起,但我会把这个肮脏的工作留给你(;我发现了一个明显的错误并问了question here in SO about it.
再次,工作演示:http://jsfiddle.net/mEtF6/2/.