🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

CSS

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

Q&A

解決済

1回答

1518閲覧

javascript: クリックした時のpタグの背景の色が変わるようにしたい

nanase21

総合スコア144

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

CSS

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

0グッド

0クリップ

投稿2019/12/07 17:15

編集2019/12/08 03:48

#実現したいこと
デフォルトでtabindex=1に背景色がかかるようにし、他の要素をクリックした時に背景色が変わるのと、その中のPタグの要素を抜き出す方法を知りたい
補足
divの要素は、保存されたデータの数の分だけ描画されるので事前に、idなどを不要することができません。

#できていることと困っていること
クリックすると、背景色が赤に変わるところまでできており、デフォルトでtabindex=1に背景色をつけることができずに困っています。

html

1<div class="hoge" tabindex="1"> 2<p class="item-name">Section 1</p> 3<p class="description">description 1</p> 4</div> 5 6<div class="hoge" tabindex="2"> 7<p class="item-name">Section 2</p> 8<p class="description">description 2</p> 9</div> 10 11<div class="hoge" tabindex="3"> 12<p class="item-name">Section 3</p> 13<p class="description">description 3</p> 14</div> 15 16<!-- 要素がクリックされた時に、下記のinputのvalueに反映させたい --> 17<input type="text" value="Section 1" id="input-item"> 18<input type="text" value="description 1" id="input-description">

css

1.hoge:focus { 2 background-color:red; 3}

追記
cssを以下のようにしました。
これで、デフォルトでtabindex="1"に背景色が付くようになったのすが他の要素をクリックしてもデフォルトのままで残ってしまいます。
動くサンプル

css

1.hoge[tabindex="1"]{ 2 background-color:red; 3} 4.hoge:focus { 5 background-color:red; 6}

追記
違う方法でのアプローチ

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

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

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

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

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

kei344

2019/12/07 17:54

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
m.ts10806

2019/12/07 21:03

>クリックすると、背景色が赤に変わるところ この部分のコードを記載してください。 でないと「その部分も含めたコードをください」という作業依頼にもなりますし、「そのように組んだら出来ます」程度のアドバイスしか来ないと思います
nanase21

2019/12/08 03:11

今回の質問の目的としては、デフォルトでpタグのtabindex=1に背景色がつくようにしたいのが目的になります。 加えて、jsの中身の要素を取得する方法が分かればどのようにしたら実現できるかご教示いただけたら嬉しいなと思っていました。
m.ts10806

2019/12/08 03:26

「クリック」とタグからJavaScriptかと思ったのですがCSSのみということでしょうか?それともJavaScriptは全く組めてないということでしょうか
nanase21

2019/12/08 03:52

現在進行形で私の方でも色々試していて質問に試した動くサンプルを追記しました。 今私ができていることとしては、事前に要素の数が確定していてgetElementByIdでidを降っている場合にはクリックした要素の背景色の変更と要素内のtextContentをinputに反映させることまでできております。 出来ない事としては、事前に要素の数が確定していなくてidが振れない時に意図した処理が実現することができなくて困っています。
guest

回答1

0

ベストアンサー

デフォルトでtabindex=1に背景色がかかるようにし、他の要素をクリックした時に背景色が変わる

:focus-within 擬似クラスにより .hoge がフォーカスを持つかどうかを調べ、持っていない場合最初の .hoge へスタイルを適用する、というように質問者さんの実現したい装飾は可能です (動作確認用リンク)。

HTML

1<div class="tab"> 2 <div class="hoge" tabindex="1"> 3 <p class="item-name">Section 1</p> 4 <p class="description">description 1</p> 5 </div> 6 7 <div class="hoge" tabindex="2"> 8 <p class="item-name">Section 2</p> 9 <p class="description">description 2</p> 10 </div> 11 12 <div class="hoge" tabindex="3"> 13 <p class="item-name">Section 3</p> 14 <p class="description">description 3</p> 15 </div> 16</div> 17 18<input type="text" value="Section 1" id="input-item"> 19<input type="text" value="description 1" id="input-description">

