角度が変わらない斜めの背景の作り方(CSS)

こんにちは、ナカムラです。
今回はCSSで角度が変わらない斜めの背景の作り方をご紹介します。
ウィンドウ幅いっぱいに、なおかつ斜めになっているデザインはよく使われます。
やり方はいろいろあると思いますが、今回はclip-pathを使ってみたいと思います。

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

実現したい条件

  1. 背景はウィンドウ幅いっぱいに表示する
  2. 斜めの角度は変わらないようにする
  3. コンテンツのボリュームが変わっても高さが変動するようにする

DEMO

See the Pen 角度が変わらない斜めの背景 by Nakamura (@takayo-nakamura) on CodePen.

HTML

.sectionの中には.section_backgroundと.section_innerの要素があります。
.section__backgroundは背景用の要素で、.section_innerはコンテンツ用の要素になります。

CSS

.section_backgroundはposition: absolute;にし、height: 100%で.sectionの高さに合わせます。
中にある画像を中央に配置し、clip-pathで斜めになるように座標を調整します。

clip-path: polygon(100% 100%,0 calc(100% - 216px),0 256px,100% 0);

polygon()は右下の[x値 y値],左下の[x値 y値],左上の[x値 y値],右上の[x値 y値]という順番になっています。

1. 背景はウィンドウ幅いっぱいに表示する

.section_backgroundはwidth:100%;にし、画像もwidthは100%ですが、min-widthを2000pxにします。
これは2000pxまでの画面を想定しているためなので、作りたい仕様に合わせて変更してください。
このままではコンテンツの幅が常に2560px必要になり、横スクロールが発生してしまうので、.section_backgroundにoverflow: hidden;を入れています。

2. 斜めの角度は変わらないようにする

画像はwidth:100%で良いのでは?と思うかもしれませんがそれだと角度が変わってしまいます。
幅が変動する場合、それに合わせてclip-pathのy値も変わる必要がありますが、そこまでするのは大変なので幅を固定する方法にしています。

3. コンテンツのボリュームが変わっても高さが変動するようにする

.section_backgroundとその中のimgをheight:100%;にすることで、コンテンツが変わっても同じように斜めの背景になります。
imgには object-fit: cover;で要素いっぱいに表示するようにしておきます。

最後に

今回は背景用の要素を設置しています。
背景用の要素を設置せずに、beforeなどの擬似要素を使うことでも再現可能です。
ただし、その場合は.sectionにoverflow: hidden;をつけることになります。
要素内でposition:sticky;を使用したい場合は機能しなくなるのでご注意ください。