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

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

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

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

Q&A

解決済

1回答

673閲覧

javascriptのマウスホバーイベントについて

kou0401

総合スコア1

JavaScript

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

0グッド

2クリップ

投稿2022/08/14 14:52

編集2022/08/14 16:00

前提

javascriptを使って画像にグリッチエフェクトをかけることが出来ましたが、マウスホバー時のみエフェクトをかけたいです。
どこにどのようにしてaddEventListener()関数を利用すればいいのかわかりません。

実現したいこと

ホバー時のみエフェクトを実行させたい。

該当のソースコード

html

1<a href="" data-js="glitch-image"><img src="img/sample01.png" alt="sample01"></a>

css

1[data-js="glitch-image"] { 2 position: relative; 3 width: 100%; 4} 5[data-js="glitch-image"] canvas { 6 position: absolute; 7 top: 0; 8 left: 0; 9 z-index: 1; 10}

javascript

1(function (window) { 2 'use strict'; 3 4 let _canvas, _context; 5 6 let _image, _imageData; 7 8 const effectList = [function glitch(context, width, height) { 9 const imageData = context.getImageData(0, 0, width, height); 10 const data = imageData.data; 11 const length = width * height; 12 const factor = Math.random() * 10; 13 let randR = Math.floor(Math.random() * factor); 14 let randG = Math.floor(Math.random() * factor) * 3; 15 let randB = Math.floor(Math.random() * factor); 16 17 for (let i = 0; i < length; i++) { 18 let r = data[(i + randR) * 4]; 19 let g = data[(i + randG) * 4 + 1]; 20 let b = data[(i + randB) * 4 + 2]; 21 if (r + g + b == 0) r = g = b = 255; 22 data[i * 4] = r; 23 data[i * 4 + 1] = g; 24 data[i * 4 + 2] = b; 25 data[i * 4 + 3] = 255; 26 } 27 28 context.putImageData(imageData, 0, 0); 29 }, function glitchWave(context, width, height) { 30 const renderLineHeight = Math.random() * height; 31 const cuttingHeight = 5; 32 const imageData = context.getImageData(0, renderLineHeight, width, cuttingHeight); 33 context.putImageData(imageData, 0, renderLineHeight - 10); 34 }, function glitchSlip(context, width, height) { 35 const waveDistance = 100; 36 const startHeight = height * Math.random(); 37 const endHeight = startHeight + 30 + Math.random() * 40; 38 39 for (let h = startHeight; h < endHeight; h++) { 40 if (Math.random() < .1) h++; 41 let imageData = context.getImageData(0, h, width, 1); 42 context.putImageData(imageData, Math.random() * waveDistance - waveDistance * .5, h); 43 } 44 }, function glitchColor(context, width, height) { 45 const waveDistance = 30; 46 const startHeight = height * Math.random(); 47 const endHeight = startHeight + 30 + Math.random() * 40; 48 const imageData = context.getImageData(0, startHeight, width, endHeight); 49 const length = width * height; 50 let data = imageData.data; 51 let r = 0; 52 let g = 0; 53 let b = 0; 54 55 for (let i = 0; i < length; i++) { 56 if (i % width === 0) { 57 r = i + Math.floor((Math.random() - .5) * waveDistance); 58 g = i + Math.floor((Math.random() - .5) * waveDistance); 59 b = i + Math.floor((Math.random() - .5) * waveDistance); 60 } 61 62 data[i * 4] = data[r * 4]; 63 data[i * 4 + 1] = data[g * 4 + 1]; 64 data[i * 4 + 2] = data[b * 4 + 2]; 65 } 66 67 context.putImageData(imageData, 0, startHeight); 68 }]; 69 70 function init() { 71 const imageBoard = document.querySelector('[data-js="glitch-image"]'); 72 _image = imageBoard.querySelector('img'); 73 _canvas = document.createElement('canvas'); 74 _context = _canvas.getContext('2d'); 75 imageBoard.appendChild(_canvas); 76 _imageData = new Image(); 77 _imageData.crossOrigin = "Anonymous"; 78 79 _imageData.onload = function (event) { 80 window.addEventListener('resize', onResize, false); 81 window.dispatchEvent(new Event('resize')); 82 window.requestAnimationFrame(render); 83 }; 84 85 _imageData.src = _image.getAttribute('src'); 86 } 87 88 function onResize() { 89 _canvas.width = _image.width; 90 _canvas.height = _image.height; 91 } 92 93 function render(timestamp) { 94 let width = _canvas.width; 95 let height = _canvas.height; 96 97 _context.clearRect(0, 0, width, height); 98 99 _context.drawImage(_imageData, 0, 0, _image.width, _image.height); 100 101 if (.5 < Math.random()) { 102 getRandomValue(effectList)(_context, width, height); 103 } 104 105 window.requestAnimationFrame(render); 106 } 107 108 function getRandomValue(array) { 109 return array[Math.floor(Math.random() * array.length)]; 110 } 111 document.addEventListener('DOMContentLoaded', init); 112})(window);

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

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

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

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

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

guest

回答1

0

ベストアンサー

aタグにonmouseoverイベントをaddEventListenerしてそこからrender関数を呼べばいいのではないでしょうか。

https://codepen.io/riafeed/pen/BarqJbK

canvasが上に重なってる状態ってことのようなのでcanvasのほうにonmouseoverイベントを設定し、非表示をdisplayではなくopacityでやりました。

https://codepen.io/riafeed/pen/xxWyzvG

投稿2022/08/14 14:58

編集2022/08/15 00:19
RiaFeed

総合スコア2701

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

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

kou0401

2022/08/14 16:16

ご回答ありがとうございます。 javascriptを更新したのですが、マウスオーバーしても実行しませんでした。 codepenでは確認できているので、CSSを追記しました。
kou0401

2022/08/15 04:47

丁寧なご回答ありがとうございます。度々質問失礼いたします。 画像を複数枚用意した場合、すべてに適応させたい場合はonmouseoverイベントをcanvasに設定するのは難しいでしょうか? https://codepen.io/Kota4141/pen/ZExqMVa
kou0401

2022/08/15 11:09

イメージ通りの挙動になりました。ありがとうございました。 コードを見て勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問