CSSの最後の子セレクター:親の中の最後の子ではなく、特定のクラスの最後の要素を選択しますか?


175
<div class="commentList">
   <article class="comment " id="com21"></article>
   <article class="comment " id="com20"></article>
   <article class="comment " id="com19"></article>
   <div class="something"> hello </div>
</div>

選択します#com19か?

.comment {
    width:470px;
    border-bottom:1px dotted #f0f0f0;
    margin-bottom:10px;
}

.comment:last-child {
    border-bottom:none;
    margin-bottom:0;
}

div.somethingcommentListに実際の最後の子として別の子がある限り、これは機能しません。この場合、最後の子セレクターを使用して最後の外観を選択することはできますarticle.commentか?

jsFiddle

回答:


228

:last-child問題の要素がコンテナの最後の子であり、特定のタイプの要素の最後ではない場合にのみ機能します。そのために、あなたは欲しい:last-of-type

http://jsfiddle.net/C23g6/3/

@BoltClockのコメントによると、これは最後のarticle要素をチェックするだけであり、クラスがの最後の要素ではありません.comment

body {
  background: black;
}

.comment {
  width: 470px;
  border-bottom: 1px dotted #f0f0f0;
  margin-bottom: 10px;
}

.comment:last-of-type {
  border-bottom: none;
  margin-bottom: 0;
}
<div class="commentList">
  <article class="comment " id="com21"></article>

  <article class="comment " id="com20"></article>

  <article class="comment " id="com19"></article>

  <div class="something"> hello </div>
</div>


146
ただし、クラスではなくタイプのみを調べるため、同じクラスの非記事がある場合、予期しない結果が発生します。
BoltClock

1
正常に動作します。ただし、クラスで要素を絞り込む必要がある場合は、再度機能しません。jsfiddle.net/aliemreeee/a4H7f/2
Ali EmreÇakmakoğlu14年

12
これらの回答に基づいて、私は選択する方法がないと思いますlast-of-class
toobulkeh 2015年

14
CSSセレクターレベル4がブラウザーによって受け入れられ、実装されるまでは、ブラウザーで:nth-match(selector)およびにアクセスできません:nth-last-match(selector)。詳細については、w3.org / TR / selectors4を参照してください。
Chris

1
むしろ、それ以前に削除さ:nth-last-child(An+B of selector)れた:nth-last-match()が、WDを更新する必要はありませんでした。stackoverflow.com/questions/21167159/css-nth-match-doesnt-work/…を
BoltClock

6

要素をフローティングしている場合は、順序を逆にすることができます

すなわちの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;
}

これは、クラスが最後のインスタンスに実際に適用されているのは、順序が逆になっているためです。

ここにあなたのための実用的な例があります:

<!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>

ただし、浮動要素が次の行にプッシュされた場合(つまり、左右に浮動するのに十分な水平スペースがない場合)は機能しません
Ozzy

.some-class~.some-class2つの要素のみが繰り返される場合、私にとってはうまくいきます。
Meloman

4

最も正しい答えは次のとおりです:使用:nth-child(または、この特定のケースでは、その対応物:nth-last-child)。ほとんどの場合、最初の引数によってこのセレクターを知っているだけで、nを使用した計算に基づいてアイテムの範囲を取得しますが、「[CSSセレクター]の」2番目の引数を取ることもできます。

あなたのシナリオはこのセレクターで解決できます: .commentList .comment:nth-last-child(1 of .comment)

ただし、技術的に正しいということは、それを使用できるという意味ではありません。このセレクタは、現時点ではSafariでのみ実装されているためです。

さらに読むために:


1

ここでコメントする必要があると思うことは私のために働いた:

:last-child常に最後のラストを取得できるように、必要な場所で複数回使用します。

これを例にとります:

.page.one .page-container .comment:last-child {
  color: red;
}
.page.two .page-container:last-child .comment:last-child {
  color: blue;
}
<p> When you use .comment:last-child </p>
<p> you only get the last comment in both parents </p>

<div class="page one">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>

<p> When you use .page-container:last-child .comment:last-child </p>
<p> you get the last page-container's, last comment </p>

<div class="page two">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>


0

このソリューションはどうですか?

div.commentList > article.comment:not(:last-child):last-of-type
{
    color:red; /*or whatever...*/
}

@lsblsb、articleここで使用するため、例では:not(:last-child)は必要ありません。
ЕвгенийМасленков

クラスを持つ要素somethingが元のHTMLに存在せず、動的に挿入されている場合はどうなりhoverますか?このソリューションは失敗しませんか?
Fr0zenFyr

-1

最後の要素タイプも記事である場合、last-of-type期待どおりに動作しません。

多分私はそれがどのように機能するか本当に理解していません。

デモ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.