【问题标题】:svg - Filter background colours apply to pathsvg - 过滤背景颜色应用于路径
【发布时间】:2018-07-17 06:37:47
【问题描述】:

我正在尝试复制我已经在 CSS 中为 SVG 元素的类所做的工作。

fill 属性继承父级的 currentColour,我们说红色作为参数。

然后我在不同的不透明度值下应用一些线性渐变,并对每个渐变应用不同的背景混合模式。

这对 css 类非常有效。

到目前为止,我对 SVG 所做的尝试是这样的:

<svg class="shape" width="100%" height="100vh" preserveAspectRatio="none" viewBox="0 0 1440 800" xmlns:pathdata="http://www.codrops.com/">

    <!-- background-image: 
      linear-gradient(-180deg,  rgba(black,0.69) 0%,  rgba(black,0.69) 100%),
      linear-gradient(-180deg,  rgba(black,0.100) 0%,  rgba(black,0.100) 100%),
      linear-gradient(-180deg,  rgba(black,0.49) 0%,  rgba(black,0.49) 100%);
    background-blend-mode: luminosity, lighten, saturation; -->

    <defs>
        <filter id="f1" x="0" y="0" width="100%" height="100%">
            <feFlood x="0" y="0" width="100%" height="100%" flood-color="black" flood-opacity="0.69" result="lumiFill"/>
            <feBlend in="SourceGraphic" in2="lumiFill" mode="luminosity" result="lumiBlend"/>
            <feFlood x="0" y="0" width="100%" height="100%" flood-color="black" flood-opacity="0.1" result="lightenFill"/>
            <feBlend in="lumiBlend" in2="lightenFill" mode="lighten" result="lightenBlend"/>
            <feFlood x="0" y="0" width="100%" height="100%" flood-color="black" flood-opacity="0.49" result="saturationFill"/>
            <feBlend in="lightenBlend" in2="saturationFill" mode="saturation" result="saturationBlend"/>
        </filter>
    </defs>
    <rect width="300" height="100" filter="url(#f1)" />
</svg>

这似乎确实改变了颜色,但我相信它会在第一次洪水时停止,因为我可以在它之后拉出另外两个,它似乎工作正常。

谁能建议我做错了什么?

【问题讨论】:

    标签: html css svg svg-filters


    【解决方案1】:

    这是按书面规定工作的。如果您调整泛洪尺寸以使其偏移,您可以看到每个图元都在执行您指定的操作。

    你想达到什么效果? (完整的代码示例——不仅仅是一个 CSS 片段)

    <svg class="shape" width="100%" height="100vh" preserveAspectRatio="none" viewBox="0 0 1440 800" xmlns:pathdata="http://www.codrops.com/">
    
        <!-- background-image: 
          linear-gradient(-180deg,  rgba(black,0.69) 0%,  rgba(black,0.69) 100%),
          linear-gradient(-180deg,  rgba(black,0.100) 0%,  rgba(black,0.100) 100%),
          linear-gradient(-180deg,  rgba(black,0.49) 0%,  rgba(black,0.49) 100%);
        background-blend-mode: luminosity, lighten, saturation; -->
    
        <defs>
            <filter id="f1" x="0%" y="0%" width="100%" height="100%" primitiveUnits="objectBoundingBox">
                <feFlood x="0%" y="0%" width="60%" height="100%" flood-color="black" flood-opacity="0.69" result="lumiFill"/>
                <feBlend in="SourceGraphic" in2="lumiFill" mode="luminosity" result="lumiBlend"/>
                <feFlood x="40%" y="0%" width="60%" height="100%" flood-color="black" flood-opacity="0.1" result="lightenFill"/>
                <feBlend in="lumiBlend" in2="lightenFill" mode="lighten" result="lightenBlend"/>
                <feFlood x="0%" y="0%" width="100%" height="50%" flood-color="black" flood-opacity="0.49" result="saturationFill"/>
                <feBlend in="lightenBlend" in2="saturationFill" mode="saturation" result="saturationBlend"/>
            </filter>
        </defs>
        <rect x="50px" y="50px" width="300px" height="100px" fill="red" filter="url(#f1)" />
    </svg>

    【讨论】:

    • 我认为它不起作用的原因是fe混合模式不支持与css相同的混合模式,所以它基本上是应用默认的混合模式。
    • 我认为 Chrome 支持新的混合模式 (SVG 2) - 必须进行测试 - 但 Safari 肯定不支持
    猜你喜欢
    • 2016-03-06
    • 2016-07-10
    • 2015-09-19
    • 2021-07-05
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多