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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

4回答

520閲覧

どこクリックしても同じイベントが起こるようにしたい

satoshickkk

総合スコア53

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クリップ

投稿2018/11/02 02:52

###実行したい事
①名前をクリックする
②非表示にしていたものが出てくる(アコーディオン)
③画像をクリックしたときも同じイベントが起きる
④名前をクリックしても画像を切り替えたい(オープン→クローズ)

###分からないこと
名前をクリックしたときは②非表示にしていたものが出てくるが
画像をクリックしてもオープン→クローズの画像切り替えのみで②非表示にしているものが出てきません。
.staff_btnをクリックの部分に入れれば動くかな…?と思い入れてみましたが、
両方動かなくなったので.staff_btnをクリックイベントから省いています。

.staff_nameクリック→ .staff_bunの内容が出てくる&.staff_btnの画像が切り替わる
.staff_btnクリック→ .staff_bunの内容が出てくる&.staff_btnの画像が切り替わる

どっちをクリックしても同じ動きをするように実装したいです。

↓WEB上で動くようにしました。
https://jsfiddle.net/80orvLmx/

HTML

1<div> 2 <div class="staff_in"> 3 <div class="staff_name"> 4 <h3>ここに名前</h3> 5 <img src="https://placehold.jp/150x150.png" alt="" class="staff_kao" > 6 </div> 7 <div class="staff_bun"> 8 <div> 9 <dl> 10 <dt>Q1</dt> 11 <dd>A1</dd> 12 <dt>Q2</dt> 13 <dd>A2</dd> 14 <dt>Q3</dt> 15 <dd>A3</dd> 16 </dl> 17 </div> 18 </div> 19 <div class="staff_btn"> 20 <img class="onoff-btn" src="https://placehold.jp/30x30.png"> 21 </div> 22 </div> 23 </div> 24 25 <script> 26 var onoff = "off"; 27 var onimg = "https://placehold.jp/ffffff/ffffff/30x30.png"; 28 var offimg = "https://placehold.jp/30x30.png"; 29 30 $('.onoff-btn').click(function() { 31 switch (onoff) { 32 case "off": 33 onoff = "on"; 34 $(this).attr('src',onimg); 35 break; 36 case "on": 37 onoff = "off"; 38 $(this).attr('src',offimg); 39 break; 40 } 41 }); 42</script>

javascript

