1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ジグソーパズルピースのCSS表現方法

Posted at

ジグソーパズルのピースをCSSで表現する方法について解説します。

クリッピングパスやカスタムシェイプを使うのがポイントです。clip-pathを使うと、複雑な形状を簡単に切り抜くことができます。しかし、ジグソーパズルのピースは半円形の凸凹が特徴的なので、polygon()を使うのは難しいです。

代わりに、こちらの回答で紹介されているように、SVGのpathを使う方法がおすすめです。pathのコマンドは直感的に理解しにくいことがありますが、svg-path-editorのようなSVGエディタを使えば簡単に編集できます。

以下のコード例では、SVGを使ってジグソーパズルの描画できます。

piece.jpg

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ジグソーパズルのピース</title>
  <style>
    .svg {
      position: absolute;
      width: 0;
      height: 0;
    }
    .clipped {
      width: 100px;
      height: 100px;
      background: red;
      clip-path: url(#my-clip-path);
      margin-right: -48px;
      margin-top: -8px;
    }
  </style>
</head>
<body>

  <div class="clipped"></div>

  <svg class="svg">
    <defs>
      <clipPath id="my-clip-path" clipPathUnits="objectBoundingBox">
        <path d="M0.759 0.525V0.343c0-0.027-0.021-0.048-0.045-0.048h-0.196c-0.009 0-0.017-0.005-0.021-0.013c-0.004-0.008-0.005-0.018 0-0.026c0.011-0.021 0.017-0.045 0.017-0.07c0-0.08-0.06-0.145-0.134-0.145c-0.074 0-0.134 0.065-0.134 0.145c0 0.025 0.006 0.049 0.017 0.07c0.004 0.008 0.004 0.018 0 0.026c-0.004 0.008-0.012 0.013-0.021 0.013H0.045c-0.025 0-0.045 0.021-0.045 0.048v0.169c0 0.009 0.005 0.018 0.012 0.023c0.007 0.005 0.017 0.005 0.024 0.001c0.019-0.011 0.041-0.017 0.064-0.017c0.074 0 0.134 0.065 0.134 0.145c0 0.08-0.06 0.145-0.134 0.145c-0.023 0-0.045-0.006-0.064-0.017c-0.008-0.004-0.017-0.004-0.024 0.001C0.005 0.796 0 0.805 0 0.814v0.179c0 0.027 0.02 0.048 0.045 0.048h0.669c0.025 0 0.045-0.022 0.045-0.048v-0.183z"/>
      </clipPath>
    </defs>
  </svg>

</body>
</html>

CSSとSVGを組み合わせてジグソーパズルのピースを表現しています。具体的には、clip-pathを使用して、赤い四角形を特定の形状に切り抜いています。

まず、<style>内で、.svgクラスは非表示のSVG要素のスタイルを設定しています。一方、.clippedクラスは、100x100ピクセルの赤い背景を持つ要素を定義し、その要素をclip-pathプロパティで指定された形状にクリップします。

clip-path: url(#my-clip-path);によって、SVG内に定義された<clipPath>が参照されます。この<clipPath>は、id="my-clip-path"で識別され、その中に含まれる要素によってジグソーパズルピースの形状が定義されています。

<path>要素のd属性は、パスのコマンドを記述しており、パズルピースの特定の形状を描きます。MやVなどのコマンドで、パスの移動や線、曲線を描画し、その形状がクリップの輪郭として使用されます。

最終的に、HTMLの<div>要素に.clippedクラスが適用され、指定されたパス形状に従って赤いジグソーパズルピースの形状が表示されます。

まとめ

このように、CSSとSVGを組み合わせることで、ウェブ上で複雑な形状を表現することが可能です。特に、ジグソーパズルのピースのように、標準的なCSSのボックスモデルでは表現しにくい形状も、clip-pathやpathコマンドを使えば、簡単に実装できます。

また、この手法は例えば、Flutterでの実装にも応用できます。Flutterでは、CustomPaintやClipPathを使って同様の形状を描画することが可能ですが、Pathクラスを利用すれば、細かいコントロールが可能で、ジグソーパズルのピースのような複雑な形状も描画できます。svgというリソースを転用できるので、モバイルアプリでもデザインの一貫性を保つことができます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?