搜索

首页  >  问答  >  正文

是否可以向 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°)透明。

如何使渐变遵循我的弧线路径?

P粉402806175P粉402806175403 天前635

全部回复(2)我来回复

  • P粉482108310

    P粉4821083102023-10-19 13:06:33

    迈克·博斯托克 (Mike Bostock) 找到了一个方法,尽管这并不容易: https://bl.ocks.org/mbostock/4163057

    基本上,此技术使用 getPointAtLength 要将笔划分割成许多短笔划,请为每个笔划指定插值颜色停止点,然后对这些停止点之间的每个短笔划应用渐变。

    如果您能够应对挑战,祝您好运;)

    编辑(2019 年 7 月 3 日):

    现在有一个库可以帮助您准确地完成您正在寻找的事情。不需要使用 D3,但如果您愿意,也可以使用。 这是有关 Medium 的教程.

    回复
    0
  • P粉571233520

    P粉5712335202023-10-19 09:37:43

    CSS 图像模块 - 第 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>

    回复
    0
  • 取消回复