1$(function() { 2 //パネルを非表示 3 $('.staff_bun').hide(); 4 $('.staff_name') 5 .click(function(e){ 6 //クリックでパネルを開く 7 $('+.staff_bun', this).slideToggle(500); 8 }) 9});

css

1.staff_in{ 2 background: red; 3 padding: 40px 40px 70px 40px; 4 width: 520px; 5 cursor: pointer; 6 cursor: hand; 7 position: relative; 8} 9.staff_btn{ 10 position: absolute; 11 padding-top:30px; 12 left: 50%; 13 transform: translateX(-50%); 14} 15 16.staff_name{ 17 position: relative; 18 padding-left: 30px; 19} 20.staff_name img{ 21 position: absolute; 22 top:-95px; 23 right:0; 24} 25.staff_name h3{ 26 font-size:3em; 27 line-height: 0.8em; 28} 29.staff_bun{ 30 background: #fff; 31 border-radius: 40px; 32 margin-top: 50px; 33 cursor: default; 34} 35.staff_bun dl{ 36 padding:30px 60px; 37}

「クリックで表示する」と「画像の切り替え」のコードが2つに分かれてしまっているので
もう少しスマートな書き方があれば教えていただきたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

triggerするのが楽です。

JavaScript

1$(function() { 2 var onimg = "https://placehold.jp/ffffff/ffffff/30x30.png"; 3 var offimg = "https://placehold.jp/30x30.png"; 4 5 // パネルを非表示 6 $('.staff_bun').hide(); 7 8 // クリックでパネルを開く 9 $('.staff_name').click(function(e){ 10 var bun = $('+.staff_bun', this).slideToggle(500); 11 var btn = bun.next().find('.onoff-btn'); 12 btn.attr('src', btn.attr('src') === onimg ? offimg : onimg); 13 }) 14 15 $('.onoff-btn').click(function() { 16 $(this).parent().prev().prev().trigger('click'); 17 }); 18});

投稿2018/11/02 03:31

x_x

総合スコア13749

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

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

satoshickkk

2018/11/02 03:39

x_x様 ご回答ありがとうございます。 教えていただいたtriggerを使用したものに変更して動きを確認しました。 名前クリックした場合は.staff_btnの画像がちゃんと切り替わるのですが .staff_btnの画像をクリックすると.staff_bunは表示されますが .staff_btnの画像の切り替えがうまくいきません。 こちらの原因はお分かりになられますか…?
x_x

2018/11/02 04:01

再現できませんね。 btn.attr('src') のところでブレイクし、onimgと完全に一致するものがとれているか確認してもらってもいいでしょうか?
satoshickkk

2018/11/02 04:04

すいません、onimgと完全に一致するものがHTMLの方に 記入していなかったため、きちんと出来ておりませんでした。 一致するものを記入したら問題無く動きました! ありがとうございます…!
guest

0

未検証。

JavaScript

1jQuery('.staff_in').on('click', '.staff_name,.onoff-btn', function handleClick (event) { 2 jQuery('.staff_bun', event.currentTarget).slideToggle(500); 3 4 const offimg = 'https://placehold.jp/30x30.png', onimg = 'https://placehold.jp/ffffff/ffffff/30x30.png'; 5 const btn = jQuery('.onoff-btn', event.currentTarget); 6 7 btn.attr('src', btn.attr('src') === offimg ? onimg : offimg); 8});

Re: satoxmato さん

投稿2018/11/02 04:08

think49

総合スコア18162

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

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

0

click()の代わりにon()を使うことで複数にイベントを登録できます。
下記のようにしてみてください。(HTML内に書いてるほうはいりません。onoffのフラグもいりません。)

javascript

1$(function() { 2 //パネルを非表示 3 $('.staff_bun').hide(); 4 $(document).on("click touchend", ".staff_name, .onoff-btn", function () { 5 //クリックでパネルを開く 6 $('.staff_bun').slideToggle(500); 7 // 画像を切り替える 8 $('.onoff-btn').toggle(function(){ 9 $('.onoff-btn').attr('src','https://placehold.jp/ffffff/ffffff/30x30.png'); 10 },function(){ 11 $('.onoff-btn').attr('src','https://placehold.jp/30x30.png'); 12 }); 13 }); 14});

(コメントを受けて追記)複数ある場合でクリックしたものだけにしたい場合

これでどうでしょうか?

javascript

1$(function() { 2 //パネルを非表示 3 $('.staff_bun').hide(); 4 $(document).on('click touchend', '.staff_name, .staff_btn', function () { 5 //クリックでパネルを開く 6 $(this).parent().find('.staff_bun').slideToggle(500); 7 // 画像を切り替える 8 var $img = $(this).parent().find('.onoff-btn'); 9 $img.toggle(function(){ 10 $img.attr('src','https://placehold.jp/ffffff/ffffff/30x30.png'); 11 },function(){ 12 $img.attr('src','https://placehold.jp/30x30.png'); 13 }); 14 }); 15});

投稿2018/11/02 03:45

編集2018/11/02 04:13
runny_nose

総合スコア280

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

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

satoshickkk

2018/11/02 03:51

runny_nose様 ありがとうございます。 教えていただいたものを書き込み試してみたところ 複数ある.staff_bunが全て反応して開いてしまいます…。 どこかに原因があったり、この場合は追加で処理をしなければならないのでしょうか?
runny_nose

2018/11/02 04:15

最初の例ではクラス全部にかかってしまうので、 クリックしたものの兄弟要素を取得して行う必要があります。 回答文に追記したものだとどうでしょうか? JSFiddleでフォークもしてみました。 ⇒ https://jsfiddle.net/tqpkwnj3/
runny_nose

2018/11/02 04:30

ちなみにclickイベントのみだとレスポンシブ対応(スマホ対応)する場合に、 タッチの反応速度が遅かったりするので、上記のように`touchend` もしくは`touchstart`も購読したほうがいいかもしれません。
guest

0

表示は

js

1 $('.staff_bun').show();

とか

js

1 $('.staff_bun').fadeIn();

が必要です
他にも表示方法はいくつかあります(jsでcss変更とか)
がこれが簡単かなと思います

staff_nameクリックはクリックイベントのセレクタを両方にして
処理のセレクタでthisを省くとどうでしょうか?

js

1$('.staff_name, .staff_bun').click(function(){ 2 3$('.staff_bun').show();

でもstaff_bunは非表示なのでクリック出来るのでしょか?

関係ないかもですが、
もしかして表示・非表示にしたい要素が間違ってないですか?

投稿2018/11/02 03:28

akihiro3

総合スコア955

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

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

satoshickkk

2018/11/02 03:42

$('.staff_bun').show();や $('.staff_bun').fadeIn();が かかれていなくても表示されてしまう事自体がおかしいのですね…! 勉強になります。 staff_bunをクリックではなくstaff_btnです。 間際らしく申し訳ないです。
akihiro3

2018/11/02 04:16

いやいや、こちらの方がごめんなさい。 この回答自体間違ってますね satoxmatoさんは申し訳なくないですよ 私がslideToggleを分かってなかったですし、 staff_btnとstaff_bunをしっかり見てなかったでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問