CSS son alt seçici: ebeveynin içindeki son alt öğeyi değil, belirli bir sınıfın son öğesini seç?


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

Seçmek istiyorum #com19?

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

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

div.somethingCommentList'te gerçek bir son çocuğum olduğu sürece bu işe yaramaz. Bu durumda son görünümünü seçmek için son çocuk seçiciyi kullanmak mümkün müdür article.comment?

jsFiddle

Yanıtlar:


229

:last-childyalnızca söz konusu öğe, belirli bir öğe türünün sonuncusu değil, kabın son alt öğesi olduğunda çalışır. Bunun için istiyorsun:last-of-type

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

@ BoltClock'un yorumuna göre, bu yalnızca son articleöğeyi kontrol ediyor, sınıfındaki son öğeyi değil .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
Yine de sınıfa bakmaz, sadece türü vardır, bu nedenle aynı sınıfa sahip olmayan makaleleriniz varsa beklenmedik sonuçlar alırsınız.
BoltClock

1
Düzgün çalışıyor. Ancak, öğeleri sınıflara göre daraltmaları gerekiyorsa, tekrar çalışmaz. jsfiddle.net/aliemreeee/a4H7f/2
Ali Emre Çakmakoğlu

12
bu cevaplara dayanarak, seçmenin bir yolu olmadığını sanıyorum last-of-class.
toobulkeh

14
CSS seçicileri seviye 4 kabul edip erişimi olacaktır tarayıcılar tarafından uygulanmaktadır kadar değil :nth-match(selector)ve :nth-last-match(selector). Daha fazla ayrıntı için w3.org/TR/selectors4 adresine bakın .
Chris

1
Ya da, bundan çok önce düştüğü :nth-last-child(An+B of selector)gibi :nth-last-match(), WD'yi güncelleme zahmetine girmediler. Bkz. Stackoverflow.com/questions/21167159/css-nth-match-doesnt-work/…
BoltClock

6

Elemanları yüzüyorsanız, siparişi tersine çevirebilirsiniz

yani float: right;yerinefloat: left;

Ve sonra bir sınıfın ilk alt öğesini seçmek için bu yöntemi kullanın.

/* 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;
}

Bu aslında sınıfı LAST örneğine uygulamaktadır, çünkü şimdi şimdi ters sıradadır.

İşte size çalışan bir örnek:

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

Bununla birlikte, kayan elemanlar bir sonraki satıra itilirse bunun işe yaramayacağını unutmayın (yani sağa / sola yüzmek için yeterli yatay alan yok)
Ozzy

.some-class~.some-classsadece 2 eleman tekrarlandığında benim için harika çalışıyor.
Meloman

4

Sanırım en doğru cevap: Kullanım :nth-child(veya bu özel durumda, onun karşılığı :nth-last-child). Çoğu, bu seçiciyi yalnızca n ile yapılan bir hesaplamaya dayalı bir dizi öğeyi ele geçirme konusundaki ilk argümanıyla bilir, ancak aynı zamanda "[herhangi bir CSS seçicisinin]" ikinci argümanını da alabilir.

Senaryonuz bu seçiciyle çözülebilir: .commentList .comment:nth-last-child(1 of .comment)

Ancak teknik olarak doğru olmak, onu kullanabileceğiniz anlamına gelmez, çünkü bu seçici şu anda sadece Safari'de uygulanmaktadır.

Daha fazla okuma için:


1

Benim için işe yarayan bir şeyin burada yorumlanması gerektiğini düşünüyorum:

:last-childHer zaman sonuncunun sonunu almak için gerekli yerlerde birden çok kez kullanın .

Örneğin bunu ele alalım:

.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

Bu çözüm ne olacak?

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

@lsblsb, articleBurada kullanın , yani: değil (: son çocuk) verilen örnek için gerekli değildir.
Евгений Масленков

sınıflı öğe somethingorijinal HTML'de yoksa ve dinamik olarak ekleniyorsa ne olur hover? Bu çözüm başarısız olmayacak mı?
Fr0zenFyr

-1

son öğe türü de makale ise, last-of-typebeklendiği gibi çalışmaz.

belki nasıl çalıştığını gerçekten anlamıyorum.

gösteri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.