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

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

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

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

Q&A

3回答

901閲覧

JavaScript filterの追加

rfd

総合スコア2

JavaScript

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

0グッド

0クリップ

投稿2021/09/23 14:36

ボタン1とボタン2を用意してフィルターをかけます
ボタンを押すと中身が入れ替わりますが追加される形にしたい
別々のボタンでフィルタをかけながら、
filter = 'blur(3px) grayscale(100%)'のように追加されていく形にしたいです

ボタンを押したときに変数にフィルター名を追加する方法は考えましたがそれが正しいのかはわかりません

<div id="aaa" style="background:red;width:300px;height:300px">hello</div> <input type="button" value="ボタン1" onclick="document.getElementById('aaa').style.filter = 'blur(3px)'"> <input type="button" value="ボタン2" onclick="document.getElementById('aaa').style.filter = 'grayscale(100%)'"> <input type="button" value="確認用" onclick="alert(aaa.style.filter)">
これは動かない <div id="aaa" style="background:red;width:300px;height:300px">hello</div> <input type="button" value="ボタン1" onclick="document.getElementById('aaa').style.filter+ = 'blur(3px)'"> <input type="button" value="ボタン2" onclick="document.getElementById('aaa').style.filter+ = 'grayscale(100%)'"> <input type="button" value="確認用" onclick="alert(aaa.style.filter)">

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

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

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

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

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

m.ts10806

2021/09/23 14:39

>ボタンを押したときに変数にフィルター名を追加する方法は考えましたがそれが正しいのかはわかりません 実現できるなら「正しい」と言えるのでは。 考えただけですか?何かしら試して想定の動作をしてませんか?
rfd

2021/09/23 14:42

マシな書き方があれば教えていただきたいです <script> var f=""; function a(){ if(s==0){ f+="blur(3px) "; } if(s==1){ f+="grayscale(100%) "; } document.getElementById('aaa').style.filter = f; } </script> <div id="aaa" style="background:red;width:300px;height:300px">hello</div> <input type="button" value="" onclick="s=0;a()"> <input type="button" value="" onclick="s=1;a()"> <input type="button" value="" onclick="alert(aaa.style.filter)">
m.ts10806

2021/09/23 14:44

質問本文に記載してください。 >マシな書き方があれば教えていただきたいです 特に悪いとは思いません。要件満たせてるのでしたら。 しいてなら a(0) のように引数にして受け取るくらいはしておきたいですね。そこでしか使わない変数をグローバルにする意味ないですし。
guest

回答3

0

filter プロパティをstyle要素もしくは外部CSS化すると、管理が楽になります。
セマンティクス的にも、style属性を使用しない方法が推奨されます。

HTML

1<style> 2.foo { 3 filter: blur(3px); 4} 5.bar { 6 filter: grayscale(100%); 7} 8.foo.bar { 9 filter: blur(3px) grayscale(100%); 10} 11</style> 12 13<div id="sample" style="background:red;width:300px;height:300px;">filter test</div> 14<input type="button" value="ボタン1" data-action="add" data-set-class="foo"> 15<input type="button" value="ボタン2" data-action="add" data-set-class="bar"> 16<script> 17 'use strict'; 18 { 19 const handleClick = function handleClick (event) { 20 const input = event.target; 21 input.ownerDocument.getElementById('sample').classList.add(input.dataset.setClass); 22 }; 23 24 for (let input of document.querySelectorAll('input[data-set-class]')) { 25 input.addEventListener('click', handleClick, false); 26 } 27 } 28</script>

ここではclass属性を使用しましたが、data-*属性を使用しても構いません。

Re: rfd さん

投稿2021/09/25 01:09

編集2021/09/25 02:04
think49

総合スコア18189

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

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

0

<div id="aaa" style="background:red;width:300px;height:300px">hello</div> <input type="button" value="ボタン1" onclick="document.getElementById('aaa').style.filter = document.getElementById('aaa').style.filter+'blur(3px)'"> <input type="button" value="ボタン2" onclick="document.getElementById('aaa').style.filter = document.getElementById('aaa').style.filter+'grayscale(100%)'"> <input type="button" value="確認用" onclick="alert(aaa.style.filter)">

投稿2021/09/23 15:44

svky

総合スコア8

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

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

0

最初は「出来るやり方でやる」で良いと思います。
同じような処理を書いているなら共通化したり、変わる部分だけを引数や変数にしたり、
定義は外だししてみたり、色々やり方はあります。

なので下記もあくまで「現状のコードから改善していった結果」と捉えてください。


EventTarget.addEventListener()使った方がHTMLはスッキリします。
設定したい値は決め打ちにするなら配列オブジェクトに持っても良いですが、関連性持たせるならdata属性とか使ってみると汎用性は高まるかもしれません。
※結果は同じなので、正解というのはなく、一例です。実装の仕方は好みやプロジェクトのルールにも依存します

js

1<div id="aaa" style="background:red;width:300px;height:300px">hello</div> 2<input type="button" value="ボタン1" data-action="add" data-filter="blur(3px)"> 3<input type="button" value="ボタン2" data-action="add" data-filter="grayscale(100%)"> 4<input type="button" value="確認用" data-action="confirm" > 5<script> 6const action_func = function(event){ 7 let et = event.currentTarget; 8 let action = et.dataset.action; 9 if(action === 'confirm') { 10 alert(aaa.style.filter) 11 }else if ( action === 'add' ){ 12 aaa.style.filter += et.dataset.filter; 13 } 14} 15window.addEventListener('DOMContentLoaded', (event) => { 16 let btns = document.querySelectorAll('input[type="button"]'); 17 for(let i = 0 ; i < btns.length; i++){ 18 btns[i].addEventListener('click',action_func); 19 } 20}); 21</script>

投稿2021/09/23 15:06

編集2021/09/23 15:08
m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問