使用最后一个选择器


106

我的目标是在最后一个CSS上使用CSS li,但是它没有这样做。

#refundReasonMenu #nav li:last-child {
    border-bottom: 1px solid #b5b5b5;
}
<div id="refundReasonMenu">
    	<ul id="nav">
    		<li><a id="abc" href="#">abcde</a></li>
    		<li><a id="def" href="#">xyz</a></li>
    	</ul>
    </div>

如何选择最后一个孩子?

Answers:


171

:last-child伪类仍然无法可靠地跨浏览器使用。特别是Internet Explorer <9和Safari <3.2绝对不支持它,尽管Internet Explorer 7和Safari 3.2 确实支持:first-child

最好的选择是last-child为该项目显式添加一个(或类似的)类,然后应用li.last-child


46
IE8不支持:last-child。这不是好奇。:first-child是CSS2伪类,:last-child是CSS3伪类。
墨卡托

92
last-child可在所有现代浏览器中使用,这当然意味着它不适用于任何版本的IE。
罗布


6
@mercator奇怪的是::first-child是在CSS2中实现的,但是:last-child一直保留到CSS3 ...同时添加它们似乎很明显。
科比2012年

21
IE7拒绝承认其他混蛋孩子
Dewayne

76

另一种可能对您有用的解决方案是逆转关系。因此,您将为所有列表项设置边框。然后,您将使用第一个孩子消除第一个项目的边框。所有浏览器均静态支持第一个孩子(这意味着无法通过其他代码动态添加第一个孩子,但第一个孩子是CSS2选择器,而在CSS3规范中添加了最后一个孩子)

注意:仅当列表中只有2个项目(例如您的示例)时,这才可以按预期方式工作。任何第3个项目及以上项目都将应用边框。


2
开箱即用的+1 :-)我只是将我的最后一个孩子元素转换为第一个孩子,并通过右边框更改为左边框来分隔菜单。现在IE8喜欢我的CSS。
Scott B

43

如果您认为可以使用Javascript,那么由于有了jQuery支持last-child,因此可以使用jQuery的css方法,它的优点是它将支持几乎所有浏览器

示例代码:

$(function(){
   $("#nav li:last-child").css("border-bottom","1px solid #b5b5b5")
})

您可以在此处找到更多信息:http : //api.jquery.com/css/#css2


8
讲脏话。
md1337

95
Wayyy最好做类似的事情,$("#nav li:last-child").addClass('last-child')以便可以将样式保留在样式表中。
杰森

因为它是自动处理的,所以它比第一种解决方案干净。但是我也同意杰森的观点。
Josh M.

1
实际上,IE7不会加载同时包含div:last-child和的类div.last-child。看来它认为:last-child语法无效,并且不会应用带有该伪选择器的任何类。
Josh M.

@Josh M .:这是正确的和预期的行为。我应该说不幸。您必须复制规则。
BoltClock

19

如果列表项的数量是固定的,则可以使用相邻的选择器,例如,如果只有三个<li>元素,则可以选择最后一个<li>

#nav li+li+li {
    border-bottom: 1px solid #b5b5b5;
}

3
您的选择器有误。li + #nav li选择后面的li内部。您的选择器应为。#navli#nav li + li + li
BoltClock

1
太好了 在IE8中可以正常工作,但在IE7中则不能。
Mateng 2012年

13

如果您发现自己经常需要CSS3选择器,则可以始终在网站上使用selectivizr库:

http://selectivizr.com/

这是一个JS脚本,为几乎不支持CSS3选择器的浏览器增加了对它的支持。

<head>使用IE条件将其放入标签中:

<!--[if (gte IE 6)&(lte IE 8)]>
  <script src="/js/selectivizr-min.js" type="text/javascript"></script>
<![endif]-->


0

作为使用类的替代方法,您可以使用详细列表,将子dt元素设置为一种样式,将子dd元素设置为另一种样式。您的示例将变为:

#refundReasonMenu #nav li:dd
{
  border-bottom: 1px solid #b5b5b5;
}

的HTML:

<div id="refundReasonMenu">
  <dl id="nav">
        <dt><a id="abc" href="#">abcde</a></dt>
        <dd><a id="def" href="#">xyz</a></dd>
  </dl>
</div>

两种方法都不比另一种更好,这取决于个人喜好。


0

另一种方法是在jQuery中使用最后一个子选择器,然后使用.css()方法。不过请保持疲倦,因为有些人仍在使用禁用JavaScript的浏览器。


0

为什么不将边框应用于UL的底部?

#refundReasonMenu #nav ul
{
    border-bottom: 1px solid #b5b5b5;
}

1
如果您padding-bottom<ul>元素上或margin-bottom最后一个<li>元素上,则将不会在最后一个<li>元素的正下方放置期望的位置。否则,这是一个很好的解决方案。
Wex 2012年

0

如果您浮动元素,则可以颠倒顺序

float: right;代替float: left;

然后使用此方法选择类的第一个孩子。

/* 1: Apply style to ALL instances */
#header .some-class {
  padding-right: 0;
}
/* 2: Remove style from ALL instances except FIRST instance */
#header .some-class~.some-class {
  padding-right: 20px;
}

实际上,这实际上是将类应用于LAST实例,因为现在的顺序相反。

这是一个适合您的工作示例:

<!doctype html>
<head><title>CSS Test</title>
<style type="text/css">
.some-class { margin: 0; padding: 0 20px; list-style-type: square; }
.lfloat { float: left; display: block; }
.rfloat { float: right; display: block; }
/* apply style to last instance only */
#header .some-class {
  border: 1px solid red;
  padding-right: 0;
}
#header .some-class~.some-class {
  border: 0;
  padding-right: 20px;
}
</style>
</head>
<body>
<div id="header">
  <img src="some_image" title="Logo" class="lfloat no-border"/>
  <ul class="some-class rfloat">
    <li>List 1-1</li>
    <li>List 1-2</li>
    <li>List 1-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 2-1</li>
    <li>List 2-2</li>
    <li>List 2-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 3-1</li>
    <li>List 3-2</li>
    <li>List 3-3</li>
  </ul>
  <img src="some_other_img" title="Icon" class="rfloat no-border"/>
</div>
</body>
</html>

-2

不看CSS的其余部分就很难说,但是请尝试!important在边框颜色前添加,使其像这样:

#refundReasonMenu #nav li:last-child
{
  border-bottom: 1px solid #b5b5b5 !important;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.