Son çocuk seçiciyi kullanma


106

Amacım en son CSS'yi uygulamak li, ancak bunu yapmıyor.

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

Sadece son çocuğu nasıl seçebilirim ?

Yanıtlar:


171

:last-childPseudoclass hala güvenilir tarayıcılar arasında kullanılamaz. Özellikle, Internet Explorer sürümleri <9 ve Safari <3.2 kesinlikle bunu desteklemeyen Internet Explorer 7 ve Safari 3.2 rağmen, do desteği:first-child merakla.

En iyi bahsiniz, last-childo öğeye açıkça bir (veya benzer) sınıf eklemek ve li.last-childonun yerine başvurmaktır .


46
IE8 de desteklemiyor :last-child. Ve o kadar da ilginç değil . :first-childbir CSS2 sözde sınıfı, :last-childbir CSS3 sözde sınıfıdır.
mercator

92
last-child tüm modern tarayıcılarda çalışır, bu da tabii ki IE'nin herhangi bir sürümünde çalışmadığı anlamına gelir.
Rob


6
@mercator Merak ediyorum: ilk-çocuk CSS2'de uygulanıyordu ama: son-çocuk CSS3'e kadar kaldı ... onları aynı anda eklemek oldukça açık görünüyor.
Cobby

21
IE7 diğer piç çocukları tanımayı reddediyor
Dewayne

76

Sizin için işe yarayabilecek bir başka çözüm de ilişkiyi tersine çevirmektir. Böylece tüm liste öğeleri için sınır belirlersiniz. Daha sonra ilk öğenin sınırını ortadan kaldırmak için birinci çocuğu kullanırsınız. İlk çocuk, tüm tarayıcılarda statik olarak desteklenir (başka bir kod aracılığıyla dinamik olarak eklenemeyeceği anlamına gelir, ancak ilk çocuk bir CSS2 seçicidir, oysa son çocuk CSS3 belirtimine eklenmiştir)

Not: Bu, yalnızca sizin örneğinizde olduğu gibi listede yalnızca 2 öğe varsa amaçladığınız şekilde çalışır. Herhangi bir 3. öğe ve üzeri, kendilerine sınır uygulanacaktır.


2
Kutunun dışında düşünme için +1 :-) Sadece son-çocuk öğelerimi ilk-çocuk'a dönüştürdüm ve menü ayırıcıları için border-right'ı border-left'e değiştirdim. Şimdi IE8 css'imi seviyor.
Scott B

43

Javascript kullanabileceğinizi düşünüyorsanız, jQuery desteklediğinden beri last-child, jQuery'nin css yöntemini kullanabilirsiniz ve iyi olan şey, hemen hemen tüm tarayıcıları destekleyecektir.

Örnek Kod:

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

Burada daha fazla bilgi bulabilirsiniz: http://api.jquery.com/css/#css2


8
Kirli hakkında konuşun.
md1337

95
Stilinizi $("#nav li:last-child").addClass('last-child')stil sayfalarınızda tutabilmek için böyle bir şey yapmak çok daha iyi .
jason

Bu, otomatik olarak kullanıldığı için ilk çözümden daha temizdir. Ama Jason'a da katılıyorum.
Josh M.

1
Aslında, IE7 hem div:last-childve hem de içeren bir sınıfı yüklemez div.last-child. :last-childSözdiziminin geçersiz olduğunu düşündüğü ve sözde seçiciye sahip herhangi bir sınıfın uygulanmayacağı anlaşılıyor.
Josh M.

@Josh M .: Bu doğru ve beklenen davranış. Oldukça talihsiz, söylemeliyim. Kuralı kopyalamalısın.
BoltClock

19

Liste öğelerinin sayısı sabitlenmişse, bitişik seçiciyi kullanabilirsiniz, örneğin yalnızca üç öğeniz varsa <li>, sonuncuyu aşağıdakilerle seçebilirsiniz <li>:

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

3
Seçiciniz yanlış. sonra gelen içini li + #nav liseçer . Seçiciniz basitçe olmalıdır . li#navli#nav li + li + li
BoltClock

1
Bu şık. IE8'de iyi çalışıyor, ancak IE7'de değil.
Mateng

13

Kendinizi sık sık CSS3 seçicilerine ihtiyaç duyuyorsanız, sitenizdeki selectivizr kitaplığını her zaman kullanabilirsiniz:

http://selectivizr.com/

Bu, aksi takdirde onları desteklemeyecek tarayıcılara neredeyse tüm CSS3 seçicileri için destek ekleyen bir JS betiğidir.

<head>Bir IE koşuluyla etiketinize atın :

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


0

Bir sınıfı kullanmaya alternatif olarak, alt dt öğelerini bir biçime ve alt dd öğelerini başka bir biçime sahip olacak şekilde ayarlayarak ayrıntılı bir liste kullanabilirsiniz. Örneğiniz şöyle olacaktır:

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

Hiçbir yöntem diğerinden daha iyi değildir ve sadece kişisel tercihe bağlıdır.


0

Bunu yapmanın başka bir yolu, jQuery'de son alt seçiciyi kullanmak ve ardından .css () yöntemini kullanmaktır. Yine de yorgun olun çünkü bazı insanlar JavaScript devre dışı tarayıcıları kullanarak hala taş devrinde.


0

Sınırı neden UL'nin altına uygulamıyorsunuz?

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

1
Eğer varsa padding-bottomilgili <ul>eleman veya margin-bottomson on <li>elemanı, bu doğru ve alt kısımda istenen yerleştirmenin son olmayacaktır <li>elemanı. Aksi takdirde, bu iyi bir çözümdür.
Wex

0

Öğeleri yüzüyorsanız sırayı tersine çevirebilirsiniz

yani float: right;yerinefloat: left;

Ve sonra bir sınıfın ilk çocuğunu 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ı yalnızca LAST örneğine uygulamaktır çünkü artık ters sırada.

İş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>

-2

CSS'nizin geri kalanını görmeden söylemek zor, ancak !importantbunu yapmak için kenarlık renginin önüne eklemeyi deneyin :

#refundReasonMenu #nav li:last-child
{
  border-bottom: 1px solid #b5b5b5 !important;
}
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.