ボタンを押すとボタンの上のテキストにブラーを掛けるフィルターをCSSで設定しています。
再度ボタンを押すとブラーが解けます。
動作サンプル
このフィルターにtransitionを設定する方法をご教示いただけないでしょうか。
現状はフィルターを掛ける要素にtransition: 5s;
を設定していますが、transitionが効いてない状態です。
使用しているツール
- React.js
- styled-components
ソースコード
jsx
1import React, { useState, useEffect } from "react"; 2import styled from "styled-components"; 3 4export default function App() { 5 const [blur, setBlur] = useState(false); 6 useEffect(() => { 7 TextWrap = styled.div` 8 transition: 5s; 9 filter: blur(${blur ? 0 : "5px"}); 10 `; 11 }, [blur]); 12 13 return ( 14 <div className="App"> 15 <TextWrap> 16 <h1>Hello CodeSandbox</h1> 17 <h2>Start editing to see some magic happen!</h2> 18 </TextWrap> 19 <Button onClick={() => setBlur(!blur)}>button</Button> 20 </div> 21 ); 22} 23 24const Button = styled.button` 25 width: 200px; 26 height: 200px; 27 background: red; 28 border: none; 29 color: white; 30 font-size: 2rem; 31 cursor: pointer; 32 transition: 0.2s; 33 &:hover { 34 background: blue; 35 } 36 &:active { 37 background: green; 38 } 39`; 40 41let TextWrap = styled.div``; 42
transitionが効かない考えられる原因
クリックイベントのsetStateにより再レンダーされ、再レンダーの際にblurのbooleanを判定しブラーを掛けているためかと思われます。
レンダー時にフィルターの挙動が終わっているので、transitionからするとフィルターは動いていないと判断し、trasnitionが効かないのではないかと考えました。
現状の実装の方向でtransitionを付けるとなると、テキスト群のマウント時・アンマウント時にアニメーションを付ける方法が考えられますが、その方向は大げさな気がしています。
現状の実装の方向性にこだわりはなく、私がこの方法しか思いつかなかっただけです。
機能が実現できれば実装方法は問いませんので、よりシンプルに実装できる方法があればご教示ください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。