難しいCSSセレクターの質問、それが可能かどうかわからない。
これがHTMLレイアウトであるとしましょう:
<div></div>
<div></div>
<div></div>
<div style="display:none"></div>
<div style="display:none"></div>
表示されている最後のdiv
を選択します(つまり、display:none
ではなく)。これは、与えられた例の3番目のdiv
になります。実際のページ上のdiv
sの数は異なる可能性があります(display:none
であっても)。
JavaScriptまたはjQueryを使用してこれを選択およびスタイル設定できますが、CSSだけではこれを実行できません。
たとえば、サイトに jQuery が実装されている場合は、次のようにします。
var last_visible_element = $('div:visible:last');
できれば、選択しているdivの周りにクラス/ IDがラップされていることが望ましいですが、その場合、コードは次のようになります。
var last_visible_element = $('#some-wrapper div:visible:last');
この質問に対する本当の答えは、あなたにはできないということです。 CSSのみの回答の代替はこの質問に対する正しい回答ではありませんが、JSソリューションが受け入れられる場合は、ここでJSまたはjQueryの回答のいずれかを選択する必要があります。ただし、上で言ったように、本当の正しい答えは、:not
で[style*=display:none]
演算子を受け入れない限り、CSSでこれを確実に行うことはできませんです。他のそのような否定セレクタは、インラインスタイルでのみ機能し、全体的に貧弱なソリューションです。
Css値で選択することは不可能だと思います(表示)
編集:
私の意見では、ここでjqueryを少し使用するのが理にかなっています。
$('#your_container > div:visible:last').addClass('last-visible-div');
純粋なJSソリューション(たとえば、jQueryや他のフレームワークを他のものに使用せず、このタスクのためだけにダウンロードしたくない場合):
<div>A</div>
<div>B</div>
<div>C</div>
<div style="display:none">D</div>
<div style="display:none">E</div>
<script>
var divs = document.getElementsByTagName('div');
var last;
if (divs) {
for (var i = 0; i < divs.length; i++) {
if (divs[i].style.display != 'none') {
last = divs[i];
}
}
}
if (last) {
last.style.background = 'red';
}
</script>
インラインスタイルを使用できる場合は、CSSを使用して純粋に行うことができます。
前の要素が表示されているときに、次の要素でCSSを実行するためにこれを使用しています。
div [style = 'display:block;'] + table { filter:blur(3px); }
別の方法で、javascriptを使用してそれを行うことができます。Jqueryでは、次のようなものを使用できます。
$('div:visible').last()
*再編集
CSSでは不可能ですが、jQueryでこれを行うことができます。
jQuery:
$('li').not(':hidden').last().addClass("red");
HTML:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li class="hideme">Item 4</li>
</ul>
CSS:
.hideme {
display:none;
}
.red {
color: red;
}
jQuery(以前のソリューション):
var $items = $($("li").get().reverse());
$items.each(function() {
if ($(this).css("display") != "none") {
$(this).addClass("red");
return false;
}
});