最後に表示されるdivを取得するためのCSSセレクター


161

トリッキーなCSSセレクターの質問です。それが可能かどうかはわかりません。

これがHTMLレイアウトであるとしましょう:

<div></div>
<div></div>  
<div></div>  
<div style="display:none"></div>
<div style="display:none"></div>  

div表示されている最後のを選択したい(つまり、ではないdisplay:none)。これはdiv、与えられた例では3番目になります。div実際のページのs の数は(1でもdisplay:none)異なる場合があります。

回答:


62

これをJavaScriptまたはjQueryで選択してスタイルを設定することもできますが、CSSだけではこれを行うことはできません。

たとえば、サイトにjQueryを実装している場合は、次のようにします。

var last_visible_element = $('div:visible:last');

うまくいけば、選択しているdivの周りにクラス/ IDがラップされるでしょう。その場合、コードは次のようになります。

var last_visible_element = $('#some-wrapper div:visible:last');

22
質問は明らかに「JQuery CSSセレクター」ではなく、「A CSSセレクター」と言っています。これは受け入れられるはずですANSWER = P
AgelessEssence

2
これは、確かに、元の質問に対する答えです。質問者がjavascriptまたはjqueryについて言及したことはなく、それらのタグは別の回答者によって追加されました。1影響を受ける-実際にjQueryが必要ですか?もしそうなら、実際にそれをあなたの質問に入れてください。それ以外の場合は、代わりにこの答えを受け入れる必要があります。
2013年

OPにはjQueryが受け入れられると思います。結局、それは受け入れられた解決策でした。
Surreal Dreams

7
Whhyyyyが最初の答えallllwaaayyysss jqueryですか?これはCSSの質問に対するJavaScriptの回答です。CSS!== javascript
dudewad 2017

2
@dudewad:最初の文の最後の部分をご覧ください:「CSSだけではこれはできません。」答えはそれでそれを残すかもしれません、目の前に代替案はありません...または代替案を提供します。しかし、この回答は、CSSが要求されていることを実行できないと実際に述べているため、少なくともデューデリジェンスを実行しています(理由は詳しく説明していません)。一方、質問のCSSの性質を認識せずにJavaScriptソリューションでうまくいく答え、批判する価値があります。
BoltClock

23

この質問に対する本当の答えは、あなたはそれを行うことができないということです。CSSのみの回答に代わる方法はこの質問に対する正しい回答ではありませんが、JSソリューションが受け入れられる場合は、JSまたはjQueryの回答のいずれかをここで選択する必要があります。ただし、上記で述べたように、真の正しい答えは、インラインスタイルでのみ機能し、全体的に貧弱なとその他の否定されたセレクターで演算子を受け入れる用意がない限り、CSSで確実にこれを行うことはできないということです。解決。:not[style*=display:none]


まず、私はあなたに同意しますが、あなたが:not述べたように演算子を使用することは特定の状況で機能することができると思います。たとえば、これは、JSが要素を非表示にしてインラインスタイルを追加する私の状況で完全に機能し、したがって、ソリューションは実際に完全に機能します:)
doz87

1
まあ、それから私はうまくいくと思います:)私は理想主義者のほんの少しです、そして私は物事が最高ではないところを強調したいです、何が「ハッキー」で何がそうでないのかを区別できることが重要ですそれは私たちすべてをより良いプログラマーにします。
dudewad 2017

ええ、そうですね。このソリューションは、OPクエリのcssのみのソリューションとして使用すべきではないことに同意します。ただし、JSと組み合わせて使用​​すると、非常にうまく機能すると思います。
doz87

(インラインスタイルの代わりに)CSSクラスを使用して要素を非表示にすることもできます。その場合は、その非表示クラスのセレクターを無効にすることもできます。どちらも同じCSSクラスによって設定されるため、これは常に同じ非表示のものを選択します。だからあなたの答えは正しい方向に行きますが、十分ではありません。:-)
ygoe

8

インラインスタイルを使用できる場合は、純粋にCSSでそれを行うことができます。

前の要素が表示されているときに、次の要素でCSSを実行するためにこれを使用しています。

div [style = 'display:block;'] + table {
  フィルター:blur(3px);
}

1
私はそれを変更します[style*='display: block']、それが持っている可能性があるためdisplay: block !important;か、単に<div style="display: block">:-)
オジー

これは、このようなcssファイルで機能します.btn-group > .btn.d-none + .btn(ブートストラップの入力グループに使用されます)
Jean-Charbel VANNIER

7

CSS値(表示)では選択できないと思います

編集:

私の意見では、ここで少しjqueryを使用することは理にかなっています:

$('#your_container > div:visible:last').addClass('last-visible-div');

6

純粋な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>

http://jsfiddle.net/uEeaA/90/


スニペット、jQuery以外の唯一の返信をありがとう!ただし、jsfiddle.net / uEeaA / 100に適用する複数の親要素がある場合、これは機能しません-機能する他のソリューションを構築するのに役立ちますか?私はそれが必要です、他の人はそれが必要なので、助けてください:)
mnsth

私はこれが古いスレッドであることを理解していますが、将来のビジターのために、jsfiddle.net
uEeaA

私はあなたがjQueryを落としただけでこれに賛成票を投じたかったのです。私の唯一の不満は、divがスタイルパラメータだけでなく、さまざまな方法でビューから非表示にできることです。非常に簡単:[1]幅と高さを0に設定でき、[2]変換スケールを0にでき、[3]表示可能な領域の外に配置できます。
マーカス2016年


2

別の方法では、javascriptを使用してそれを行うことができます。Jqueryでは次のようなものを使用できます。

$('div:visible').last()

*再編集


2

CSSでは不可能ですが、jQueryでこれを行うことができます。

JSFIDDLEデモ

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;
    }

});

3
これはのjQueryの多くです$('li:visible:last').addClass('red')
アレックス、2014

え?$('li').not(':hidden').last().addClass("red");
martynas 2014


-6

これでうまくいきました。

.alert:not(:first-child){
    margin: 30px;
}

3
あなたは質問に答えていません
Serginho
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.