2013-04-10 58 views
1

我需要最后一条红线与之前的所有红线相等。 UL容器的宽度可能不同(这使得第n个选择器在这里无用)。 每个LI的线条高度也可能不同。内嵌块元素后的水平线

演示:http://jsfiddle.net/6ZX9W/34/

<ul> 
    <li>Medium medium medium medium medium contnent.</li><!-- 
    --><li>Short contnent.</li><!-- 
    --><li>Long long long long long long long long long long long long long long long long long long long long long long long long long long long long long contnent.</li><!-- 
    --><li>Short contnent.</li><!-- 
    --><li>Even more long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long contnent.</li><!-- 
    --><li>Short contnent.</li><!-- 
    --><li>Medium medium medium medium medium contnent.</li> 
</ul> 

li { 
    position: relative; 
    display: inline-block; 
    width: 200px; 
    vertical-align: top; 
    margin-right: 20px; 
    margin-bottom: 20px; 
    border: solid 1px #ccc; 
} 
li:before { 
    content: ''; 
    position: absolute; 
    top: -10px; 
    left: 0; 
    display: block; 
    width: 222px; 
    border-top: solid 10px rgba(255,0,0,.3); 
} 

希望找到没有JavaScript的帮助解决。

upd。边框颜色应该是透明的。所以要小心重叠。

upd2。红线不应该太长(它应该在最后一列+添加边距(margin-right:20px)之后结束)。

+0

你想要的列数是否已修复?或取决于用户的屏幕大小? – Arkana 2013-04-10 08:29:48

+0

列数不固定。这取决于用户的屏幕大小。 – Sladex 2013-04-10 10:05:24

回答

0

可以使用display: block,而不是display: inline-block为您的列表:

li { 
    position: relative; 
    display: block; 
    width: 200px; 
    vertical-align: top; 
    margin-right: 20px; 
    margin-bottom: 20px; 
    border: solid 1px #ccc; 
} 

Demo

,或者你可以过去里设置不同的CSS:

li:last-child:before { 
    width: 450px; 
} 

Demo

+0

1演示:这不是我正在寻找的东西(我需要漂浮的元素......)。 2演示:我不知道我需要的宽度,因为它取决于容器的宽度(或用户的屏幕大小)。 – Sladex 2013-04-10 10:14:27

0

好的,那么这样的事情呢? 使用9999px作为宽度值似乎和大概种哈克,但无论什么作品,对不对?

这里是小提琴:http://jsfiddle.net/6ZX9W/26/

这里是使用的CSS:

ul{ 
    margin: 0; 
    padding: 0; 
    padding-top: 10px; 
    overflow: hidden; 
    border: 1px #aaa dashed; 
    list-style: none; 
} 

li { 
    position: relative; 
    display: inline-block; 
    width: 200px; 
    vertical-align: top; 
    margin-right: 20px; 
    margin-bottom: 20px; 
    border: solid 1px #ccc; 
} 
li:before { 
    content: ''; 
    position: absolute; 
    top: -10px; 
    left: 0; 
    display: block; 
    width: 9999px; 
    border-top: solid 1px #f00; 
} 

当然,这一切都取决于一个事实,即在UL必须有overflow: hidden + I增加了一些额外的样式:删除正确的填充和padding-top: 10px是因为我们想要显示第一行的:before红线,为此您定义了top: -10px

+0

对不起,我忘记了我需要的边框颜色是透明的。你的黑客将无法正常工作http://jsfiddle.net/6ZX9W/32/另一件事红线太长(它应该在最后一列+ margin-right:20px之后结束)。 – Sladex 2013-04-10 10:07:25

+0

边框颜色是我放在那里看到更好的布局,这是一件你可以完全改变/删除的东西。 – Smuuf 2013-04-10 10:24:54

0

而是采用李: 之前尝试使用: -

li:nth-child(2n+1):before { 
     border-top: 1px solid #FF0000; 
     content: ""; 
     display: block; 
     left: 0; 
     position: absolute; 
     top: -10px; 
     width: 214%; /*(or 444px)*/ 
    } 
+0

我不知道有多少元素可以放入UL容器中。所以我不知道所需的宽度和第n个孩子的表情。 – Sladex 2013-04-10 10:18:28

+0

并不重要... 要么没有元素将是奇数或甚至...在任何情况下,你想红线覆盖整个UL。所以,如果你只是在奇数元素之前(对于宽度= 200%)放置红色线条,它将覆盖整个宽度,而不管偶数小孩是否存在或不存在。 因此您可以使用li:nth-​​child(单数) – 2013-04-10 11:41:25

0

我想,我终于得到了一点;)尝试this

我删除您<li>标签的位置和删除top:before选择器,然后将背景更改为1像素高度。

+0

适合纯色作品。但是,如果您尝试更改容器大小并查看不透明度将如何变化(实际上:在元素相互重叠之前)http://jsfiddle.net/3GF8R/3/而红线太长右边(它应该在最后一列之后结束+ margin-right:20px)。 – Sladex 2013-04-10 10:48:20

+0

是否这样? http://jsfiddle.net/3GF8R/5/ – Arkana 2013-04-10 10:53:53

+0

在外观上看起来是正确的(直到你试图改变UL的宽度)。 – Sladex 2013-04-10 11:17:21