【css】clip-pathと仲良くなりたいwebデザイナーの話

こんにちは、ゆるふわwebデザイナーのなかむらです。 弊社ではデザイナーがコーディングまで行うことがあるのですが、フロントエンドエンジニアさんのような知識があるわけでもないゆるふわデザイナー2人がclip-pathツールを使おうとしてドツボにハマった経験を活かし、表層だけを撫でるclip-pathの記事を執筆いたします。



clip-pathとは

clip-path は CSS のプロパティで、要素のどの部分を表示するかを設定するクリッピング領域を作ります。具体的には、領域の内部の部分は表示され、外側の部分は非表示になります。

clip-path - CSS: カスケーディングスタイルシート | MDN

つまり、四角い画像cssを使ってコード上で任意の形に切り抜ける、という便利なプロパティです。


メリット

ここで「画像の切り抜きなら先に切り抜いた画像を使えばいいんじゃ?」と思われるかもしれませんが、コード面でもユーザビリティ面でも色々とメリットがあります。

『clip-path』の使い方や活用シーンを解説【CSS】 | あびふり


中でも個人的には以下の3つが大きいと思っています。

  • 画像の差し替えが簡単

  • PCとSPで画像を分ける必要がない(作業者の手間が減るし、サイトも軽くなってユーザーも見やすい)

  • 後からでも簡単に形を変えることが可能


落とし穴

Safariと死ぬほど仲が悪い

めっちゃ便利な機能のはずなのに、とにかくSafariとの相性が悪い。

↑こう言ってらっしゃるが、公開しているものはSafariでも問題なく表示されている。簡単な形なら許されるのかな…

みんな嘆いてる


落とし穴にはまらない使い方とポイント

clip-pathの2種類の使い方と、それぞれで落とし穴にはまらないためのポイントをご紹介します。

パターン1:clip-pathに直接数値を書いて切り抜く

比較的簡単な形(以下のジェネレーターで作成可能な形)ならこの方法が無難

ジェネレーター:Clippy — CSS clip-path maker


記述はこんな感じ

.hoge-bg{
       background: url(/img/bg-mv.png) ; //四角い画像
       background-size: 100px;
       background-position: center;
       clip-path: inset(8% 6.5% round 50vw 50vw 0 0); //切り抜く形
       -webkit-clip-path: inset(8% 6.5% round 50vw 50vw 0 0); //Safari用 絶対書く!!
       -moz-clip-path: inset(8% 6.5% round 50vw 50vw 0 0);
       width: 100%;
       height: 100%;
}


🌟ポイント

ベンダープレフィックス絶ッッッ対書く(6、7行目)

また、パターン1でなら表示できた、という報告も…。


パターン2:svgで書いたパスをclip-pathに読み込んで切り抜く

ふにゃふにゃしてたりパターン1のジェネレータで作れないような複雑な形の場合の方法

例:橋本環奈オフィシャルファンクラブ「橋本純情内科」


ざっくり言うと、

切り抜きたい形のsvgのパスを配置し、そのsvgを画像の方で読み込んで適用させて切り抜く


記述はこんな感じ

<div class="mv">
        <svg xmlns="http://www.w3.org/2000/svg" style="height: 0; width: 0;"> //切り抜きたい形のsvg
              <clipPath id="任意のID" clipPathUnits="objectBoundingBox">
                    <path d="M195 0.000610352C87.2582 0.270325 0 87.695 0 195.5V772H391V259V195.5V0H195.5H195V0.000610352Z" transform="translate(0.3 0.6) scale(0.003333, 0.00125)"></path>
              </clipPath>
        </svg>
        <svg class="例えばのクラス名" viewBox="0 0 500 800"> //画像を配置するためのsvg
              <image clip-path="url(#3行目で設定した任意のID)" width="100%" height="100%" preserveAspectRatio="xMidYMin slice" xlink:href="img/img-mv01.png" style="-ms-filter: blur(1.5px);
          filter: blur(1.5px);"></image>
        </svg>
</div>
    
<style> //必要に応じて適宜スタイル当てる
        .mv {                
                .例えばのクラス名 {
                    height: 210vw;
                }
            }
</style>


🌟ポイント①

  1. clipPathにclipPathUnits="objectBoundingBox"をつける

  2. pathのサイズを0-1に正規化する

1.はそのままなのですが、2.のpathのサイズを正規化するというのが重要です。clipPathUnits="objectBoundingBox"をつけると、pathがviewBoxの範囲ではなく、0-1の範囲で描画されるようになります。

pathの項目一つ一つの数値をviewBoxの数値で割ることでも可能ではありますが、手っ取り早くtransformでscaleを指定しましょう。

scaleで指定する数値は、以下の計算で求めることができます。 1 / viewBoxの数値

transformでtranslate等が指定されていれば、その数値もviewBoxの数値で割る必要があります。

上記のコードの場合は、scaleに指定する数値は、

scale=1÷103.758=0.009637scale=1÷103.758=0.009637

transformの数値は、

transform=−13÷103.758=−0.125281transform=−13÷103.758=−0.125281

です。

切り抜く要素のサイズに合わせてSVGでclip-pathする - Qiita


上記のコードで言うと以下の部分です

4行目scale(0.003333, 0.00125)

7行目viewBox="0 0 500 800"


🌟ポイント②

8行目width="100%" height="100%"がないとsafariのみで画像自体が表示されなくなるので必須です


パスのsvgの作り方

切り抜きたい形はIllustratorやXDなどで作成したパスオブジェクトを使用することができます。

XDでのやり方

  1. 切り取りたいオブジェクトを右クリックして「svgコードのコピー」を選ぶ

  2. コピーしてペーストすると必要な情報が得られる


Illustratorでのやり方

  1. 「別名で保存」でsvg保存する

  2. SVGオプションの中の「SVGコード」を選択する

  3. 必要なソースコードを抜き取る

参考:IllustratorからhtmlにSVGアイコンを表示するまでの流れ - Qiita


まとめ

手計算が必要だったり、ちょっとSafariと相性の悪いclip-pathですが、使えるとコーディングの幅がグッと広がるclip-pathですのでお役に立てたら幸いです!