CSSだけでモーフィングを実装できる!文字列を違う文字列に滑らかに変化させるCSSのテクニック
Post on:2021年6月7日
文字列を違う文字列に滑らかに変化させるモーフィングをCSSで実装するテクニックを紹介します。
モーフィングは人が別の人に変化するのを映画やテレビで見かけますが、文字ならCSSだけでそれっぽく簡単に実装できます。
仕組みは、CSSのblurとcontrastで文字をぼかして変化の間をつなげています。
実際の動作は、下記でお楽しみください。
「Run Pen」をクリックすると動作します。「0.5x」にするとちょうどいいかも。
See the Pen
CSS morphing by Amit Sheen (@amit_sheen)
on CodePen.
実装コードは、下記の通りです。
デモでは7つのワードをモーフィングしています。ワードの数は増減もOKで、その際はCSSを少し変更します。
1 2 3 4 5 6 7 8 9 |
<div class="morphing"> <div class="word">Pure CSS</div> <div class="word">morphing</div> <div class="word">Pure CSS</div> <div class="word">pure</div> <div class="word">CSS</div> <div class="word">is</div> <div class="word">great!</div> </div> |
7つのワード版のCSSです。
ワードの数やスピードを調整できますが、次のSCSSで変更する方が簡単です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
@import url('https://fonts.googleapis.com/css2?family=Roboto+Slab&display=swap'); *, *::before, *::after { padding: 0; margin: 0 auto; box-sizing: border-box; } body { font-family: 'Roboto Slab', serif; } .morphing { position: relative; font-size: 120px; background-color: #000; color: #fff; min-height: 100vh; filter: contrast(25) blur(1px); } .word { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); animation: word 16s infinite ease-in-out; } .word:nth-child(1) { animation-delay: -16s; } .word:nth-child(2) { animation-delay: -14s; } .word:nth-child(3) { animation-delay: -12s; } .word:nth-child(4) { animation-delay: -10s; } .word:nth-child(5) { animation-delay: -8s; } .word:nth-child(6) { animation-delay: -6s; } .word:nth-child(7) { animation-delay: -4s; } @keyframes word { 0%, 5%, 100% { filter: blur(0px); opacity: 1; } 20%, 80% { filter: blur(1em); opacity: 0; } } |
上記のSCSSです。
スピードは$speed: 16s;を、ワード数は$wordCount: 7;の数値を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
@import url('https://fonts.googleapis.com/css2?family=Roboto+Slab&display=swap'); *, *::before, *::after { padding: 0; margin: 0 auto; box-sizing: border-box; } body { font-family: 'Roboto Slab', serif; } $speed: 16s; $wordCount: 7; .morphing { position: relative; font-size: 120px; background-color: #000; color: #fff; min-height: 100vh; filter: contrast(25) blur(1px); } .word { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); animation: word $speed infinite ease-in-out; @for $i from 0 to $wordCount { &:nth-child(#{$i + 1}) { animation-delay: ($speed / ($wordCount + 1) * $i) - $speed; } } @keyframes word { 0%, 5%, 100% { filter: blur(0px); opacity: 1; } 20%, 80% { filter: blur(1em); opacity: 0; } } } |
sponsors