Home Code About

SVGアニメーション

図形をIllustratorで作成し、stroke-dashoffsetでアニメーションを実装しました。
stroke-dashoffsetの数値はJavaScriptのconsole.logを使用して出力していますが、基本的にはCSSのみでの実装です。
GSAPでも同様のことができるかと思いますが、案件でJavaScript使用NG案件もあるため、試しに作ってみたものです。
SVGアニメーションが苦手なこともありchatGPTも活用しつつ進めました。

<div class="c-block">
    <div class="c-block__content">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 285 268">
            <!-- 画像を切り抜くためのパス -->
            <clipPath id="clipPath">
                <path d="M30.52.5h224.98l30,30v208l-30,30H30.5L.5,238.5V30.5L30.5.5h.02"/>
            </clipPath>

            <!-- 画像を表示し、パスで切り抜く -->
            <image xlink:href="https://placehold.jp/500x500.png" width="100%" height="100%" clip-path="url(#clipPath)" preserveAspectRatio="xMaxYMax slice"/>

            <!-- その他のSVG要素 -->
            <path class="c-block__border" d="m30.52.5h224.98l30,30v208l-30,30H30.5L.5,238.5V30.5L30.5.5h.02"/>
        </svg>
    </div>
</div>
<!-- [/c-block] -->
.c-block {
  width: min(80%, 400px);
  margin-inline: auto;
  position: relative;
}

.c-block__content svg {
  overflow: initial;
}

.c-block__content image {
  opacity: 0;
  animation: line-animation-img 0.3s 3.3s forwards;
}

@keyframes line-animation-img {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

.c-block__border {
  fill: none;
  stroke: #b0c4de;
  stroke-width: 1;
  stroke-miterlimit: 10;
  stroke-dasharray: 1035.7056884766px;
  stroke-dashoffset: 1035.7056884766px;
  animation: line-animation 3s ease-in-out forwards;
}

@keyframes line-animation {
  0% {
    stroke-dashoffset: 1035.7056884766px;
  }
  100% {
    stroke-dashoffset: 0px;
  }
}

.c-block__img {
  position: absolute;
  inset: 0;
  z-index: -1;
  clip-path: url(#clip01);
}

.c-block__img img {
  width: 100%;
  height: auto;
}

.c-block__clip {
  width: 100%;
  height: 100%;
}