gpt4 book ai didi

SVG 过滤器 : different result depending on browser

转载 作者:行者123 更新时间:2023-12-04 13:52:24 25 4
gpt4 key购买 nike

我正在尝试添加 point light effectSVG长方形。问题是根据我使用的浏览器,我得到了不同的结果。例如在 Chrome 和 Safari 中,我得到以下信息:

enter image description here enter image description here

如何在不同浏览器上使用 svg 过滤器获得一致的结果?

*, *:before, *:after {
box-sizing: border-box;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.css" rel="stylesheet"/>



<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter id="customPointLight">
<feSpecularLighting result="lightBuffer" specularConstant="1.5"
specularExponent="80" lighting-color="#fff">
<fePointLight x="100" y="100" z="80"/>
</feSpecularLighting>
<feComposite in="SourceGraphic" in2="lightBuffer" operator="out"
k1="0" k2="1" k3="1" k4="0"/>
</filter>
</defs>

<rect x="50" y="50" width="100" height="100" fill="blue" filter="url(#customPointLight)"></rect>

</svg>

最佳答案

Safari 会自动选择不正确的过滤器分辨率,可能是因为没有人费心更新视网膜显示的代码。您可以通过向过滤器元素添加 filterRes="200"来让 Safari 做“大部分”正确的事情,因为它还没有放弃对 filterRes 的支持。

也就是说,今天,跨浏览器的正确做法是完全关闭光源,只使用一个填充了黑色/白色径向渐变的矩形,该矩形作为 data:URI 与 feImage(用于 Firefox 和 Edge 兼容性)导入。正如我认为您所希望的那样,屏幕混合会为原始照片添加白色高光。像这样:

svg {
background: red;
}
<svg width="400px" height="200px" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient id="lightHack">
<stop offset="35%" stop-color="white"/>
<stop offset="80%" stop-color="black"/>
</radialGradient>

<filter id="customPointLight">
<feSpecularLighting result="lightBuffer" specularConstant="1.5"
specularExponent="80" lighting-color="#fff">
<fePointLight x="100" y="100" z="80"/>
</feSpecularLighting>
<feComposite in="SourceGraphic" in2="lightBuffer" operator="out"
k1="0" k2="1" k3="1" k4="0"/>
</filter>

<filter id="pointLightHack" x="0%" y="0%" width="100%" height="100%">
<feImage width="100" height="100" xlink:href="data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiDQogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KDQogIDxkZWZzPg0KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZXhhbXBsZUdyYWRpZW50Ij4NCiAgICAgIDxzdG9wIG9mZnNldD0iNDAlIiBzdG9wLWNvbG9yPSJ3aGl0ZSIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9ImJsYWNrIi8+DQogICAgPC9yYWRpYWxHcmFkaWVudD4NCiAgPC9kZWZzPg0KICA8Y2lyY2xlIGZpbGw9InVybCgjZXhhbXBsZUdyYWRpZW50KSIgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIi8+DQo8L3N2Zz4="/>
<feBlend mode="screen" in="SourceGraphic"/>
</filter>
</defs>

<rect x="50" y="50" width="100" height="100" fill="blue" filter="url(#customPointLight)"/>
<rect x="250" y="50" height="100" width="100" fill="blue" filter="url(#pointLightHack)"/>
</svg>

<!-- SVG source of the base64 encoded feImage -->

<svg width="100" height="100" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg">

<defs>
<radialGradient id="exampleGradient">
<stop offset="40%" stop-color="white"/>
<stop offset="75%" stop-color="black"/>
</radialGradient>
</defs>
<circle fill="url(#exampleGradient)" cx="50" cy="50" r="50"/>
</svg>


顺便说一句,您没有正确使用照明效果,镜面反射照明应该添加“ Shiny ”高光,因此正确的用法是将结果合成在光源之上。漫射照明应该添加“常规”光,并且应该与原始图形相乘。在这两种情况下,您都不应使用“输出”复合操作——即在矩形中打一个透明孔,正如您在添加上面的红色背景时所看到的那样。

关于SVG 过滤器 : different result depending on browser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46022605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com