質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

9860閲覧

指定した属性を持たない要素の中でも最後の要素にスタイルを当てたい

nae_stage

総合スコア274

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2016/04/19 11:46

###前提・実現したいこと
CSSで、「指定した属性を持たない要素の中でも最後の要素にスタイルを当てる」ということは実現できますでしょうか?

<ul>内で<li>をいくつかdisplay:none;に設定しています。 display:noneを持つ<li>以外の<li>のうち、最後の<li>にのみスタイルを適用したいです。 (下記例の場合、<li>リスト3</li>にのみスタイルを適用したいです。)

なお、下記CSSを書いてみましたが、どの要素にもスタイルが適用されませんでした。
:not()より:last-of-typeの方が先に検索されてしまうということなのでしょうか・・・

###該当のソースコード

HTML

1<ul> 2 <li style='display:none;'>リスト1</li> 3 <li>リスト2</li> 4 <li>リスト3</li> 5 <li style='display:none;'>リスト4</li> 6 <li style='display:none;'>リスト5</li> 7</ul>

CSS

1ul li:not([style='display:none;']):last-of-type{ 2 background-color:red; 3}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

CSSのセレクタは右から左に解釈されていくので、:not([style="display:none;"])のセレクタによって:last-of-childで指定している<li style='display:none;'>リスト5</li>が除外されています。
HTMLの方を<li>リスト5</li>とすると、:not([style="display:none;"])から外れてbackground-color:red;が適用されることを確認できるはずです。
個人的には:not([style="display:none;"])がそもそも不要なのではないかと思うのですが、どのような意図があるのか教えて下されば解決に繋がる回答を出せるかもしれません。

CSS

1ul li:last-of-type { 2 background-color: red; 3}

追記
すみません、質問を勘違いしていました。
<li>リスト3</li>にスタイルを当てたいと書いてありますね…。

追記
kei344さんが仰っているように、現状のCSSセレクタでは対応できません。
これに対応可能なJavaScriptを用意したので、よろしければ試してみてください。
確認しやすいようにHTMLごとコードを記載しておきます。

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="utf-8"> 5<title>example</title> 6<meta http-equiv="X-UA-Compatible" content="IE=edge"> 7<meta name="viewport" content="width=device-width, initial-scale=1.0"> 8<style type="text/css"> 9.last-child { 10 background-color: red; 11} 12</style> 13<script type="text/javascript"> 14;( function() { 15 // displayプロパティの値がnoneではない最後の子要素にクラスを追加する関数 16 function visible_last_child() { 17 // .visible-last を与えられた要素(ul)を取得 18 var elements = document.getElementsByClassName('visible-last'); 19 // 要素(ul)の数を取得 20 var l = elements.length; 21 // for ループ処理用の変数を宣言 22 var element, children, c, child, target; 23 24 // .visible-last を与えられた要素(今回はul要素に指定)を個別に取得するためのループ 25 for (var i = 0; i < l; ++i) { 26 // 個別の要素(ul)を取得 27 element = elements[i]; 28 // 子要素(li)を取得 29 children = element.children; 30 // 子要素(li)の数を取得 31 c = children.length; 32 33 // 子要素(li)を個別に取得するためのループ 34 for (var j = 0; j < c; ++j) { 35 // 子要素(li)を個別に取得 36 child = children[j]; 37 38 // displayプロパティの値がnone以外の子要素を取得 39 if (child.style.display !== 'none') { 40 // 変数targetに子要素を代入 41 target = child; 42 } 43 } 44 45 // 変数targetに最後に代入された要素にクラスを追加 46 // 他のクラスがあるときはスペースを空けて.last-childを追加 47 if (target.className) { 48 target.className = target.className + ' last-child'; 49 50 // 他にクラスがないときはそのまま.last-childを追加 51 } else { 52 target.className = 'last-child'; 53 } 54 } 55 } 56 57 // DOMを読み込み終えたときにvisible_last_child()を実行 58 document.addEventListener('DOMContentLoaded', visible_last_child, false); 59}()); 60</script> 61</head> 62<body> 63<!-- .visible-lastを追加した要素が対象になる --> 64<ul class="visible-last"> 65 <li style="display:none;">リスト1</li> 66 <li>リスト2</li> 67 <li>リスト3</li><!-- displayプロパティの値がnoneである要素を除いた最後の要素に.last-childが追加される --> 68 <li style="display:none;">リスト4</li> 69 <li style="display:none;">リスト5</li> 70</ul> 71</body> 72</html>

ちなみに、このコードは動的な変化(display: none;を動的に付け外しするなど)には対応していないので、そのような動的な処理がある場合にはそちらにも同様の処理を追加する必要があることに注意してください。

投稿2016/04/19 14:59

編集2017/01/27 08:41
flat

総合スコア617

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nae_stage

2016/04/19 23:16

分かりやすい回答ありがとうございます! 現状のCSSでは不可能なのですね・・・ javascriptのコードもありがとうございます。大変助かります! さっそく試してみようと思います!
guest

0

:last-of-type はタイプ(タグ)の中の最後なので、:not で「絞り込んだ物の中の最後」という挙動にはなりません。

【:last-of-type - CSS | MDN】
https://developer.mozilla.org/ja/docs/Web/CSS/:last-of-type

そのため、CSS でご質問の挙動は不可能だと思います。style="display:none;" と書かれているので、サーバ側もしくはJavaScript で出力されているとは思うのですが、そちらで解決されたほうがよいでしょう。

投稿2016/04/19 16:40

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nae_stage

2016/04/19 23:19

分かりやすい回答ありがとうございます! 「:notで「絞り込んだ物の中の最後」という挙動にはならない」という点、勘違いしておりましたので、大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問