2024.09.15

svg

svgのclipPathを利用した画像の切り抜き

svgのclipPathを利用して画像を切り抜きます。svgの書き方は数パターンあります。
デモページはこちら

まず同一のsvg内にclipPathを記述し、use xlink:href="#id"でpathにリンクさせます。clipPathだけでなく、pathにもidを指定するのがポイントです。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350">
  <defs>
    <clipPath id="clip-path01">
      <use xlink:href="#path01"></use>
    </clipPath>
  </defs>
  <path id="path01" 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>
  <image xlink:href="./img/flower.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid slice" clip-path="url(#clip-path01)"></image>
</svg>

次に同一のsvg内にclipPathを記述し、clipPathの中身をpathにします。コード量も少なく、svgが最適化できています。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350">
  <defs>
    <clipPath id="clip-path01">
      <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>
    </clipPath>
  </defs>
  <image xlink:href="./img/flower.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid slice" clip-path="url(#clip-path01)"></image>
</svg>

試しにimageのpreserveAspectRatioに「xMidYMid meet」を指定してみます。xMidYMidはobject-position: 50% 50%、meetはobject-fit: containのイメージです。sliceでobject-fit: coverのような表示でないと上下が切れてしまいます。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350">
  <defs>
    <clipPath id="clip-path01">
      <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>
    </clipPath>
  </defs>
  <image xlink:href="./img/flower.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" clip-path="url(#clip-path01)"></image>
</svg>

最後に別のsvg内にclipPathを記述します。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350">
  <image xlink:href="./img/flower.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid slice" clip-path="url(#clip-path01)"></image>
</svg>

<svg width="0" height="0" class="svg-clip">
  <clipPath id="clip-path01">
    <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>
  </clipPath>
</svg>

この方法であれば他の画像からでもclipPathが使用できます。ただしclipPathのsvgは非表示にするためsvgのwidthとheightを0にし、cssで以下を指定します。

.svg-clip {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
}

関連記事

2020.09.09

svg

svgロードアニメーションの実装【円を一周】

デモページはこちら 円を一周する動作のsvgロードアニメーションを実装します。画像読み込みの管理ができるJavaScriptライブラリ、imagesLoaded…

2021.10.06

svg

svgコード記述時の注意点

svgコード記述時の注意点をまとめます。 ■ svgコードの最適化にツールを利用 SVGの不要なコードを取り除いて最適化してくれるツールとして、ブラウザで利用で…

2020.10.21

svg

svgロードアニメーションをCSSアニメーションで実装【グラデーションの線を回転】

デモページはこちら グラデーションの線を回転する動作のsvgロードアニメーションを、CSSアニメーションで実装します。 svgタグで表示エリアをwidth="6…

2020.10.05

svg

svgロードアニメーションをSMILで実装【グラデーションの線を回転】

デモページはこちら グラデーションの線を回転する動作のsvgロードアニメーションを、XMLベースの言語SMILで実装します。画像読み込みの管理ができるJavaS…

上に戻る