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

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

解決済

2回答

2435閲覧

html要素にオンマウスしても背景色が変更できない

aaaaaaaa

総合スコア501

JavaScript

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

jQuery

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

HTML

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

CSS

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

0グッド

1クリップ

投稿2016/02/03 11:13

編集2016/02/09 11:26

html要素にオンマウスするとアニメーションつきで背景色を変更する処理、について質問です。
下記のソースは、オンマウスした要素のbackground-colorを取得し、配列color内のfromと一致すれば、
同じく配列colorのtoに変更するという処理です。このオンマウスし取得したときの色が透明(transparent)だと、
初回のみ色を変更してくれるのですが、再度オンマウスすると全く色が変更されないのです。
コンソールで再度オンマウスしたときに何色を取得しているのか見てみると、何故か変更後の色(to)であるrgb(0,102,51)を取得していたのです。しかし要素の背景色は、rgb(0,102,51)ではなく透明です。
色が変更されないのは、再度オンマウスすると透明時のみ"変更後"の色が取得されてしまい、
from内に一致する色がないからだと思うのです。なぜ、透明にすると"変更後"色が取得されてしまうのでしょうか。

javascript

1var animation_el = [ 2 '#gnavi li a', 3 '#language li a', 4 '.gnavi_contents p a', 5 '#katugyoArea p'//問題の透明部分 6 ]; 7 var colors = [ 8 {from: 'rgb(0, 153, 51)', to: 'rgb(0, 133, 44)'}, 9 {from: 'rgb(230, 230, 230)', to: 'rgb(191, 191, 191)'}, 10 //▼何故か、再度オンマウスすると色が変更してくれない。最初にオンマウスした際に取得した色は、透明(transparent)なのだが、何故か再度取得すると変更後の色(to)であるrgb0,102,51が取得できてしまうのだ。 11 {from: 'transparent', to: 'rgb(0, 102, 51)'}//fromが透明、toが濃い緑(#006633)。 12 ]; 13 var baseColor; 14 $.each(animation_el, function(index,value) { 15 $(value).on({ 16 'mouseenter':function() { 17 baseColor = $(this).css('background-color'); 18 console.log('初期背景色',baseColor); 19 for(var i = 0; i<colors.length; i++) { 20 if(colors[i].from == baseColor) { 21 $(this).animate({'background-color': colors[i].to}, 400); 22 console.log('colors',colors[i].to) 23 break; 24 } 25 } 26 }, 27 'mouseleave':function() { 28 $(this).animate({'background-color': baseColor}, 400);//#006622 #093より濃い緑 29 } 30 });//on 31 });

html

1<section id="katugyoArea"> 2<h1>題名</h1> 3<img src="./image/.png" alt="円形の画像"> 4<p><span>ここに文字列</span></p> 5 6</section>

css

1#katugyoArea p { 2 height: 64px; 3 width: 420px; 4 font-weight: bold; 5 border: solid 5px #fff; 6 margin: 0 auto; 7 background: url(../image/yazirusi.png) no-repeat right; 8}

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

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

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

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

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

rossi46hiro

2016/02/03 12:57

コンソールで確認したというのは2回目の`console.log('初期背景色',baseColor);`でしょうか? であれば、2回目に`baseColor = $(this).css('background-color');`が入れられる前のbaseColorの値は何になっているのでしょうか?
think49

2016/02/09 12:41

素朴な疑問ですが、なぜ些細な文言の微修正だけして回答には何の返答もしないのでしょうか。もし、[アクティブ] で上の方に持っていくのが目的なら回答に返答を返した方がいいと思いますよ。 https://teratail.com/questions/history-questions/26359
guest

回答2

0

ベストアンサー

いくつか複合的な問題があったように思います。

まず、jQuery の animate() ですが、API リファレンス にもあるように、background-color のように単純なスカラー量でない要素には対応していません。もし、background-color のアニメーションをしたい場合は、同じリファレンスページに書いてあるように、JQuery.Color プラグインを利用するとよいようです。
CDN を使うなら、次のようになりますね。

html

1<script src="http://code.jquery.com/color/jquery.color-2.1.2.min.js"></script>

で、お望みの動きになるようなコードとして、次のようなものを書いてみました。

javascript

1$.normalizeColor = function(colorSpec) { 2 var to = false ? $.Color(colorSpec).toRgbaString() : $.Color(colorSpec).toHexString(true); 3 //console.log('@@@' + colorSpec + '==>' + to); 4 return to; 5}; 6var animation_el = [ 7 '#gnavi li a', 8 '#language li a', 9 '.gnavi_contents p a', 10 '#katugyoArea p'//問題の透明部分 11 ]; 12 var colors = (function(colors, ret) { 13 colors.forEach(function(spec) { 14 ret.push({ from: $.normalizeColor(spec.from), to: $.normalizeColor(spec.to) }) 15 }); 16 return ret; 17 })([ 18 {from: 'rgb(0, 153, 51)', to: 'rgb(0, 133, 44)'}, 19 {from: 'rgb(230, 230, 230)', to: 'rgb(191, 191, 191)'}, 20 {from: 'transparent', to: 'rgb(0, 102, 51)'} 21 ], []); 22 $.each(animation_el, function(index,value) { 23 $(value).on({ 24 'mouseenter':function() { 25 var $elem = $(this); 26 var baseColor = $.normalizeColor($elem.css('background-color')); 27 $elem.data('baseColor', baseColor); 28 console.log('初期背景色',baseColor); 29 for(var i = 0; i<colors.length; i++) { 30 if(colors[i].from == baseColor) { 31 $elem.animate({'background-color': colors[i].to }, 400, 32 function() { 1; } 33 ); 34 console.log('colors',colors[i].to) 35 break; 36 } 37 } 38 }, 39 'mouseleave':function() { 40 var $elem = $(this); 41 console.log('back to ' + $elem.data('baseColor')); 42 $elem.animate({'background-color': $elem.data('baseColor')}, 400, function() { 43 if ($elem.data('baseColor') == '#00000000') { 44 $elem.css('background-color', 'transparent'); 45 } 46 $elem.removeData('baseColor'); 47 }); 48 } 49 });//on 50 });

潜在的な問題として、background-color 属性をそのまま JavaScript の == 演算子で比較しているのが怪しいと思いました。特に、いちばん最初、HTML で background-color を明示的に指定していないときの値はブラウザ依存ではないかと思いますので、transparent になると考えるのは危険かと。
なので、背景色を比較するときには正規化して比較するようにしてみました。$.normalizeColor() 関数がそれになります。(なんとなく jQuery のユーティリティ関数にしてしまいましたが、その必要はないですね。)

次に、baseColor 変数のスコープが怪しいな、と思いました。なので、jQuery の data() 関数を利用して、対象の要素に元の背景色を格納するようにしました。

で、ここまでやったらちゃんと動くだろう、と思っていたら、やはりうまく動きませんでした。ある意味では JQuery.Color プラグインのバグと言ってもいいんじゃないかと思いますが、animate({background-color: '#00000000' }) と最終的に透明になるように指定すると、最終的な background-style の値は rgb(0, 0, 0) になるようです。すなわち、今回の場合で言えば、アニメーション終了後の p 要素が

html

1<p style="background-color: rgb(0, 0, 0);">

となってしまいます。
ということで、work around として、mouseleave ハンドラの中の animate() のアニメーション終了後に呼ばれるコールバックで、戻すべき色が #00000000 だった場合には明示的に background-colortransparent にするようにしてみました(background-color を無指定にするのもいいのかもしれません)。

投稿2016/02/03 21:44

unau

総合スコア2468

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

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

aaaaaaaa

2016/02/10 11:03

ご回答有難うございます。 未熟者でしてソースを理解するのや初見のjquery.colorを解析するのに時間が掛ってしまいお礼とお返事が遅れてしまいました。申し訳ないです。 >>jQuery の animate() ですが、API リファレンス にもあるように、background-color のように単純なスカラー量でない要素には対応していません。 申し訳ないです。書き損じておりましたが、一応、jquery-ui.jsを導入しております。 なのでbackground-colorも使用可能です。 >>値はブラウザ依存 これは全く知りませんでした。勉強になります。 記述されたソースやjquery.colorの動きやソースを理解したいので少々時間はかかると思うのですが、頂いた案を自分の環境でも試してみたいと思います。 ご回答有難うございました。
guest

0

jQueryを使わず、CSSのtransitionプロパティを利用するとシンプルに書けます。
本題とはずれているかもしれませんが、参考までに。

css

1#katugyoArea p { 2 height: 64px; 3 width: 420px; 4 font-weight: bold; 5 border: solid 5px #fff; 6 margin: 0 auto; 7 background: url(../image/yazirusi.png) no-repeat right; 8 transition:background-color 0.4s; 9} 10 11#katugyoArea p:hover { 12 background-color: rgb(0, 102, 51); 13}

投稿2016/02/04 03:27

yamato_hikawa

総合スコア2092

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問