线性渐变不适用于带有d3生成的SVG的Webkit

埃里兰·马尔卡(Eliran Malka)

我正在为d3.js图创建特定的实现,似乎在动态创建SVG文档时,linearGradient不能在Webkit浏览器上运行(仅在Webkit系列的Chrome上进行了测试),而Gecko则显示了预期的效果。行为。

我如何得出结论,它与动态生成或d3有关?我尝试将生成的文档复制到一个空白页中,渐变变得生动起来。

d3代码首先初始化文档:

// in construction:
// ...
svg = d3.select(el)
    .append('svg:svg')
    .attr('width', width)
    .attr('height', height),
defs = svg.append('svg:defs'),
linearGradient1 = defs.append('svg:linearGradient')
    .attr('id', 'linear-gradient-1')
    .attr('x1', 0)
    .attr('y1', 1)
    .attr('x2', 6.123233995736766e-17)
    .attr('y2', 0),
linearGradient1Stop1 = linearGradient1.append('svg:stop')
    .attr('offset', '0%')
    .attr('stop-color', '#e3e5e8'),
    // several other stops here ...

…然后刷新渲染器,例如在按需向图形数据结构中添加“节点”之后(请注意:selfRef.node只是所有节点d3选择器的句柄):

// called e.g. when adding new nodes:
refresh: function() {
    // ...
    // add new nodes
    var g = selfRef.node.enter().append('svg:g').attr('class', 'node');

    g.append('svg:rect')
        .attr('width', 144)
        .attr('height', 42)
        .attr('rx', 3)
        .attr('ry', 3)
        .attr('fill', 'url(#linear-gradient-1)')
        .style('stroke', '#4d4d4d')
        .style('stroke-width', 1)

    // ...
}

这是生成的文档,没什么特别的:

<svg width="1889" height="400">
    <defs>
        <linearGradient id="linear-gradient-1" x1="0" y1="1" x2="6.123233995736766e-17" y2="0">
            <stop offset="0%" stop-color="#e3e5e8"></stop>
            <stop offset="11%" stop-color="#e6e8ec"></stop>
            <stop offset="59%" stop-color="#eff2fa"></stop>
            <stop offset="100%" stop-opacity="0.6" stop-color="#f2f6ff"></stop>
        </linearGradient>
    </defs>
    <g>
        <g class="node" 
           transform="translate(1113.425033222223,312.1412317958371)">
            <rect width="144" height="42" rx="3" ry="3" 
                  fill="url(#linear-gradient-1)" 
                  style="stroke: #4d4d4d; stroke-width: 1px;"></rect>
            <!-- some other shapes of the node... -->
        </g>
        <!-- etc. etc., some more node groups here... -->
    </g>
</svg>

我尝试过的事情

  • 将引用渐变的元素拉到任何组之外。
  • versionSVG添加具有不同值的声明(也许它仅出现在1.1?)
  • 将引用括在引号中(即fill="url('#linear-gradient-1')"),或在ID中省略破折号,以为Webkit在这里不太宽容。

笔记

罗伯特·朗森(Robert Longson)在这篇文章中提到大小写很重要,而且很奇怪,似乎在将文档粘贴到空白页面(在Chrome的开发工具中)时,线性渐变元素会转换为驼峰式格式(尽管事实并非如此)。 t在DOM视图中显示,则所有内容都是小写的)。我之后发现这个版本比较我的D3生成的代码的结果和粘贴的静态文件。那是怎么回事?


TL; DR

在Chrome中运行时,如何生成动态SVG渐变不起作用,以及如何解决此问题?

罗伯特·朗森

似乎Safari开发人员基于xhtml中的功能,将该错误标记对我有效。对于Safari而言,您似乎必须使用MIME类型的application / xhtml + xml来提供网页服务,或者向Safari开发人员请愿以重新打开该错误。FWIW对我来说似乎是个错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线性渐变不适用于JavaScript

来自分类Dev

使用D3生成有效的SVG渐变

来自分类Dev

D3强制布局适用于Chrome,但不适用于Firefox

来自分类Dev

CSS3渐变不适用于所有浏览器

来自分类Dev

d3.js径向渐变不适用于`path`

来自分类Dev

d3生成的SVG没有响应

来自分类Dev

D3条形图不适用于所有负值和正值

来自分类Dev

背景位置不适用于CSS动画和线性渐变

来自分类Dev

与背景属性中的图像 url 结合使用时,CSS 线性渐变不适用于 iOS

来自分类Dev

D3缩放和平移不适用于整个地图,仅适用于投影

来自分类Dev

渐变不适用于位置:绝对

来自分类Dev

带有[attribute =“ value”]规则的CSS不适用于jquery-svg图像

来自分类Dev

OKZoom插件不适用于带有SVG滤镜的图像

来自分类Dev

VSCode断点不适用于带有gulp-sourcemaps生成的sourcemap的打字稿中

来自分类Dev

线性探测不适用于碰撞

来自分类Dev

转换转换的d3过渡不适用于DIV

来自分类Dev

width属性不适用于d3样式

来自分类Dev

D3:序数刻度不适用于对象数组

来自分类Dev

d3堆叠面积图不适用于对数刻度

来自分类Dev

简单的D3演示不适用于更改的结构

来自分类Dev

d3 弧创建不适用于数据绑定

来自分类Dev

Vue Cli 3 - Typescript - Vuetify 样式不适用于带有 @WithRender 的单独模板文件

来自分类Dev

textarea不适用于带有值的文档加载

来自分类Dev

div对齐不适用于带有菜单的标题

来自分类Dev

npm命令不适用于带有zsh的WSL

来自分类Dev

SVG ClipPath不适用于wkhtmltopdf

来自分类Dev

填充属性不适用于SVG

来自分类Dev

SVG样式不适用于Illustrator

来自分类Dev

svg大小不适用于javascript