SVGのパスに沿ってグラデーションを適用することはできますか?
質問
私は、スクリプトによってトリガーされる簡単なローディングインジケータを私のウェブサイトに置きたいと思います。それはグラデーションを持つ単純な円弧でなければならず、ユーザーが待っている間、回転しています。アニメーションの部分は試していませんが、今のところ静的なスタイリングで行き詰まっています。今のところ、こんな感じです。
<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のどのバージョンでも動作するとは思っていません。
関連
-
[解決済み] SVGのストロークが一方向のみ
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み] 同じ要素にbackground-imageとCSS3グラデーションを組み合わせるにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】PNG画像をSVGに変換する方法は?[クローズド]
-
[解決済み] SVG ルート要素のデフォルトの背景色
-
[解決済み] enable-background属性は、具体的に何をするのですか?
-
[解決済み] テキストの横にアイコンを表示する最も堅牢な方法 [終了しました]。
-
[解決済み] <svg> viewBox属性を使用するには?
-
[解決済み] svgの簡単な塗りつぶしパターン:斜めのハッチング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン