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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1719閲覧

クリックされた要素にクラスが追加されるようにしたい

Yumiko

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2020/03/14 09:07

前提・実現したいこと

JavaScript の addEventListener と classList を使って、クリックされた要素にクラスが追加されるようにしたいのですが…。

発生している問題・エラーメッセージ

クリックしても、そのクラスに指定したスタイルが適用されません。

デベロッパーツールで確認すると、クラスは要素に追加されているのですが、スタイルのところに打消し線が引かれています。

イメージ説明

該当のソースコード

HTML

1<div id="btn">button</div>

css

1#btn { 2 background: #cfcece; 3 font-size: 18px; 4 width: 120px; 5 height: 40px; 6 line-height: 40px; 7 text-align: center; 8 cursor: pointer; 9} 10 11.change { 12 background: #d6a2a2; 13}

JavaScript

1'use strict'; 2{ 3 4const btn = document.getElementById('btn'); 5 6btn.addEventListener ('click', () => { 7 btn.classList.add('change'); 8}); 9 10}

試したこと

今までに書いたコードや学習サイトなどにあるよく似た実装の見本コードをコピーして使ってみたところ、classList に関する処理は問題なく動作したのですが…。

イベントリスナーの中に「btn.textContent = 'hello!';」の処理を入れてみたところ、この処理は問題なく実行されました。ということは、イベント設定の書き方はこれで問題ないということだと思うのですが。

イメージ説明

今回のこのコードの中で、どこに間違いがあるのでしょうか?
ご教示いただけると嬉しく思います。

補足情報(FW/ツールのバージョンなど)

ブラウザは Chrome の最新版です。

s.k👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

idとclassではidのスタイルが優先的に適用されるのでclassを追加しても意味ありません。
idは使わずにclassで対処してください。

基本的には以下のようなルールがありますが詳しくは「セレクタの詳細度」で調べてください。

  • 「 タグ < class < id 」の順に詳細度が高くなり、優先順位が上がる。
  • 「 外部参照 < 内部参照 < インライン指定 」の順に詳細度が高くなる。
  • 子孫セレクタ等でセレクタが複数になっている場合はより詳しく指定されている方が優先される。

html

1<div class="btn">button</div> 2 3<style> 4/* nav */ 5.btn { 6 background: #cfcece; 7 font-size: 18px; 8 width: 120px; 9 height: 40px; 10 line-height: 40px; 11 text-align: center; 12 cursor: pointer; 13} 14 15.change { 16 background: #d6a2a2; 17} 18</style> 19 20 21<script> 22const btn = document.getElementsByClassName('btn'); 23 24btn[0].addEventListener ('click', () => { 25 btn[0].classList.add('change'); 26}); 27</script>

投稿2020/03/14 09:18

編集2020/03/14 09:25
soliste16

総合スコア757

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

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

Yumiko

2020/03/14 23:19

ご教示ありがとうございます。 https://developer.mozilla.org/ja/docs/Web/CSS/Specificity を読んで「セレクタの詳細度」を確認して勉強しました。 今回は、id はスクリプト用、クラスはデザイン用に役割を分けて指定するようにして解決しました。 わかりやすい説明をありがとうございました!
guest

0

とり急ぎの対症療法になりますが、!important を付加すればよいかと思います。

css

1.change { 2 background: #d6a2a2 !important; 3}

追記

より良い改善案のひとつは、 <div id="btn">"btn" をidではなく、classにできないか検討して、できそうであれば以下のようにすることです。

html

1<div class="btn">button</div>

css

1.btn { 2 background: #cfcece; 3 font-size: 18px; 4 width: 120px; 5 height: 40px; 6 line-height: 40px; 7 text-align: center; 8 cursor: pointer; 9} 10 11.change { 12 background: #d6a2a2; 13} 14

javascript

1 const btn = document.querySelector('.btn'); 2 3 btn.addEventListener ('click', () => { 4 btn.classList.add('change'); 5 });

追記2

ある要素に該当するセレクタを持つスタイルが複数あるとき、どれが優先されるのか?という優先順位は、CSSの詳細度(specificity)によって決まります。詳しくは以下を参照されるとよいでしょう。

投稿2020/03/14 09:12

編集2020/03/14 09:38
jun68ykt

総合スコア9058

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

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

Yumiko

2020/03/14 23:10

ご教示ありがとうございます! どちらの方法も試してみたら、うまくいきました。 追記してくださったように、CSS の詳細度を利用したスタイル付けをした方が良いのですね。 今回は、スクリプト用には id を付け、デザインのスタイル用にはクラスを付けて解決することにしました。 丁寧な説明をしてくださり、ありがとうございました。
jun68ykt

2020/03/17 22:51

どういたしまして。 > どちらの方法も試してみたら、うまくいきました。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問