私の目標は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>
only最後の子を選択するにはどうすればよいですか?
:last-child
擬似クラスは、ブラウザ間で確実に使用することはできません。特に、Internet Explorerバージョン<9、およびSafari <3.2 サポートしない 、ただしInternet Explorer 7およびSafari 3.2do:first-child
をサポートしています。
最善の策は、そのアイテムにlast-child
(または同様の)クラスを明示的に追加し、代わりにli.last-child
を適用することです。
あなたのために働くかもしれない別の解決策は、関係を逆にすることです。したがって、すべてのリストアイテムに境界線を設定します。次に、first-childを使用して、最初のアイテムの境界線を削除します。最初の子はすべてのブラウザーで静的にサポートされます(つまり、他のコードから動的に追加することはできませんが、最初の子はCSS2セレクターであり、最後の子はCSS3仕様で追加されました)
注:これは、例のようにリストに2つのアイテムしかない場合に、意図したとおりに機能します。 3番目以降のアイテムには境界線が適用されます。
Javascriptを使用できると思われる場合は、jQueryがlast-child
をサポートしているため、jQueryのcssメソッドを使用でき、ほぼすべてのブラウザーをサポートします。
サンプルコード:
$(function(){
$("#nav li:last-child").css("border-bottom","1px solid #b5b5b5")
})
ここに関する詳細情報を見つけることができます: http://api.jquery.com/css/#css2
リスト項目の数が固定されている場合、隣接するセレクターを使用できます。 <li>
要素が3つしかない場合は、最後の<li>
を選択できます:
#nav li+li+li {
border-bottom: 1px solid #b5b5b5;
}
CSS3セレクターが頻繁に必要な場合は、サイトでselectivizrライブラリをいつでも使用できます。
これは、そうでなければサポートしないブラウザーにほとんどすべてのCSS3セレクターのサポートを追加するJSスクリプトです。
IE条件付きで<head>
タグにスローします:
<!--[if (gte IE 6)&(lte IE 8)]>
<script src="/js/selectivizr-min.js" type="text/javascript"></script>
<![endif]-->
もう1つの方法は、jQueryで最後の子セレクターを使用してから、.css()メソッドを使用することです。ただし、JavaScriptが無効になっているブラウザを使用している一部の人々はまだ石器時代であるため、疲れています。
クラスを使用する代わりに、詳細リストを使用して、子dt要素に1つのスタイルを設定し、子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>
どちらの方法も他の方法より優れているわけではなく、個人の好み次第です。
要素をフローティングにしている場合、順序を逆にすることができます
すなわち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>
ULの下部に境界線を適用しないのはなぜですか?
#refundReasonMenu #nav ul
{
border-bottom: 1px solid #b5b5b5;
}