有没有办法来指定“除了第一/最后的所有元素”一个简写?(Is there any way to sp

2019-06-23 10:30发布

很多时候,是很自然的需要指定一个CSS样式,除了第一(或最后)的所有元素。 例如,造型段落时,你想一个底边距添加到每个元素除了最后一个(或者类似地,上边距的每个元素除了第一个)。

有没有办法做到这一点这就是:

  • 不是定义更简洁p {...}然后p:first-child {...}
  • 更直接和直观的比p:nth-child(-n+1)

如果没有,你知道在加入任何企图?

Answer 1:

对于所有p除第一子元素,使用其中的任一个(第二个是较好的支持):

p:not(:first-child)
p:first-child ~ p

对于所有p除了最后一个子元素:

p:not(:last-child)

对于所有p除了第一个和最后一个子元素:

p:not(:first-child):not(:last-child)

像往常一样,CSS3的:not():last-child ,不支持IE9之前+和其他浏览器比较新的版本。 你不会在(IE8及以上)的浏览器支持条款,除非你添加类到您的第一个和最后的孩子,使用JavaScript或以其他方式很远的到达。

请记住, 在流段和他们的祖先(S)之间的垂直边距崩溃 ,所以除非你想零出了这些段落中的容器元素的边缘,以及,你应该不需要零出第一的边缘,最后p元件具体。 这里有一个小提琴来说明。



Answer 2:

嗯,你可以这样做:

p:not(:first-child) {...}

但只有最近的浏览器支持:not伪类。

除此之外,没有。 你最好的选择是为所有的样式,然后覆盖其第一/最后。



Answer 3:

如果不需要IE7-8支持,你可以使用:not() CSS选择器 。

但是,如果你需要支持IE7 +,但仍可能在情况下,有一个小窍门,你可以使用,通常让你很远。 一个鲜为人知的事实是:first-child的伪选择实际工作中的IE7 +(不是:last-child虽然)作为是一些其他的CSS选择器 ,这使得这样的东西在一个水平浮动布局可能增加垂直空间。

想象一下这个网站:

<ul>
    <li>Item #1</li>
    <li>Item #2</li>
    <li>Item #3</li>
    <li>Item #4</li>
</ul>

这为一些CSS:

/* General reset */
ul, li { list-type: none; margin: 0; padding: 0; }
/* Make horizontal */
ul > li { float: left; }

所以,现在所有列表项是横向彼此相邻,现在我们希望两者之间的所有项目,但不能在左侧或右侧添加边距,我们可以在CSS中做到这一点:

/* General reset */
ul, li { list-type: none; margin: 0; padding: 0; }
/* Make horizontal */
ul > li { float: left; margin-left: 10px; }
ul > li:first-child { margin-left: 0; }

这通常涵盖的,我想唯一的,那么剩余的部分案件95%的“被遗忘的”选择覆盖另一个几个百分点 ,在那之后,你需要添加反正在后端的一些类通常是没有太大的瓶颈这页纸。



Answer 4:

我会建议使用first-of-type

p:not(:first-of-type) { ... }

浏览器支持(caniuse)



文章来源: Is there any way to specify a CSS shorthand for “all elements except the first/last”?