1. ホーム
  2. svg

SVGのパスに沿ってグラデーションを適用することはできますか?

2023-09-20 23:46:57

質問

私は、スクリプトによってトリガーされる簡単なローディングインジケータを私のウェブサイトに置きたいと思います。それはグラデーションを持つ単純な円弧でなければならず、ユーザーが待っている間、回転しています。アニメーションの部分は試していませんが、今のところ静的なスタイリングで行き詰まっています。今のところ、こんな感じです。

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg"
        width="100" height="100">
        <defs>
            <linearGradient id="grad1">
                <stop offset="0%" stop-color="red"/>
                <stop offset="100%" stop-color="red" stop-opacity="0" />
            </linearGradient>
        </defs>
        <path d="M50 10  A40 40 0 1 0 90 50"
            stroke="url(#grad1)" stroke-width="10" fill="transparent"/>
    </svg>

上端から反時計回りに右端まで (270°)、弧を描きますが、グラデーションが正しくありません。開始点 (上端、0°) が不透明で終了点 (右端、270°) が透明になるようにパスに従うのではなく、円弧ストロークの結果の画像は画面空間で左から右へ色付けされます。

グラデーションを円弧のパスに沿わせるには?

どのように解決するのですか?

CSS Images モジュール - レベル4では conic-gradient . MDNによると がサポートされています。 を IE 以外のすべての主要なブラウザでサポートしています。

技術的にはパスに沿ったグラデーションではありませんが、パスが円であるため、望ましい結果を得ることができます。

.loader {
  --size: 7.5rem;
  --stroke-size: .5rem;
  --diff: calc(calc(var(--size)/2) - var(--stroke-size));
  background-image: conic-gradient(transparent 25%, red);
  width: var(--size);
  height: var(--size);
  border-radius: 50%;
  -webkit-mask:radial-gradient(circle var(--diff),transparent 98%,#fff 100%);
          mask:radial-gradient(circle var(--diff),transparent 98%,#fff 100%);
  animation: rotate 1.2s linear infinite;
  margin: 0 auto;
}
@keyframes rotate {
  from {
    transform: rotate(0);
  }
  to {
    transform: rotate(1turn);
  }
}
body {
  background: #f9fcfc url(https://picsum.photos/id/22/1323/880) 100% /cover;
  margin: 0;
  min-height: 100vh;
  padding-top: 2.5rem;
}
 * { box-sizing: border-box; }
<div class="loader"></div>

該当箇所は

background-image: conic-gradient(transparent 25%, red);

注意 明らかでなければ、CSS変数は必要ありません。私はただ、複数の場所で値を修正することなく、複数のサイズでそれをテストする方法が欲しかったのです。

注意してください。 内円のマスクは <svg /> . この方法は、ブラウザのサポートが マスク . しかし、それはこの質問の範囲外です。

投稿した時点では、私の例は最新のもので期待通りに動作しているようです。Chrome、Firefox、および Edge で期待どおりに動作するようです。Safari はテストしていません。IEのどのバージョンでも動作するとは思っていません。