2011-12-14 7 views
4

CSS(IE7 +)またはjQueryのいずれかのファースト・チャイルドが特定の型を持つ項目を選択する方法はありますか?次のような擬似コードのように最初の子ですべてを選択することができ:私は1つのセレクタでそれを取得したいので、私は解決策の@SLaksを探していましたCSSまたはjQueryが特定の型のfirst-childを取得する

li:first-child(a) 

アップデートは、提案しました。しかし.parent()メソッドの方が高速です、以下を参照してください。http://jsfiddle.net/c4urself/Qw8fX/

$("li > a:first-child").parent() 

$("li:has(>a:first-child)") 

アップデート2

参照jsPerfでここに2つの方法の間の性能差

http://jsperf.com/jquery-has-child-vs-parent-child-and-parent

答えて

4

CSSはこれを行うことはできませんが、jQueryができます:CSSはブラウザがHTMLを読み込むと、前方のみの方法で適用されるように設計されたため、

li:has(>a:first-child) 

CSSはこれを行うことはできません。エレメントの子またはそれに続く兄弟を待つことなく、いつでもに適用されるCSSルールを、に決定できます。あなたはそれの中にネストされたAのスタイルでしょう李項目に必要なスタイルを適用できる第一子の擬似クラス:リチウムを使用してjQueryの$('ul li a:first-child').parent();

+0

恐ろしい!ちょうど私が探していたもの – c4urself

+0

+1のCSS説明 – c4urself

3

+0

ありがとう、私は@ SLAKsの提案に行くつもりです。 – c4urself

+1

@ c4urself:これはやや速いと思います。切り替えた場合、最初に測定してください。もしそうなら、教えてください。私は好奇心が強いですが、怠け者です。 – SLaks

+1

@SLaks .parent()は高速です。http://jsfiddle.net/c4urself/Qw8fX/ – c4urself

0

私はそれがCSSでは可能ではないと思いますが、jQueryではfilter()を使いたいと思います。

contents()に基づいてフィルタリングすることを忘れないでください。children()ではなく、テキストノードが表示されます。

$(function() { 
    $('li').filter(function() { 
    return $(this).contents().first().is('a'); 
    }).each(function() { 
    $('body').append($(this).text() + '<br/>'); 
    }); 
}); 

http://jsbin.com/olufan

これは、jQueryのセレクタでそれをすべて行うよりも、もう少しコードを占めるが、パフォーマンスはかなり良いはずです。 jQueryセレクタは、単一の用語を指定する場合にのみ実際に高速に動作します。

+0

ありがとう、私は李のシンプルな選択を探しています、@ SLaksの実装を参照してください。 – c4urself