CSSで手軽にカスタムイージングを使おう!

CSSで手軽にカスタムイージングを使おう!

どうも、イソップです。

今日はCSSアニメーションでのイージングの話です。

CSSで用意されている、ease , linear , ease-in , ease-out のイージングは、
バリエーションが少ないのが残念なところですよね。
もっとJSのような動きをつけたいこともよくあります。

cubic-bezier() で自分でイージングを定義出来ますが、仕組みがわからないと手を出せないですし、
cubic-bezier.comなどで、ベジェ曲線を作ってもいいですが、結構手間だったりします。

そこで、個人的に使っているイージングスニペットを紹介します。
このスニペットを使えば、すぐにCSSアニメーションでイージングが使えます。
かなり便利ですよ〜。

最近は凝った演出を実装する機会が多く、スマホでも比較的処理が軽いCSSアニメーションを多用しています。

Sassのイージングスニペット

まずは実際のデモを見てください。

See the Pen BQBJwv by Youhei Isokawa (@yuhiisk) on CodePen.

JavaScriptじゃありません、CSSアニメーションです

数年前、Compassを使っていた頃に出会った compass-ceaser-easing にインスパイアされました。
これはCompassのエクステンションなのですが、中でcubic-bezierによるイージングが定義されています。

それを、自分でscssに書き直しました。

// イージング値の取得
@function returnEaseTypeToCubicBezier($type) {
    $easingValue: "";

    @if $type == "linear" {
        $easingValue: "0.250, 0.250, 0.750, 0.750";
    }
    @else if $type ==  "ease" {
        $easingValue: "0.250, 0.100, 0.250, 1.000";
    }
    @else if $type ==  "ease-in" {
        $easingValue: "0.420, 0.000, 1.000, 1.000";
    }
    @else if $type ==  "ease-out" {
        $easingValue: "0.000, 0.000, 0.580, 1.000";
    }
    @else if $type ==  "ease-in-out" {
        $easingValue: "0.420, 0.000, 0.580, 1.000";
    }

    @else if $type ==  "easeInQuad" {
        $easingValue: "0.550, 0.085, 0.680, 0.530";
    }
    @else if $type ==  "easeInCubic" {
        $easingValue: "0.550, 0.055, 0.675, 0.190";
    }
    @else if $type ==  "easeInQuart" {
        $easingValue: "0.895, 0.030, 0.685, 0.220";
    }
    @else if $type ==  "easeInQuint" {
        $easingValue: "0.755, 0.050, 0.855, 0.060";
    }
    @else if $type ==  "easeInSine" {
        $easingValue: "0.470, 0.000, 0.745, 0.715";
    }
    @else if $type ==  "easeInExpo" {
        $easingValue: "0.950, 0.050, 0.795, 0.035";
    }
    @else if $type ==  "easeInCirc" {
        $easingValue: "0.600, 0.040, 0.980, 0.335";
    }
    @else if $type ==  "easeInBack" {
        $easingValue: "0.600, -0.280, 0.735, 0.045";
    }


    @else if $type ==  "easeOutQuad" {
        $easingValue: "0.250, 0.460, 0.450, 0.940";
    }
    @else if $type ==  "easeOutCubic" {
        $easingValue: "0.215, 0.610, 0.355, 1.000";
    }
    @else if $type ==  "easeOutQuart" {
        $easingValue: "0.165, 0.840, 0.440, 1.000";
    }
    @else if $type ==  "easeOutQuint" {
        $easingValue: "0.230, 1.000, 0.320, 1.000";
    }
    @else if $type ==  "easeOutSine" {
        $easingValue: "0.390, 0.575, 0.565, 1.000";
    }
    @else if $type ==  "easeOutExpo" {
        $easingValue: "0.190, 1.000, 0.220, 1.000";
    }
    @else if $type ==  "easeOutCirc" {
        $easingValue: "0.075, 0.820, 0.165, 1.000";
    }
    @else if $type ==  "easeOutBack" {
        $easingValue: "0.175, 0.885, 0.320, 1.275";
    }


    @else if $type ==  "easeInOutQuad" {
        $easingValue: "0.455, 0.030, 0.515, 0.955";
    }
    @else if $type ==  "easeInOutCubic" {
        $easingValue: "0.645, 0.045, 0.355, 1.000";
    }
    @else if $type ==  "easeInOutQuart" {
        $easingValue: "0.770, 0.000, 0.175, 1.000";
    }
    @else if $type ==  "easeInOutQuint" {
        $easingValue: "0.860, 0.000, 0.070, 1.000";
    }
    @else if $type ==  "easeInOutSine" {
        $easingValue: "0.445, 0.050, 0.550, 0.950";
    }
    @else if $type ==  "easeInOutExpo" {
        $easingValue: "1.000, 0.000, 0.000, 1.000";
    }
    @else if $type ==  "easeInOutCirc" {
        $easingValue: "0.785, 0.135, 0.150, 0.860";
    }
    @else if $type ==  "easeInOutBack" {
        $easingValue: "0.680, -0.550, 0.265, 1.550";
    }

    @return unquote($easingValue);
}

// cubic-bezierの呼び出し
@function ease($type) {
    @return unquote("cubic-bezier(#{returnEaseTypeToCubicBezier($type)})");
}

使い方

使い方は超絶シンプルです。
イージング名からcubic-bezierを取得する ease 関数を定義したので、次のように使います。

.element {
    transition: transform .7s ease('easeOutExpo');
}

コンパイル後のCSSです。

.element {
    transition: transform 0.7s cubic-bezier(0.190, 1.000, 0.220, 1.000);
}

はい、完全にイケてます

イージングの種類

  • linear
  • ease
  • ease-in
  • ease-in-out
  • easeInQuad
  • easeInCubic
  • easeInQuart
  • easeInQuint
  • easeInSine
  • easeInExpo
  • easeInCirc
  • easeInBack
  • easeOutQuad
  • easeOutCubic
  • easeOutQuart
  • easeOutQuint
  • easeOutSine
  • easeOutExpo
  • easeOutCirc
  • easeOutBack
  • easeInOutQuad
  • easeInOutCubic
  • easeInOutQuart
  • easeInOutQuint
  • easeInOutSine
  • easeInOutExpo
  • easeInOutCirc
  • easeInOutBack

※デフォルトのイージングも定義し直しています。

関数(@funciton)だから使いまわせる

じゃんじゃん使いまわしちゃってください。
コピペしちゃってください。
効率化しちゃってください。

CSSアニメーションが使えるブラウザなら、どれでも使用可能です。

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.