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

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

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

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

jQuery

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

CSS

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

Q&A

解決済

3回答

2319閲覧

ホバー座標に応じたクラス付与をしたい

gankonako

総合スコア16

JavaScript

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

jQuery

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

CSS

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

0グッド

0クリップ

投稿2018/12/03 19:49

編集2018/12/03 20:13

###実現したいこと

CSSでホバーしたとき、それが上半分なら.hover-upを付与し、下半分なら.hover-downを付与するという機能を実現したいのですが、、

その場合のjQueryの書き方について教えて頂けませんでしょうか。

###対象のHTML
対象のHTMLはこのようになっています。.img.nameにホバーしたら、.helloにクラスを付与したいです。

html

1<article> 2 <div class="img">img</div> 3 <div class="name">name</div> 4 <div class="hello">hello</div> 5</article> 6 7<style> 8article { 9 position: relative; 10 width: 100px; 11 height: 100px; 12 background: khaki; 13} 14.hello{ 15 display: none; 16} 17.hello.hover-up{ 18 display: block; 19 position: absolute; 20 bottom:0; 21 } 22.hello.hover-down{ 23 display: block; 24 position: absolute; 25 top: 0; 26 } 27</srtyle>

###試したjQuery
下記でコメントしてあるような流れを考えています。

jquery

1<script> 2$('img, .name').hover( 3 4 /* マウスホバーしたときの処理 */ 5 function() { 6 //マウスのY座標を取得 7 var dy = e.clientY; 8 //現在地が上半分ならhover-up 9 if ( dy >= 50% ) { 10 $(this).closest('article').find('.hello').addClass('hover-up'); 11 } 12 //下半分ならhover-down 13 else{ 14 $(this).closest('article').find('.hello').addClass('hover-down'); 15 } 16 }, 17 18 /* マウスホバーやめたときの処理 */ 19 function() { 20 //クラス外す 21 $(this).closest('article').find('.hello').removeClass('hover-up hover-down'); 22 } 23 24); 25</script>

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

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

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

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

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

akihiro3

2018/12/04 03:01

すみません。書き方を教えてほしいとは何を聞かれてるのかが分からないのですが、、、何を使うかです?それとも手順(考え方?)ですか?あと、そのコードは試したコードですか?
x_x

2018/12/04 08:00

要素の座標ではなくマウスの座標でいいのですか?
gankonako

2018/12/04 08:07

x_x様の仰るように、要素の座標でないといけませんね。どうもありがとうございます。
guest

回答3

0

ベストアンサー

座標の取り方ですが、要素(thisだとして)がわかれば次の通り

JavaScript

1var rect = this.getBoundingClientRect(); 2var dy = (rect.top + rect.bottom) / 2;

https://developer.mozilla.org/ja/docs/Web/API/Element/getBoundingClientRect

jQueryだと少し面倒です。

JavaScript

1var dy = $(this).offset().top - $(window).scrollTop() + ($(this).outerHeight() / 2);

これと $(window).innerHeight() / 2 との差を取ればいいでしょう。

投稿2018/12/04 09:02

x_x

総合スコア13749

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

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

gankonako

2018/12/04 09:14 編集

おお、ありがとうございます! お蔭さまでかなり進んだかなと自己満足しているのですが笑、次のコードではどこを直すべきでしょうか? 「.hover-up」しか付与してくれない状態です。 $(function() { // ホバー時の処理 $(".name").hover(function() { // top座標と、ボタン自身の高さを取得 var dy = $(this).offset().top - $(window).scrollTop() + ($(this).outerHeight() / 2); // 画面の高さを取得 var window = $(window).innerHeight() / 2; // カーソルが当たった時の処理 if( dy >= window ){ $(this).closest('article').find('.hello').addClass('hover-up'); }else{ $(this).closest('article').find('.hello').addClass('hover-down'); } }, // カーソルが離れた時の処理 function() { $(this).closest('article').find('.hello').removeClass("hover-up hover-down"); }); });
x_x

2018/12/04 09:15

まずwindowという変数名を変えてみては?
x_x

2018/12/04 09:20

それと、誤記と思って脳内補正していましたが</srtyle>ではなく</style>です。これは大丈夫でしょうか?
gankonako

2018/12/04 09:26

変数名~!!windowってダメなんだ…。どうもありがとうございます。スタイルも仰る通りですね。素人にお付き合い頂き感謝申し上げます。
guest

0

dy >= 50%

50%なんて表現うけつけませんよね

投稿2018/12/04 00:31

yambejp

総合スコア114775

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

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

gankonako

2018/12/04 08:09

マウス位置でなくて要素位置でした。失礼致しました。
guest

0

手順1.要素の座標取得
手順2.要素の高さを取得し2で割る
手順3.手順1と手順2を足す
手順4.スクロール位置が、手順3より多いか少ないかで条件分岐する

上記の方法ではどうでしょうか?

投稿2018/12/04 02:53

akihiro3

総合スコア955

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

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

gankonako

2018/12/04 08:53 編集

ありがとうございます。 検索してみたのですが、このような感じかと思うのですが、あと直すべき点はどこか教えて頂けませんか? $(function() { // ホバー時の処理 $("img, .name").hover(function() { // top座標と、ボタン自身の高さを取得 var positionTop = $(this).position().top + $(this).outerHeight(); //スクロール位置を取得 var strollTop = $(this).scrollTop(); // カーソルが当たった時の処理 if( positionTop >= strollTop ){ $(this).closest('article').find('.hello').addClass('hover-up'); }else{ $(this).closest('article').find('.hello').addClass('hover-down'); } }, // カーソルが離れた時の処理 function() { $(this).closest('article').find('.hello').removeClass("hover-up hover-down"); }); });
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問