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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery

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

HTML

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

Q&A

解決済

3回答

2328閲覧

【jQuery】1つのコードで全ての要素を個別に操作したい!

masac225

総合スコア17

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery

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

HTML

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

0グッド

0クリップ

投稿2016/05/02 13:16

編集2016/05/02 13:39

(初歩的なミスをしている可能性が高いのでご容赦ください(汗))

近日、長い間手を付けていなかったjQueryを勉強するために

「とあるテキストをホバーすると、その下にボックスが表示される」

という基本的なプログラムを書いてみたのですが、早速壁にぶち当たってしまいました(泣)

それらを複数設置した場合に於いて、同じclassを使用しているため1つのテキストをホバーするだけで全てのボックスが表示(当たり前ですが)されてしまいます。
無論、「個別に指定する」という手があるということは存じておりますが、そのプログラムを設置しなくてはならない回数がかなり多く、個別に書いけばjQueryがとてつもなく膨大になってしまうので、どうにかしてjQueryを1つの共通のものにできないか、と、悩んでおります...。

ちなみに言い忘れていましたが、テキスト、ボックスはどちらもHTMLのdiv要素です。サンプルなどを作成していただけると幸いですが、説明だけでも構いません。

ご回答どうかよろしくお願いいたします。

追記:一応ですがコードをお載せいたします。

jQuery

1$(function () { 2 $(".name").hover( 3 function () { 4 $(".selint").slideDown("fast") 5 }, 6 function () { 7 $(".selint").slideUp("fast") 8 } 9 ); 10});

HTML

1<dl> 2 <dt>Founder</dt> 3 <dd><div class="name">1<div class="selint">text1</div></div></dd> 4</dl> 5 6<dl> 7 <dt>Leader</dt> 8 <dd><div class="name">2<div class="selint">text2</div></div></dd> 9 <dd><div class="name">3<div class="selint">text3</div></div></dd> 10 <dd><div class="name">4<div class="selint">text4</div></div></dd> 11</dl> 12 13<dl> 14 <dt>Member</dt> 15 <dd><div class="name">5<div class="selint">text5/div></div></dd> 16 <dd><div class="name">6<div class="selint">text6</div></div></dd> 17 <!-- 今後増えて行きます。 --> 18</dl>

CSS

