\r\n```\r\n\r\n```javascript\r\n$(function() {\r\n //パネルを非表示\r\n $('.staff_bun').hide();\r\n $('.staff_name')\r\n .click(function(e){\r\n //クリックでパネルを開く\r\n $('+.staff_bun', this).slideToggle(500);\r\n })\r\n});\r\n```\r\n```css\r\n.staff_in{\r\n\tbackground: red;\r\n\tpadding: 40px 40px 70px 40px;\r\n\twidth: 520px;\r\n\tcursor: pointer;\r\n\tcursor: hand;\r\n\tposition: relative;\r\n}\r\n.staff_btn{\r\n\tposition: absolute;\r\n\tpadding-top:30px;\r\n\tleft: 50%;\r\n\ttransform: translateX(-50%);\r\n}\r\n\r\n.staff_name{\r\n\tposition: relative;\r\n\tpadding-left: 30px;\r\n}\r\n.staff_name img{\r\n\tposition: absolute;\r\n\ttop:-95px;\r\n\tright:0;\r\n}\r\n.staff_name h3{\r\n\tfont-size:3em;\r\n\tline-height: 0.8em;\r\n}\r\n.staff_bun{\r\n\tbackground: #fff;\r\n\tborder-radius: 40px;\r\n\tmargin-top: 50px;\r\n\tcursor: default;\r\n}\r\n.staff_bun dl{\r\n\tpadding:30px 60px;\r\n}\r\n```\r\n\r\n\r\n\r\n「クリックで表示する」と「画像の切り替え」のコードが2つに分かれてしまっているので\r\nもう少しスマートな書き方があれば教えていただきたいです。\r\nよろしくお願いします。","answerCount":4,"upvoteCount":0,"datePublished":"2018-11-02T02:52:53.996Z","dateModified":"2018-11-02T02:52:53.996Z","acceptedAnswer":{"@type":"Answer","text":"triggerするのが楽です。\r\n```JavaScript\r\n$(function() {\r\n var onimg = \"https://placehold.jp/ffffff/ffffff/30x30.png\";\r\n var offimg = \"https://placehold.jp/30x30.png\";\r\n\r\n // パネルを非表示\r\n $('.staff_bun').hide();\r\n\r\n // クリックでパネルを開く\r\n $('.staff_name').click(function(e){\r\n var bun = $('+.staff_bun', this).slideToggle(500);\r\n var btn = bun.next().find('.onoff-btn');\r\n btn.attr('src', btn.attr('src') === onimg ? offimg : onimg);\r\n })\r\n\r\n $('.onoff-btn').click(function() {\r\n $(this).parent().prev().prev().trigger('click');\r\n });\r\n});\r\n```","dateModified":"2018-11-02T03:31:38.104Z","datePublished":"2018-11-02T03:31:38.104Z","upvoteCount":1,"url":"https://teratail.com/questions/155726#reply-233855"},"suggestedAnswer":[{"@type":"Answer","text":"未検証。\r\n\r\n```JavaScript\r\njQuery('.staff_in').on('click', '.staff_name,.onoff-btn', function handleClick (event) {\r\n jQuery('.staff_bun', event.currentTarget).slideToggle(500);\r\n \r\n const offimg = 'https://placehold.jp/30x30.png', onimg = 'https://placehold.jp/ffffff/ffffff/30x30.png';\r\n const btn = jQuery('.onoff-btn', event.currentTarget);\r\n\r\n btn.attr('src', btn.attr('src') === offimg ? onimg : offimg);\r\n});\r\n```\r\n\r\nRe: satoxmato さん","dateModified":"2018-11-02T04:08:27.236Z","datePublished":"2018-11-02T04:08:27.236Z","upvoteCount":0,"url":"https://teratail.com/questions/155726#reply-233865","comment":[]},{"@type":"Answer","text":"`click()`の代わりに`on()`を使うことで複数にイベントを登録できます。\r\n下記のようにしてみてください。(HTML内に書いてるほうはいりません。onoffのフラグもいりません。)\r\n\r\n```javascript\r\n$(function() {\r\n //パネルを非表示\r\n $('.staff_bun').hide();\r\n $(document).on(\"click touchend\", \".staff_name, .onoff-btn\", function () {\r\n //クリックでパネルを開く\r\n $('.staff_bun').slideToggle(500);\r\n // 画像を切り替える\r\n $('.onoff-btn').toggle(function(){\r\n $('.onoff-btn').attr('src','https://placehold.jp/ffffff/ffffff/30x30.png');\r\n },function(){\r\n $('.onoff-btn').attr('src','https://placehold.jp/30x30.png');\r\n });\r\n });\r\n});\r\n```\r\n\r\n### (コメントを受けて追記)複数ある場合でクリックしたものだけにしたい場合\r\nこれでどうでしょうか?\r\n```javascript\r\n$(function() {\r\n //パネルを非表示\r\n $('.staff_bun').hide();\r\n $(document).on('click touchend', '.staff_name, .staff_btn', function () {\r\n //クリックでパネルを開く\r\n $(this).parent().find('.staff_bun').slideToggle(500);\r\n // 画像を切り替える\r\n var $img = $(this).parent().find('.onoff-btn');\r\n $img.toggle(function(){\r\n $img.attr('src','https://placehold.jp/ffffff/ffffff/30x30.png');\r\n },function(){\r\n $img.attr('src','https://placehold.jp/30x30.png');\r\n });\r\n });\r\n});\r\n```","dateModified":"2018-11-02T04:13:23.160Z","datePublished":"2018-11-02T03:45:52.013Z","upvoteCount":0,"url":"https://teratail.com/questions/155726#reply-233860","comment":[{"@type":"Comment","text":"runny_nose様\r\nありがとうございます。\r\n教えていただいたものを書き込み試してみたところ\r\n複数ある.staff_bunが全て反応して開いてしまいます…。\r\n\r\nどこかに原因があったり、この場合は追加で処理をしなければならないのでしょうか?","datePublished":"2018-11-02T03:51:51.324Z","dateModified":"2018-11-02T03:51:51.324Z"},{"@type":"Comment","text":"最初の例ではクラス全部にかかってしまうので、\r\nクリックしたものの兄弟要素を取得して行う必要があります。\r\n回答文に追記したものだとどうでしょうか?\r\nJSFiddleでフォークもしてみました。 ⇒ https://jsfiddle.net/tqpkwnj3/","datePublished":"2018-11-02T04:15:38.246Z","dateModified":"2018-11-02T04:15:38.246Z"},{"@type":"Comment","text":"ちなみにclickイベントのみだとレスポンシブ対応(スマホ対応)する場合に、\r\nタッチの反応速度が遅かったりするので、上記のように`touchend` もしくは`touchstart`も購読したほうがいいかもしれません。","datePublished":"2018-11-02T04:30:30.173Z","dateModified":"2018-11-02T04:30:30.173Z"}]},{"@type":"Answer","text":"表示は\r\n```js\r\n $('.staff_bun').show();\r\n```\r\nとか\r\n```js\r\n $('.staff_bun').fadeIn();\r\n```\r\nが必要です\r\n他にも表示方法はいくつかあります(jsでcss変更とか)\r\nがこれが簡単かなと思います\r\n\r\nstaff_nameクリックはクリックイベントのセレクタを両方にして\r\n処理のセレクタでthisを省くとどうでしょうか?\r\n```js\r\n$('.staff_name, .staff_bun').click(function(){\r\n\r\n$('.staff_bun').show();\r\n```\r\nでもstaff_bunは非表示なのでクリック出来るのでしょか?\r\n\r\n関係ないかもですが、\r\nもしかして表示・非表示にしたい要素が間違ってないですか?","dateModified":"2018-11-02T03:28:26.597Z","datePublished":"2018-11-02T03:28:26.597Z","upvoteCount":0,"url":"https://teratail.com/questions/155726#reply-233854","comment":[{"@type":"Comment","text":"$('.staff_bun').show();や $('.staff_bun').fadeIn();が\r\nかかれていなくても表示されてしまう事自体がおかしいのですね…!\r\n勉強になります。\r\nstaff_bunをクリックではなくstaff_btnです。\r\n間際らしく申し訳ないです。","datePublished":"2018-11-02T03:42:01.286Z","dateModified":"2018-11-02T03:42:01.286Z"},{"@type":"Comment","text":"いやいや、こちらの方がごめんなさい。\r\nこの回答自体間違ってますね\r\n\r\nsatoxmatoさんは申し訳なくないですよ\r\n私がslideToggleを分かってなかったですし、\r\nstaff_btnとstaff_bunをしっかり見てなかったでした","datePublished":"2018-11-02T04:16:35.909Z","dateModified":"2018-11-02T04:16:35.909Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/155726","name":"どこクリックしても同じイベントが起こるようにしたい"}}]}}}
###実行したい事
①名前をクリックする
②非表示にしていたものが出てくる(アコーディオン)
③画像をクリックしたときも同じイベントが起きる
④名前をクリックしても画像を切り替えたい(オープン→クローズ)
###分からないこと
名前をクリックしたときは②非表示にしていたものが出てくるが
画像をクリックしてもオープン→クローズの画像切り替えのみで②非表示にしているものが出てきません。
.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つに分かれてしまっているので
もう少しスマートな書き方があれば教えていただきたいです。
よろしくお願いします。
ベストアンサー
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});
未検証。
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 さん
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});
表示は
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は非表示なのでクリック出来るのでしょか?
関係ないかもですが、
もしかして表示・非表示にしたい要素が間違ってないですか?
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

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

テンプレート機能で
簡単に質問をまとめる
質問する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 03:39
2018/11/02 04:01
2018/11/02 04:04