以下を純粋なCSSに置き換えることが可能かどうか疑問に思っています。
$('.child:visible:first').css({'border-top':'1px solid #cccccc','border-bottom':'1px solid #cccccc'});
私は解決策を見つけることができないようです。
抽象的に言えば、それは不可能です。jQuery は、DOM をトラバースして、さまざまな条件に適合する要素をプログラムで判断し、停止することに依存しています。これはできません。しかし、実際には、さまざまなことを知っていると思います。このソリューションは、次のことを前提としています。
.child
それらはdisplay: none
インライン スタイルとして使用されますか (jQuery を使用した場合は使用さ.hide()
れます)。彼らはのクラスを持ってい.hidden
ますか? メソッドを知っている限り、これを表すために使用できるセレクターがあります。:not()
これは、CSS3セレクターと組み合わせて使用できます。.child
、すべて兄弟であると想定しています。他の.child
要素内にネストされているものはなく、すべて同じ親を共有しています。上記のいずれかが当てはまらない場合、それは不可能です。しかし、両方とも true の場合:
.child:not( [style*='display: none'] ) {
border-top: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
}
.child:not( [style*='display: none'] ) ~ .child:not( [style*='display: none'] ) {
/* ...or whatever the default styles are */
border-top: none;
border-bottom: none;
}
:not()
疑似クラスは非常に明白です。含まれているセレクターに一致しない要素のみを選択します。~
演算子は、右側のセレクターが、ソース コードの後に現れる左側のセレクターの兄弟である場合、ターゲットになることを意味します。
隠蔽がどのように実装されているかを知っていれば可能です。たとえば、これはうまくいきます:
li:first-child[style*="display:none"] + li:not([style*="display:none"]) {
/* ... */
background-color: blue;
}
<ul>
<li style="display:none">hello</li>
<li>World!</li>
</ul>
この 例を試してください
ul li{
background: lightslategrey
}
li:first-child{
background: blue;
}
ul li[style*="display:none"] + li:not([style*="display:none"]){
background: blue;
}
ul li:not([style*="display:none"]) + li{
background: blue;
}
ul > li:not([style*="display:none"]) ~ *{
background: lightslategrey!important;
}
純粋な CSS では、それは不可能です。Chris Coyier は:firstを純粋な jQuery コンストラクトとしてリストしました: http://css-tricks.com/pseudo-class-selectors/。
私の場合、 次のコードでそれを達成することができた最初のliの前に、パディングを与えるだけで済みました。
ul:before {
content: ' ';
height: 15px;
display: block;
}
ただし、特定のcssを指定したい場合は、他の回答で言及されているトリックに従う必要があります。
私のすべてのli要素は、最初にボーダートップがあることを期待しています。
したがって、最初の li が非表示になっていても、2 番目の要素にはまだボーダートップが表示されていました。上記のコードを更新して、すべてのli要素に border-top があることを確認し、マージン トリックを使用して最初の border-top を非表示にしました
ul {
content: ' ';
height: 15px;
display: block;
margin-bottom: -1px; // (update as per the width of your border-top)*
z-index: 2;
position: relative;
}
border-top が 3px の場合、margin-bottom は -3px になり、それを高さに追加してバランスをとります (18px)。
CSS には:visibleセレクターがないため、これらは単なるトリックです。