1dl { 2 margin-bottom: 50px; 3} 4 5dt { 6 font-size: 30px; 7 width: 150px; 8 margin: auto; 9 border-bottom: 2px solid; 10} 11 12.name { 13 color: #333; 14 font-size: 30px; 15 width: 200px; 16 margin: 10px; 17 display: inline-block; 18 border-bottom: dashed 1px #555; 19} 20 21.selint { 22 font-family: Meiryo; 23 display: none; 24 width: 200px; 25 top: 40px; 26 background-color: #444; 27 padding: 5px; 28 color: #fff; 29 font-size: 15px; 30}

一見関係がなさそうなコードも、原因や修正した方が良い点などがある可能性があるので、一応載せておきました。

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

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

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

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

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

takasima20

2016/05/02 13:25

ソース出したら回答つきやすいと思いますよ。
masac225

2016/05/02 13:28

分かりました、追記しておきます。
guest

回答3

0

ベストアンサー

横からで大変恐縮なのですが、ちょっと補足として…

コードそのものは先に書かれたお二人のものどちらでも問題なく動作すると思われます。
そこにもうちょっとプラスする感じのところで、参考までに。

//.hover(function(){...})でアニメーションイベントを行う場合 var parent = $('.name'); //要素の数が多い時はこんな風にキャッシュしておくと(ちょっと)高速化できます var child = $('.selint'); // 同様(※ただし$(this).find(),$(this).children()などの対象要素の絞り込み等が無いケースには適しません) child.css({display:'none'}); //css側で指定していればいりません。クローズアニメーションをつけたければslideUpを使う parent.hover( function(){ $(this).find(child).stop(true,false).slideDown('fast') }, function(){ $(this).find(child).stop(true,false).slideUp('fast') } );

.hover()のように、mouseenter,mouseleaveが連続して呼び出される可能性があるイベントに対してアニメーション処理を行う場合は必ず.stop()メソッドを加えておく方が良いかなと思います。

これが無いと何度もマウスオン⇔マウスアウトを繰り返す(繰り返してしまう)とその回数分きっちりアニメーションが発生します
(※とっくに要素からカーソルを外していても、繰り返した回数をすべてこなすまで止まりません)

第一引数:true,第二引数:falseは、「(この要素がアニメーション中なら)追加のアニメーションキューは削除し、アニメーションを即時完了させない」という意味になります。
.stop()の引数の指定による違いは、こちらを参照のうえ
実際に引数を変えていって試してみるとイメージしやすいと良いと思います。

.stop()
http://js.studio-kingdom.com/jquery/effects/stop

ちなみに
kentei_syunraiさんのコードでは.stop()無しでも一見アニメーションが繰り返されていないように見えますが
何度もマウスオン⇔マウスアウトを繰り返すと、その間『条件判定+イベント分岐』が繰り返され続けています。

slideDownがdisplay:noneになっている時以外呼ばれないので
見た目上はslideToggleが発生しませんが、slideUp中にslideUpが複数回繰り返されている状態になります。
このあたりはそれぞれのイベントにconsole.logを加えてみると確認できます。

その為、マウスアウト時の挙動が若干不安定になります(操作によっては.selintが開きっぱなしで残る)
つまり、こちらでも.stop()を入れて(キューを削除して)、slideUpが繰り返し発生しないようにしておくほうが良いです。

DOMアニメーションは非常に高コストなので、連続したり複合で発生すると、
その間ページの動作が重くなったりカクついたりします。
無駄に発生しないようにしておくということを意識しておくことをおすすめいたします。


あと、おまけ的に覚えておいていただければ良いかな、というところで

今回のように同じhtml構造のものが大量になるケースなどであれば
イベントを関連付ける要素を変数にキャッシュしておいたほうが良いです。
$('.name').hover()にすると、「毎回」DOMエレメント内から.nameを探しに行きます。(非効率)
なので、

var parent = $('.name'); parent.hover()

のようにあらかじめ変数へキャッシュしておくと、その「探しに行く」という処理をカットできます。
jQueryは元々処理が重いので、ちょっと処理速度なども気をつかってあげると
閲覧者にとってフレンドリーなものになるかなー…ということで…
長文失礼しました。

投稿2016/05/02 19:02

manabufukai

総合スコア700

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

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

kentei_syunrai

2016/05/03 00:16

おっしゃる通りですね。 ナイスな補足ありがとうございます。
masac225

2016/05/03 11:07

ああ! 丁度今、ホバーした回数分発生してしまう事に関して困っていたんです... 危うく(?)別スレで質問してしまうところでした(笑) 的確な補足、有難うございました。 また、キャッシュの指定に関しても、サイトの高速化を意識している私(もちろん皆さんも)にとって、とても有益な情報です。 改めまして、本当に有難うございました。
manabufukai

2016/05/03 16:14

Re: kentei_syunraiさん 名前まで出してしまって申し訳ございませんでした…が、温かいコメント感謝いたします。 なかなかユニークなコードだなぁと興味深く拝見させていただいていました。 自分ももうちょっと複雑な処理を行う時は変数による状態判定をよく使います。 あと、一点だけ… 変数flagを宣言する際にvar宣言をされていませんが Strictモードではエラーになるコードですし、非Strictモードでは「ローカルスコープでのグローバル変数宣言(及び代入)」になるので、 変数宣言時は必ずvar宣言しておいたほうが良いです。
manabufukai

2016/05/03 16:27

Re: masac225 さん それは何よりです。 jQyeryには便利なメソッドが沢山用意されているので、メソッドの種類を知るだけでも結構色々なことができるようになると思います。 ぜひ色々調べて書いていってみてください。どんどん楽しくなってくると思います。笑 今回はたまたまいい例を他の回答者の方々が出してらっしゃったので 補足として長々書かせていただきましたが 普段自分自身も「どこまで書くか」は結構考えたりして、「このくらいまでにしておくか」ということが多いです。 今回の自分の回答はただの「後出し」みたいなものなので、他の回答者の方々にこそ、お礼を是非。
guest

0

Jquery

1$(function () { 2 $(".name").hover( 3 function () { 4 $(this).find(".selint").slideDown("fast") 5 }, 6 function () { 7 $(this).find(".selint").slideUp("fast") 8 } 9 ); 10});

これではどうでしょう?

投稿2016/05/02 13:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

masac225

2016/05/02 14:14

ありがとうございます!直りました! ".find"はそのように使うのですね、とても参考になりました。
guest

0

JavaScript

1$(function () { 2 $(".name").each(function(e,v){ 3 $(v).children().slideUp("fast") 4 5 $(v).hover(function(){ 6 flg = $(this).children().css("display") == "none"; 7 if(flg) { 8 $(this).children().slideDown("fast"); 9 } else { 10 $(this).children().slideUp("fast"); 11 } 12 }); 13 }); 14 });

上のHTMLの方式ならこの方法でうまくいくと思いますが。

投稿2016/05/02 14:14

kentei_syunrai

総合スコア946

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

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

masac225

2016/05/02 14:18 編集

子孫パラメータを使用する方法もあるのですね。 違う場面で使用する場合があるかもしれないので、覚えて置きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問