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

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

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

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1024閲覧

CSSのfilterにtransitionを設定したい。

MajinBoo

総合スコア16

CSS

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/02/10 04:14

ボタンを押すとボタンの上のテキストにブラーを掛けるフィルターを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を付けるとなると、テキスト群のマウント時・アンマウント時にアニメーションを付ける方法が考えられますが、その方向は大げさな気がしています。

現状の実装の方向性にこだわりはなく、私がこの方法しか思いつかなかっただけです。
機能が実現できれば実装方法は問いませんので、よりシンプルに実装できる方法があればご教示ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

React Hook の state の値をそのまま styled components に渡してあげるといいと思います。
このやり方ですとuseStateで実装できそうだと思いました。
https://styled-components.com/docs/basics#passed-props

またCSSのtransitionプロパティは、アニメーションさせるプロパティ名と時間の指定が必要です。
transition - CSS カスケーディングスタイルシート MDN

サンプルコード

js

1import React, { useState } from "react"; 2import styled from "styled-components"; 3 4export default function App() { 5 const [blur, setBlur] = useState(false); 6 7 return ( 8 <div className="App"> 9 <TextWrap blur={blur}> 10 <h1>Hello CodeSandbox</h1> 11 <h2>Start editing to see some magic happen!</h2> 12 </TextWrap> 13 <Button onClick={() => setBlur(!blur)}>button</Button> 14 </div> 15 ); 16} 17 18const Button = styled.button` 19 width: 200px; 20 height: 200px; 21 background: red; 22 border: none; 23 color: white; 24 font-size: 2rem; 25 cursor: pointer; 26 transition: 0.2s; 27 &:hover { 28 background: blue; 29 } 30 &:active { 31 background: green; 32 } 33`; 34 35const TextWrap = styled.div` 36 transition: filter 3s ease; // filterプロパティを3秒でアニメーションさせる 37 filter: ${props => (props.blur ? "blur(10px)" : "blur(0)")}; 38`; 39

投稿2020/02/20 10:31

編集2020/02/20 10:32
shgtkshruch

総合スコア665

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問