CSS

1.tab:not(:focus-within) > .hoge:first-child, 2.hoge:focus { 3 background: red; 4}

その中のPタグの要素を抜き出す方法を知りたい

これは JavaScript で行います。フォーカスに変化があったとき、各タブのいずれかがフォーカスを持つ場合はそのタブのテキストを、いずれの要素もフォーカスを持たない場合は最初のタブのテキストを input タグへ設定すれば良いことになります。そのため、 focusin, focusout イベントを用いて以下のように書くことが出来ます (動作確認用リンク)。

JavaScript

1const tab = document.querySelector(".tab"); 2const item = document.getElementById("input-item"); 3const description = document.getElementById("input-description"); 4 5const text = (selector, target = tab.firstElementChild) => 6 target.querySelector(selector).textContent.trim(); 7 8tab.addEventListener("focusin", event => { 9 const target = event.target; 10 [item.value, description.value] = [ 11 text(".item-name", target), 12 text(".description", target) 13 ]; 14}); 15 16tab.addEventListener("focusout", event => { 17 if (!tab.contains(event.relatedTarget)) 18 [item.value, description.value] = [ 19 text(".item-name"), 20 text(".description") 21 ]; 22});

上記の 2 つを合わせると、以下のようになり、これはタブが 3 つ以上に増えたとしても対応出来ていることがわかります (動作確認用リンク)。

HTML

1<div class="tab"> 2 <div class="hoge" tabindex="1"> 3 <p class="item-name">Section 1</p> 4 <p class="description">description 1</p> 5 </div> 6 7 <div class="hoge" tabindex="2"> 8 <p class="item-name">Section 2</p> 9 <p class="description">description 2</p> 10 </div> 11 12 <div class="hoge" tabindex="3"> 13 <p class="item-name">Section 3</p> 14 <p class="description">description 3</p> 15 </div> 16 17 <div class="hoge" tabindex="4"> 18 <p class="item-name">Section 4</p> 19 <p class="description">description 4</p> 20 </div> 21 22 <div class="hoge" tabindex="5"> 23 <p class="item-name">Section 5</p> 24 <p class="description">description 5</p> 25 </div> 26</div> 27 28<input type="text" value="Section 1" id="input-item"> 29<input type="text" value="description 1" id="input-description">

CSS

1.tab:not(:focus-within)>.hoge:first-child, 2.hoge:focus { 3 background: red; 4}

JavaScript

1const tab = document.querySelector(".tab"); 2const item = document.getElementById("input-item"); 3const description = document.getElementById("input-description"); 4 5const text = (selector, target = tab.firstElementChild) => 6 target.querySelector(selector).textContent.trim(); 7 8tab.addEventListener("focusin", event => { 9 const target = event.target; 10 [item.value, description.value] = [ 11 text(".item-name", target), 12 text(".description", target) 13 ]; 14}); 15 16tab.addEventListener("focusout", event => { 17 if (!tab.contains(event.relatedTarget)) 18 [item.value, description.value] = [ 19 text(".item-name"), 20 text(".description") 21 ]; 22});

投稿2019/12/08 04:33

編集2019/12/08 04:35
s8_chu

総合スコア14731

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

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

nanase21

2019/12/08 04:41

ご教示いただきありがとうございます。 querySelectorの使い方やcssの使い方についてとても勉強になりました。
nanase21

2019/12/08 05:25 編集

今、ご教示いただいたコードを色々試してみたのですが一度要素を選択後に他の要素をクリックしてしまうとデフォルトのtabindex="1"の要素に戻ってしまうのですがどのようにしたら回避できるのでしょうか? js側では、focusoutの処理をコメントアウトすることにより他の要素をクリックしても書き換えたinputがデフォルトのvalueに戻らなくなったのですがcss側の処理の制御の仕方がわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問