CSSのイージングではlinear・ease・ease-in・ease-out・ease-in-outの5つのキーワードが用意されていますが、それ以外にもcubic-bezier()関数を使用することでいろいろなイージングの設定を行えます。
今回はよく利用されるイージングのパターンをSass上で使用しやすいように設定をいくつか試してみます。
サンプルコード
まずはイージング名ごとに変数を用意する方法です。
使用している値についてはCeaserを参照しています。
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 | $easeInSine: cubic-bezier( 0.470 , 0.000 , 0.745 , 0.715 ); $easeOutSine: cubic-bezier( 0.390 , 0.575 , 0.565 , 1.000 ); $easeInOutSine: cubic-bezier( 0.445 , 0.050 , 0.550 , 0.950 ); $easeInQuad: cubic-bezier( 0.550 , 0.085 , 0.680 , 0.530 ); $easeOutQuad: cubic-bezier( 0.250 , 0.460 , 0.450 , 0.940 ); $easeInOutQuad: cubic-bezier( 0.455 , 0.030 , 0.515 , 0.955 ); $easeInCubic: cubic-bezier( 0.550 , 0.055 , 0.675 , 0.190 ); $easeOutCubic: cubic-bezier( 0.215 , 0.610 , 0.355 , 1.000 ); $easeInOutCubic: cubic-bezier( 0.645 , 0.045 , 0.355 , 1.000 ); $easeInQuart: cubic-bezier( 0.895 , 0.030 , 0.685 , 0.220 ); $easeOutQuart: cubic-bezier( 0.165 , 0.840 , 0.440 , 1.000 ); $easeInOutQuart: cubic-bezier( 0.770 , 0.000 , 0.175 , 1.000 ); $easeInQuint: cubic-bezier( 0.755 , 0.050 , 0.855 , 0.060 ); $easeOutQuint: cubic-bezier( 0.230 , 1.000 , 0.320 , 1.000 ); $easeInOutQuint: cubic-bezier( 0.860 , 0.000 , 0.070 , 1.000 ); $easeInExpo: cubic-bezier( 0.950 , 0.050 , 0.795 , 0.035 ); $easeOutExpo: cubic-bezier( 0.190 , 1.000 , 0.220 , 1.000 ); $easeInOutExpo: cubic-bezier( 1.000 , 0.000 , 0.000 , 1.000 ); $easeInCirc: cubic-bezier( 0.600 , 0.040 , 0.980 , 0.335 ); $easeOutCirc: cubic-bezier( 0.075 , 0.820 , 0.165 , 1.000 ); $easeInOutCirc: cubic-bezier( 0.785 , 0.135 , 0.150 , 0.860 ); $easeInBack: cubic-bezier( 0.600 , -0.280 , 0.735 , 0.045 ); $easeOutBack: cubic-bezier( 0.175 , 0.885 , 0.320 , 1.275 ); $easeInOutBack: cubic-bezier( 0.680 , -0.550 , 0.265 , 1.550 ); .test { transition : left 500 ms $easeInQuad; } |
各イージングの設定については以前にjquery.easing.jsについての記事を投稿していますので、そちらをご確認ください。
ElasticとBounceについては参照元にもありませんが、cubic-bezier()では対応できないようです。
コンパイルすると、.testの値がきちんと出力されました。
1 2 3 | .test { transition : left . 5 s cubic-bezier(. 55 , . 085 , . 68 , . 53 ); } |
次に各イージング設定をmapで管理する方法です。
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 | @use "sass:map" ; $easing: ( linear: cubic-bezier( 0.250 , 0.250 , 0.750 , 0.750 ), ease: cubic-bezier( 0.250 , 0.100 , 0.250 , 1.000 ), ease-in: cubic-bezier( 0.420 , 0.000 , 1.000 , 1.000 ), ease-out: cubic-bezier( 0.000 , 0.000 , 0.580 , 1.000 ), ease-in-out: cubic-bezier( 0.420 , 0.000 , 0.580 , 1.000 ), easeInSine: cubic-bezier( 0.470 , 0.000 , 0.745 , 0.715 ), easeOutSine: cubic-bezier( 0.390 , 0.575 , 0.565 , 1.000 ), easeInOutSine: cubic-bezier( 0.445 , 0.050 , 0.550 , 0.950 ), easeInQuad: cubic-bezier( 0.550 , 0.085 , 0.680 , 0.530 ), easeOutQuad: cubic-bezier( 0.250 , 0.460 , 0.450 , 0.940 ), easeInOutQuad: cubic-bezier( 0.455 , 0.030 , 0.515 , 0.955 ), easeInCubic: cubic-bezier( 0.550 , 0.055 , 0.675 , 0.190 ), easeOutCubic: cubic-bezier( 0.215 , 0.610 , 0.355 , 1.000 ), easeInOutCubic: cubic-bezier( 0.645 , 0.045 , 0.355 , 1.000 ), easeInQuart: cubic-bezier( 0.895 , 0.030 , 0.685 , 0.220 ), easeOutQuart: cubic-bezier( 0.165 , 0.840 , 0.440 , 1.000 ), easeInOutQuart: cubic-bezier( 0.770 , 0.000 , 0.175 , 1.000 ), easeInQuint: cubic-bezier( 0.755 , 0.050 , 0.855 , 0.060 ), easeOutQuint: cubic-bezier( 0.230 , 1.000 , 0.320 , 1.000 ), easeInOutQuint: cubic-bezier( 0.860 , 0.000 , 0.070 , 1.000 ), easeInExpo: cubic-bezier( 0.950 , 0.050 , 0.795 , 0.035 ), easeOutExpo: cubic-bezier( 0.190 , 1.000 , 0.220 , 1.000 ), easeInOutExpo: cubic-bezier( 1.000 , 0.000 , 0.000 , 1.000 ), easeInCirc: cubic-bezier( 0.600 , 0.040 , 0.980 , 0.335 ), easeOutCirc: cubic-bezier( 0.075 , 0.820 , 0.165 , 1.000 ), easeInOutCirc: cubic-bezier( 0.785 , 0.135 , 0.150 , 0.860 ), easeInBack: cubic-bezier( 0.600 , -0.280 , 0.735 , 0.045 ), easeOutBack: cubic-bezier( 0.175 , 0.885 , 0.320 , 1.275 ), easeInOutBack: cubic-bezier( 0.680 , -0.550 , 0.265 , 1.550 ) ); .test { transition : left 500 ms map.get($easing, easeInQuad); } |
コンパイル結果は先ほどと同様です。
map.get()を使っての取得になるので、最初の変数の方法と比べると設定が少し手間です。
前の例を少し変更して、設定するための関数を別途用意する形にしてみます。
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 | @use "sass:map" ; $easing: ( linear: cubic-bezier( 0.250 , 0.250 , 0.750 , 0.750 ), ease: cubic-bezier( 0.250 , 0.100 , 0.250 , 1.000 ), ease-in: cubic-bezier( 0.420 , 0.000 , 1.000 , 1.000 ), ease-out: cubic-bezier( 0.000 , 0.000 , 0.580 , 1.000 ), ease-in-out: cubic-bezier( 0.420 , 0.000 , 0.580 , 1.000 ), easeInSine: cubic-bezier( 0.470 , 0.000 , 0.745 , 0.715 ), easeOutSine: cubic-bezier( 0.390 , 0.575 , 0.565 , 1.000 ), easeInOutSine: cubic-bezier( 0.445 , 0.050 , 0.550 , 0.950 ), easeInQuad: cubic-bezier( 0.550 , 0.085 , 0.680 , 0.530 ), easeOutQuad: cubic-bezier( 0.250 , 0.460 , 0.450 , 0.940 ), easeInOutQuad: cubic-bezier( 0.455 , 0.030 , 0.515 , 0.955 ), easeInCubic: cubic-bezier( 0.550 , 0.055 , 0.675 , 0.190 ), easeOutCubic: cubic-bezier( 0.215 , 0.610 , 0.355 , 1.000 ), easeInOutCubic: cubic-bezier( 0.645 , 0.045 , 0.355 , 1.000 ), easeInQuart: cubic-bezier( 0.895 , 0.030 , 0.685 , 0.220 ), easeOutQuart: cubic-bezier( 0.165 , 0.840 , 0.440 , 1.000 ), easeInOutQuart: cubic-bezier( 0.770 , 0.000 , 0.175 , 1.000 ), easeInQuint: cubic-bezier( 0.755 , 0.050 , 0.855 , 0.060 ), easeOutQuint: cubic-bezier( 0.230 , 1.000 , 0.320 , 1.000 ), easeInOutQuint: cubic-bezier( 0.860 , 0.000 , 0.070 , 1.000 ), easeInExpo: cubic-bezier( 0.950 , 0.050 , 0.795 , 0.035 ), easeOutExpo: cubic-bezier( 0.190 , 1.000 , 0.220 , 1.000 ), easeInOutExpo: cubic-bezier( 1.000 , 0.000 , 0.000 , 1.000 ), easeInCirc: cubic-bezier( 0.600 , 0.040 , 0.980 , 0.335 ), easeOutCirc: cubic-bezier( 0.075 , 0.820 , 0.165 , 1.000 ), easeInOutCirc: cubic-bezier( 0.785 , 0.135 , 0.150 , 0.860 ), easeInBack: cubic-bezier( 0.600 , -0.280 , 0.735 , 0.045 ), easeOutBack: cubic-bezier( 0.175 , 0.885 , 0.320 , 1.275 ), easeInOutBack: cubic-bezier( 0.680 , -0.550 , 0.265 , 1.550 ) ); @function ease($easingName: ease) { $thisEasing: map.get($easing, ease); @if map.has-key($easing, $easingName) { $thisEasing: map.get($easing, $easingName); } @else { @warn "#{$easingName}は未定義のイージングです" ; } @return $thisEasing; } .test { transition : left 500 ms ease(easeInQuad); } |
ease()という関数を使っての呼び出しになったので、前の例と比べると設定の手間は若干減りました。
実際に使用する場合は最初の変数で管理する方法か、3つ目のmapと関数で管理する方法がよさそうに思いますが、どちらの場合でもエディタの入力補完が効くので開発環境上の管理のしやすさで選ぶで問題なさそうです。
最後に一通り設定して動作を試してみます。
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 | < h2 >easeIn</ h2 > < div class = "box" >< div class = "easeInSine" >easeInSine</ div ></ div > < div class = "box" >< div class = "easeInQuad" >easeInQuad</ div ></ div > < div class = "box" >< div class = "easeInCubic" >easeInCubic</ div ></ div > < div class = "box" >< div class = "easeInQuart" >easeInQuart</ div ></ div > < div class = "box" >< div class = "easeInQuint" >easeInQuint</ div ></ div > < div class = "box" >< div class = "easeInExpo" >easeInExpo</ div ></ div > < div class = "box" >< div class = "easeInCirc" >easeInCirc</ div ></ div > < div class = "box" >< div class = "easeInBack" >easeInBack</ div ></ div > < h2 >easeOut</ h2 > < div class = "box" >< div class = "easeOutSine" >easeOutSine</ div ></ div > < div class = "box" >< div class = "easeOutQuad" >easeOutQuad</ div ></ div > < div class = "box" >< div class = "easeOutCubic" >easeOutCubic</ div ></ div > < div class = "box" >< div class = "easeOutQuart" >easeOutQuart</ div ></ div > < div class = "box" >< div class = "easeOutQuint" >easeOutQuint</ div ></ div > < div class = "box" >< div class = "easeOutExpo" >easeOutExpo</ div ></ div > < div class = "box" >< div class = "easeOutCirc" >easeOutCirc</ div ></ div > < div class = "box" >< div class = "easeOutBack" >easeOutBack</ div ></ div > < h2 >easeInOut</ h2 > < div class = "box" >< div class = "easeInOutSine" >easeInOutSine</ div ></ div > < div class = "box" >< div class = "easeInOutQuad" >easeInOutQuad</ div ></ div > < div class = "box" >< div class = "easeInOutCubic" >easeInOutCubic</ div ></ div > < div class = "box" >< div class = "easeInOutQuart" >easeInOutQuart</ div ></ div > < div class = "box" >< div class = "easeInOutQuint" >easeInOutQuint</ div ></ div > < div class = "box" >< div class = "easeInOutExpo" >easeInOutExpo</ div ></ div > < div class = "box" >< div class = "easeInOutCirc" >easeInOutCirc</ div ></ div > < div class = "box" >< div class = "easeInOutBack" >easeInOutBack</ div ></ div > |
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | @use "sass:map" ; $easing: ( linear: cubic-bezier( 0.250 , 0.250 , 0.750 , 0.750 ), ease: cubic-bezier( 0.250 , 0.100 , 0.250 , 1.000 ), ease-in: cubic-bezier( 0.420 , 0.000 , 1.000 , 1.000 ), ease-out: cubic-bezier( 0.000 , 0.000 , 0.580 , 1.000 ), ease-in-out: cubic-bezier( 0.420 , 0.000 , 0.580 , 1.000 ), easeInSine: cubic-bezier( 0.470 , 0.000 , 0.745 , 0.715 ), easeOutSine: cubic-bezier( 0.390 , 0.575 , 0.565 , 1.000 ), easeInOutSine: cubic-bezier( 0.445 , 0.050 , 0.550 , 0.950 ), easeInQuad: cubic-bezier( 0.550 , 0.085 , 0.680 , 0.530 ), easeOutQuad: cubic-bezier( 0.250 , 0.460 , 0.450 , 0.940 ), easeInOutQuad: cubic-bezier( 0.455 , 0.030 , 0.515 , 0.955 ), easeInCubic: cubic-bezier( 0.550 , 0.055 , 0.675 , 0.190 ), easeOutCubic: cubic-bezier( 0.215 , 0.610 , 0.355 , 1.000 ), easeInOutCubic: cubic-bezier( 0.645 , 0.045 , 0.355 , 1.000 ), easeInQuart: cubic-bezier( 0.895 , 0.030 , 0.685 , 0.220 ), easeOutQuart: cubic-bezier( 0.165 , 0.840 , 0.440 , 1.000 ), easeInOutQuart: cubic-bezier( 0.770 , 0.000 , 0.175 , 1.000 ), easeInQuint: cubic-bezier( 0.755 , 0.050 , 0.855 , 0.060 ), easeOutQuint: cubic-bezier( 0.230 , 1.000 , 0.320 , 1.000 ), easeInOutQuint: cubic-bezier( 0.860 , 0.000 , 0.070 , 1.000 ), easeInExpo: cubic-bezier( 0.950 , 0.050 , 0.795 , 0.035 ), easeOutExpo: cubic-bezier( 0.190 , 1.000 , 0.220 , 1.000 ), easeInOutExpo: cubic-bezier( 1.000 , 0.000 , 0.000 , 1.000 ), easeInCirc: cubic-bezier( 0.600 , 0.040 , 0.980 , 0.335 ), easeOutCirc: cubic-bezier( 0.075 , 0.820 , 0.165 , 1.000 ), easeInOutCirc: cubic-bezier( 0.785 , 0.135 , 0.150 , 0.860 ), easeInBack: cubic-bezier( 0.600 , -0.280 , 0.735 , 0.045 ), easeOutBack: cubic-bezier( 0.175 , 0.885 , 0.320 , 1.275 ), easeInOutBack: cubic-bezier( 0.680 , -0.550 , 0.265 , 1.550 ) ); @function ease($easingName: linear ) { $thisEasing: map.get($easing, linear ); @if map.has-key($easing, $easingName) { $thisEasing: map.get($easing, $easingName); } @else { @warn "#{$easingName}は未定義のイージングです" ; } @return $thisEasing; } .box { margin : 40px ; background : lightgray; } .box div { display : flex ; align-items : center ; justify-content : center ; width : 150px ; height : 50px ; margin-left : 0 ; background : skyblue; transition-property : margin- left ; transition-duration: 500 ms; } .box:hover div { margin-left : 300px ; } .easeInSine { transition-timing-function : ease(easeInSine); } .easeOutSine { transition-timing-function : ease(easeOutSine); } .easeInOutSine { transition-timing-function : ease(easeInOutSine); } .easeInQuad { transition-timing-function : ease(easeInQuad); } .easeOutQuad { transition-timing-function : ease(easeOutQuad); } .easeInOutQuad { transition-timing-function : ease(easeInOutQuad); } .easeInCubic { transition-timing-function : ease(easeInCubic); } .easeOutCubic { transition-timing-function : ease(easeOutCubic); } .easeInOutCubic { transition-timing-function : ease(easeInOutCubic); } .easeInQuart { transition-timing-function : ease(easeInQuart); } .easeOutQuart { transition-timing-function : ease(easeOutQuart); } .easeInOutQuart { transition-timing-function : ease(easeInOutQuart); } .easeInQuint { transition-timing-function : ease(easeInQuint); } .easeOutQuint { transition-timing-function : ease(easeOutQuint); } .easeInOutQuint { transition-timing-function : ease(easeInOutQuint); } .easeInExpo { transition-timing-function : ease(easeInExpo); } .easeOutExpo { transition-timing-function : ease(easeOutExpo); } .easeInOutExpo { transition-timing-function : ease(easeInOutExpo); } .easeInCirc { transition-timing-function : ease(easeInCirc); } .easeOutCirc { transition-timing-function : ease(easeOutCirc); } .easeInOutCirc { transition-timing-function : ease(easeInOutCirc); } .easeInBack { transition-timing-function : ease(easeInBack); } .easeOutBack { transition-timing-function : ease(easeOutBack); } .easeInOutBack { transition-timing-function : ease(easeInOutBack); } |
コメントが承認されるまで時間がかかります。