teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

コード内のコメントを修正

2017/01/27 08:41

投稿

flat
flat

スコア617

answer CHANGED
@@ -31,14 +31,14 @@
31
31
  ;( function() {
32
32
  // displayプロパティの値がnoneではない最後の子要素にクラスを追加する関数
33
33
  function visible_last_child() {
34
- // .select-last-item を与えられた要素(ul)を取得
34
+ // .visible-last を与えられた要素(ul)を取得
35
35
  var elements = document.getElementsByClassName('visible-last');
36
36
  // 要素(ul)の数を取得
37
37
  var l = elements.length;
38
38
  // for ループ処理用の変数を宣言
39
39
  var element, children, c, child, target;
40
40
 
41
- // .select-last-item を与えられた要素(今回はul要素に指定)を個別に取得するためのループ
41
+ // .visible-last を与えられた要素(今回はul要素に指定)を個別に取得するためのループ
42
42
  for (var i = 0; i < l; ++i) {
43
43
  // 個別の要素(ul)を取得
44
44
  element = elements[i];

4

コード修正

2017/01/27 08:41

投稿

flat
flat

スコア617

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
24
24
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
25
  <style type="text/css">
26
- .last-item {
26
+ .last-child {
27
27
  background-color: red;
28
28
  }
29
29
  </style>

3

追記とコードの微修正

2016/04/20 03:57

投稿

flat
flat

スコア617

answer CHANGED
@@ -60,13 +60,13 @@
60
60
  }
61
61
 
62
62
  // 変数targetに最後に代入された要素にクラスを追加
63
- // 他のクラスがあるときはスペースを空けて.last-itemを追加
63
+ // 他のクラスがあるときはスペースを空けて.last-childを追加
64
64
  if (target.className) {
65
- target.className = target.className + ' last-item';
65
+ target.className = target.className + ' last-child';
66
66
 
67
- // 他にクラスがないときはそのまま.last-itemを追加
67
+ // 他にクラスがないときはそのまま.last-childを追加
68
68
  } else {
69
- target.className = 'last-item';
69
+ target.className = 'last-child';
70
70
  }
71
71
  }
72
72
  }
@@ -81,10 +81,11 @@
81
81
  <ul class="visible-last">
82
82
  <li style="display:none;">リスト1</li>
83
83
  <li>リスト2</li>
84
- <li>リスト3</li><!-- displayプロパティの値がnoneである要素を除いた最後の要素に.last-itemが追加される -->
84
+ <li>リスト3</li><!-- displayプロパティの値がnoneである要素を除いた最後の要素に.last-childが追加される -->
85
85
  <li style="display:none;">リスト4</li>
86
86
  <li style="display:none;">リスト5</li>
87
87
  </ul>
88
88
  </body>
89
89
  </html>
90
- ```
90
+ ```
91
+ ちなみに、このコードは動的な変化(`display: none;`を動的に付け外しするなど)には対応していないので、そのような動的な処理がある場合にはそちらにも同様の処理を追加する必要があることに注意してください。

2

JavaScriptによる対応コードを追記

2016/04/19 16:59

投稿

flat
flat

スコア617

answer CHANGED
@@ -8,4 +8,83 @@
8
8
  ```
9
9
  **追記**
10
10
  すみません、質問を勘違いしていました。
11
- `<li>リスト3</li>`にスタイルを当てたいと書いてありますね…。
11
+ `<li>リスト3</li>`にスタイルを当てたいと書いてありますね…。
12
+
13
+ **追記**
14
+ kei344さんが仰っているように、現状のCSSセレクタでは対応できません。
15
+ これに対応可能なJavaScriptを用意したので、よろしければ試してみてください。
16
+ 確認しやすいようにHTMLごとコードを記載しておきます。
17
+ ```HTML
18
+ <!DOCTYPE html>
19
+ <html lang="ja">
20
+ <head>
21
+ <meta charset="utf-8">
22
+ <title>example</title>
23
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
24
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
+ <style type="text/css">
26
+ .last-item {
27
+ background-color: red;
28
+ }
29
+ </style>
30
+ <script type="text/javascript">
31
+ ;( function() {
32
+ // displayプロパティの値がnoneではない最後の子要素にクラスを追加する関数
33
+ function visible_last_child() {
34
+ // .select-last-item を与えられた要素(ul)を取得
35
+ var elements = document.getElementsByClassName('visible-last');
36
+ // 要素(ul)の数を取得
37
+ var l = elements.length;
38
+ // for ループ処理用の変数を宣言
39
+ var element, children, c, child, target;
40
+
41
+ // .select-last-item を与えられた要素(今回はul要素に指定)を個別に取得するためのループ
42
+ for (var i = 0; i < l; ++i) {
43
+ // 個別の要素(ul)を取得
44
+ element = elements[i];
45
+ // 子要素(li)を取得
46
+ children = element.children;
47
+ // 子要素(li)の数を取得
48
+ c = children.length;
49
+
50
+ // 子要素(li)を個別に取得するためのループ
51
+ for (var j = 0; j < c; ++j) {
52
+ // 子要素(li)を個別に取得
53
+ child = children[j];
54
+
55
+ // displayプロパティの値がnone以外の子要素を取得
56
+ if (child.style.display !== 'none') {
57
+ // 変数targetに子要素を代入
58
+ target = child;
59
+ }
60
+ }
61
+
62
+ // 変数targetに最後に代入された要素にクラスを追加
63
+ // 他のクラスがあるときはスペースを空けて.last-itemを追加
64
+ if (target.className) {
65
+ target.className = target.className + ' last-item';
66
+
67
+ // 他にクラスがないときはそのまま.last-itemを追加
68
+ } else {
69
+ target.className = 'last-item';
70
+ }
71
+ }
72
+ }
73
+
74
+ // DOMを読み込み終えたときにvisible_last_child()を実行
75
+ document.addEventListener('DOMContentLoaded', visible_last_child, false);
76
+ }());
77
+ </script>
78
+ </head>
79
+ <body>
80
+ <!-- .visible-lastを追加した要素が対象になる -->
81
+ <ul class="visible-last">
82
+ <li style="display:none;">リスト1</li>
83
+ <li>リスト2</li>
84
+ <li>リスト3</li><!-- displayプロパティの値がnoneである要素を除いた最後の要素に.last-itemが追加される -->
85
+ <li style="display:none;">リスト4</li>
86
+ <li style="display:none;">リスト5</li>
87
+ </ul>
88
+ </body>
89
+ </html>
90
+ ```

1

追記

2016/04/19 16:49

投稿

flat
flat

スコア617

answer CHANGED
@@ -5,4 +5,7 @@
5
5
  ul li:last-of-type {
6
6
  background-color: red;
7
7
  }
8
- ```
8
+ ```
9
+ **追記**
10
+ すみません、質問を勘違いしていました。
11
+ `<li>リスト3</li>`にスタイルを当てたいと書いてありますね…。