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

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

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

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

jQuery

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

Q&A

解決済

1回答

1558閲覧

jQueryの非同期処理について。順番に実行させるには。

aoies

総合スコア331

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/05/11 14:58

編集2019/05/11 15:17

やりたいこと

jQuery, javascript初心者です。趣味でサイトを作っています。

Aボタン(.buttonA)をホバーした時に、png画像(A.png)をクロマキー処理して、class="xx"の<img>のところに表示する、
という仕組みを作りたいと思っています。

クロマキー処理にはalphaimageというjQueryのプラグインを使っています。

(クロマキー処理とは、単色の背景を透過させることです。)
(ちなみに、他のボタンがホバーされた時は他の画像を代わりに表示させるつもりです。そのためあらかじめイメージをAlphaimageで処理しておくとのではなく、ホバーの際にクロマキー処理をさせたいと考えました。)

発生している問題・エラーメッセージ

ホバーした時、処理後の画像が出るより先にクロマキー処理前の画像が一瞬表示されてしまいます。javaScriptの非同期処理が原因かと考え、whenとdoneを使ってみたのですが、改善しませんでした。

以下は、jQueryのコードになります。

該当のソースコード

JavaScript

1$(function(){ 2 $('.buttonA').hover(function(){ 3 $.when( 4 $('.c-img2').attr('src','../A.png'), 5 $('.c-img2').alphaimage({colour:"#00FF00"}) 6 ).done( 7 $('.c-img2').css('display','inline') 8 ); 9 },function(){ 10 $('.c-img2').css('display','none'); 11 }); 12});

補足情報(FW/ツールのバージョンなど)

確認はGooglechromeで行っています。
alphaimageプラグインは↓のものです。
http://sly777.github.io/Jquery-Alpha-Image/

おそらくプラグインというよりは、javaScriptの動作を理解できていないのかなと思います。
javaScriptとjQueryについてはかなり初心者なので、お手柔らかに教えてくだされば嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

以下にて、多少は改善されるのではと思われる修正をサンプルにて回答します。

改善前のものとして、以下のようなHTMLを作成します。

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Q188894</title> 6 <script src="js/jquery-3.4.1.min.js"></script> 7 <script src="js/jquery.alphaimage.js"></script> 8 <script> 9 $(document).ready(function() { 10 11 $('.buttonA').hover( 12 function() { 13 $('img') 14 .attr('src', 'img/Octocat.png') 15 .alphaimage({ 16 colour: "#f4cab1" 17 }); 18 }, 19 function() { 20 $('img').removeAttr('src'); 21 } 22 ); 23 24 }); 25 </script> 26 <style> 27 .buttonA { 28 width: 800px; 29 height: 665px; 30 border: solid 1px #444; 31 } 32 </style> 33</head> 34<body> 35 <div class="buttonA"> 36 <img /> 37 </div> 38</body> 39</html>
  • 上記で使用している画像ファイルOctocat.pngはGitHubのキャラクターのOctocatの画像で、Alpha-Imageのサイト でもサンプルで使用されているものです。GitHub Logos and UsageDownload Octocat のリンクからダウンロードできます。

  • 画像は img/, JQuery と alphaimage は、js/ フォルダの中に置いています。

上記のHTMLを表示すると、初期表示では <div> の中は何も表示されませんが、<div> の中にマウスカーソルを移動させると、Octocat の画像から顔の肌色を抜いた画像が表示され、マウスが <div> から外れると画像表示が消えます。

ですが、このままだとご質問の状況と同じように、マウスが <div> に入ったときに一瞬、肌色が抜ける前の画像が見えるときがあります。

これを改善したものが、以下です。

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Q188894</title> 6 <script src="js/jquery-3.4.1.min.js"></script> 7 <script src="js/jquery.alphaimage.js"></script> 8 <script> 9 $(document).ready(function() { 10 11 const img = $('img'); 12 13 img.on('load', function() { 14 if (img.attr('src') !== 'img/Octocat.png') return; 15 img.alphaimage({ 16 colour: "#f4cab1", 17 onlyData: true, 18 onComplete: function(result) { 19 img.attr('src', result.imageSrc).removeClass('hidden'); 20 } 21 }); 22 }); 23 24 $('.buttonA').hover( 25 function() { 26 img.attr('src', 'img/Octocat.png'); 27 }, 28 function() { 29 img.removeAttr('src').addClass('hidden'); 30 } 31 ); 32 33 }); 34 </script> 35 <style> 36 .buttonA { 37 width: 800px; 38 height: 665px; 39 border: solid 1px #444; 40 } 41 .hidden { visibility: hidden; } 42 </style> 43</head> 44<body> 45 <div class="buttonA"> 46 <img class="hidden"/> 47 </div> 48</body> 49</html>

上記で意図しているのは、マウスカーソルが div に入ったときに、以下の (1)〜(4)が順に行われることです。

(1)<img> の src属性に img/Octocat.png を設定する。
(2) <img>要素が、img/Octocat.png を読み込む。
(3) 読み込みが完了したら、 .alphaimage() で透過処理を実行
(4) 透過処理が完了したら、透過処理によって生成された画像のURLをsrc属性に設定し、かつ .hiddenを削除します。この「透過処理が完了したら、」というのを実現するための .alphaimage() に対するオプションが、 以下の2点です。(Alpha-Imageのサイト から引用)

onlyData: When completed, plugin returns result that has Image and Image Data. (default : false)

onComplete: If you change onlyData option to true, it works when image processing completed.

改良版の方で動作確認しましたが、私の手元では、マウスが乗ったときに、一瞬肌色が見えることはなくなりました。

以上参考になれば幸いです。

補足

CSSクラス.hidden を追加しているのは、<img> の src属性が無い状態のときに、ブラウザのデフォルトの動作で、何らかの無効な画像を示す×印のようなものが表示されないようにすることを意図したもので、この回答の本筋にはあまり関係のない、補助的なものです。

この回答で、最も重要な主旨は、

  • onlyData を true にしたうえで、onComplete オプションを上手く使いましょう。

という点になるかと思います。

投稿2019/05/12 03:30

編集2019/05/12 05:49
jun68ykt

総合スコア9058

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

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

aoies

2019/05/12 13:34

なるほど!プラグイン側でそのための仕組みが作られていたんですね。全く理解できていませんでした。大変丁寧な回答ありがとうございます。とてもわかりやすかったです。
jun68ykt

2019/05/12 13:55

どういたしまして。 解決のヒントになったようで、よかったです ????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問