li
CSSを使用してリストの最後の CSS 属性を変更する方法があるかどうか疑問に思っています。の使用を検討しまし:last-child
たが、これは本当にバグがあるようで、うまく動作しません。必要に応じて JavaScript を使用しますが、CSS で解決策を考えられる人がいるかどうか知りたいです。
10 に答える
:last-child
HTMLを変更せずにそれを行う唯一の方法です-しかし、それができると仮定すると、主なオプションはそれを与えることclass="last-item"
です:
li.last-item { /* ... */ }
明らかに、選択した動的ページ生成言語でこれを自動化できます。また、lastChild
W3C DOM には JavaScript プロパティがあります。
Prototypeで必要なことを行う例を次に示します。
$$("ul").each(function(x) { $(x.lastChild).addClassName("last-item"); });
またはもっと簡単に:
$$("ul li:last-child").each(function(x) { x.addClassName("last-item"); });
jQueryでは、さらにコンパクトに記述できます。
$("ul li:last-child").addClass("last-item");
また、これは実際の CSS セレクターを使用しなくても機能することに注意してくださいlast-child
。むしろ、JavaScript の実装が使用されます。そのため、バグが少なく、ブラウザー間での信頼性が高くなるはずです。
私は純粋な CSS でこれを行いました (おそらく、私は未来から来たためです - 他の誰よりも 3 年後 :P )
リストがあるとします:
<ul id="nav">
<li><span>Category 1</span></li>
<li><span>Category 2</span></li>
<li><span>Category 3</span></li>
</ul>
次に、最後の項目のテキストを簡単に赤くすることができます:
ul#nav li:last-child span {
color: Red;
}
私は通常、CSS と JavaScript のアプローチを組み合わせて、IE6/7 を除くすべてのブラウザーで JavaScript なしで動作し、IE6/7 では JavaScript をオン (ただしオフではない) で動作させます。これらは:last-child
疑似クラスをサポートしていないためです。
$("li:last-child").addClass("last-child");
li:last-child,li.last-child{ /* ... */ }
IE7 +およびその他のブラウザの代替手段の1つは:first-child
、代わりに使用して、スタイルを反転することです。
たとえば、それぞれにマージンを設定している場合li
:
ul li {
margin-bottom: 1em;
}
ul li:last-child {
margin-bottom: 0;
}
これで置き換えることができます:
ul li {
margin-top: 1em;
}
ul li:first-child {
margin-top: 0;
}
これは、ボーダーのような他のいくつかのケースでうまく機能します。
サイトポイントによると、:first-child
バグがありますが、一部のルート要素(doctypeまたはhtml)を選択する範囲でのみ、他の要素が挿入されてもスタイルが変更されない場合があります。
私は通常、htc ファイル (例: last-child.htc) を作成してこれを行います。
<attach event="ondocumentready" handler="initializeBehaviours" />
<script type="text/javascript">
function initializeBehaviours() {
this.lastChild.className += ' last-child';
}
</script>
そして、IE 条件付き css ファイルから次のように呼び出します。
ul { behavior: url("/javascripts/htc/last-child.htc"); }
私のメインのcssファイルでは、次のようになりました。
ul li:last-child,
ul li.last-child {
/* some code */
}
.last-child クラスを定義せずに既存の css マークアップを使用する別のソリューション (遅いですが) は、Dean Edwards ie7.jsライブラリです。
:last-childはCSS3であり、IEをサポートしていませんが、:first-childはCSS2ですが、jqueryを使用して実装する安全な方法は次のとおりです。
$('li').last().addClass('someClass');
$('li').last().addClass('someClass');
複数ある場合
たとえば、リストに3つのliがあることがわかっている場合は、次のように実行できます。
li + li + li { /* Selects third to last li */
}
IE6では、次の式を使用できます。
li {
color: expression(this.previousSibling ? 'red' : 'green'); /* 'green' if last child */
}
:last-child
ただし、セレクターのサポートが向上するまでは、特殊なクラスまたはJavascript(IE6式ではない)を使用することをお勧めします。