마지막 자식 선택기 사용


106

내 목표는 마지막에 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>

마지막 자녀 선택하려면 어떻게 해야합니까?

답변:


171

:last-childpseudoclass는 여전히 안정적으로 브라우저에서 사용할 수 없습니다. 특히 Internet Explorer 7과 Safari 3.2 이상하게 지원 하지만 Internet Explorer 버전 <9 및 Safari <3.2는 확실히 지원하지 않습니다 .:first-child

가장 좋은 방법은 last-child해당 항목에 (또는 유사한) 클래스 를 명시 적으로 추가하고 li.last-child대신 적용하는 것입니다.


46
IE8은 :last-child둘 다 지원하지 않습니다 . 그리고 그것은 아니에요 호기심. :first-childCSS2 의사 클래스, :last-childCSS3 의사 클래스입니다.
mercator

92
last-child는 모든 최신 브라우저에서 작동합니다. 즉, 어떤 버전의 IE에서도 작동하지 않습니다.
Rob

25
참고로 IE 9 :last-child .
Jari Keinänen

6
@mercator : first-child가 CSS2에서 구현되었지만 : last-child가 CSS3까지 남아 있었다는 것이 궁금합니다. ... 동시에 추가하는 것이 분명해 보입니다.
Cobby

21
IE7은 다른 자식을 인정하지 않습니다
Dewayne

76

당신에게 효과가있는 또 다른 해결책은 관계를 바꾸는 것입니다. 따라서 모든 목록 항목의 테두리를 설정합니다. 그런 다음 first-child를 사용하여 첫 번째 항목의 테두리를 제거합니다. 첫 번째 자식은 모든 브라우저에서 정적으로 지원됩니다 (즉, 다른 코드를 통해 동적으로 추가 할 수 없지만 첫 번째 자식은 CSS2 선택기이고 마지막 자식은 CSS3 사양에 추가됨).

참고 : 예와 같이 목록에 항목이 2 개만있는 경우에만 의도 한대로 작동합니다. 세 번째 항목 이상에는 테두리가 적용됩니다.


2
상자 밖에서 +1 :-) 방금 마지막 자식 요소를 첫 번째 자식으로 변환하고 메뉴 구분 기호를 위해 border-right에서 border-left로 변경했습니다. 이제 IE8은 내 CSS를 좋아합니다.
Scott B

43

Javascript를 사용할 수 있다고 생각하면 jQuery 지원 이후 last-childjQuery의 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')스타일 시트에서 스타일을 유지할 수 있도록 이와 같은 작업을 수행하는 것이 좋습니다 .
jason

자동으로 처리되기 때문에 첫 번째 솔루션보다 깨끗합니다. 하지만 제이슨도 동의합니다.
Josh M.

1
실제로 IE7은 div:last-childdiv.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

13

CSS3 선택기를 자주 원하는 경우 사이트에서 항상 selectivizr 라이브러리를 사용할 수 있습니다.

http://selectivizr.com/

거의 모든 CSS3 선택기를 지원하지 않는 브라우저에 대한 지원을 추가하는 JS 스크립트입니다.

<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 dec.

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.