2024.09.21

HTML・CSS

mask-imageを利用したSVGの画像切り抜き

CSSのmask-imageプロパティを利用して、SVGで画像を切り抜きます。
デモページはこちら

まず、以下をmask.svgとして保存します。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350">
  <path d="M264.1,89.8h-3.9v-3.9c0-47.4-38.4-85.8-85.8-85.8c-47.5,0-85.9,38.4-85.9,85.8v3.9h-2.8C38.4,89.8,0,128.2,0,175.5 s38.4,85.9,85.8,85.9h2.8v2.8c0,47.4,38.4,85.8,85.8,85.8s85.8-38.4,85.8-85.8v-2.8h3.9c47.4,0,85.8-38.4,85.8-85.8 C349.9,128.2,311.5,89.8,264.1,89.8z"></path>
</svg>

共通のCSSは以下になります。画像ファイルにクラス名mask-imgを付与し、mask-imageプロパティのurlでマスクするsvgファイルを指定します。

.div-parent {
  position: relative;
  width: 100%;
  max-width: 350px;
  margin: 0 auto 2em;
}
.mask-img {
  mask-image: url(../img/mask.svg);
}

mask-imageの指定のみだと初期値のmask-repeat: repeatが適用されるため、マスクが繰り返されます。なお、mask-sizeの初期値はautoですが、これはcontainの指定と見た目は同じです。

まず、mask-size: containとmask-repeat: no-repeatを指定します。これでマスクの繰り返しは解除できます。

.style01 {
  mask-size: contain;
  mask-repeat: no-repeat;
}

mask-positionの初期値は0% 0%のため、マスクが画像の左上に寄っています。そこでmask-position: centerを指定します。

.style02 {
  mask-size: contain;
  mask-repeat: no-repeat;
  mask-position: center;
}

マスクのサイズは画像サイズに依存します。マスクを大きくする場合はdivのmax-widthを調整して画像を大きく表示すれば実現できます。

.style02 {
  mask-size: contain;
  mask-repeat: no-repeat;
  mask-position: center;
}
.style03 {
  max-width: 467px;
}

なお、マスクするsvgと画像の縦横比が違う場合、mask-size: coverを指定してもうまくマスクできません。

.style04 {
  mask-size: cover;
}

関連記事

2024.09.02

HTML・CSS

box-shadowとfilter: drop-shadowの違い

box-shadowプロパティとfilterプロパティのdrop-shadowを比較して違いを確認します。デモページはこちら filter: drop-shad…

2021.09.13

HTML・CSS

nth-childとlast-childの複合条件

デモページはこちら 3カラムで複数行のコンテンツの両側にCSSで角丸を設定します。コンテンツ数は可変の前提で、部分的に2カラムや1カラムになった時のパターンも考…

2020.10.12

HTML・CSS

CSSプロパティをショートハンドで記述

CSSプロパティをショートハンドで記述します。プロパティによって記述順や省略可・不可のルールがあります。 ■ fontプロパティfont-style・font-…

2021.02.06

HTML・CSS

高さを判定してoverflow-yプロパティで縦スクロール

画面の高さが要素の高さよりも低くなった場合、要素にoverflow-yプロパティを適用して要素内のコンテンツを縦スクロールで表示します。デモページはこちら 画面…

2024.08.16

HTML・CSS

flex-shrinkで文字の改行を防ぐ

flexボックスのレイアウトで、flexアイテムにflex-shrinkプロパティを指定してテキストが改行されるのを防ぎます。デモページはこちら 以下のhtml…

上に戻る