【问题标题】:Preloader Script - Change SVG Fill Color Before Page Load预加载器脚本 - 在页面加载之前更改 SVG 填充颜色
【发布时间】:2018-09-23 04:16:15
【问题描述】:

我在预加载器中使用 SVG 图标。我想使用脚本更改图标填充的颜色。我有一个小问题,在关闭预加载器之前颜色只会改变一小会儿。

这是我的脚本:

jQuery(function($){
  document.querySelector(".svgicon").getSVGDocument().getElementById("loadericon").setAttribute("fill", "#FFF");
});

还有我的 HTML:

<object class="svgicon" type="image/svg+xml" data="'. get_template_directory_uri() . '/assets/images/preloaders/icon.svg'.'"
></object>

在 icon.svg 文件中,向 HTML 标记添加了 ID“loadericon”。

谁能帮我解决这个问题?

【问题讨论】:

    标签: jquery svg


    【解决方案1】:

    一个选项是使用目标属性并且仅引用 SVG 的一部分,而其他所有内容都被隐藏 svg &gt; svg:not(:target) {display: none;} 请注意数据属性的 url:cat.svg#redcat

    object {  
    display: inline-block;
    margin:.5em;
    width: 100px;
    height: auto;
    border:1px solid #d9d9d9;
    }
    <object type="image/svg+xml"
    data="https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/cat.svg#redcat">
    </object>
    
    <object type="image/svg+xml"
    data="https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/cat.svg#blackcat">
    </object>

    我使用的 SVG 看起来像这样。请注意 SVG 中的 CSS。

    <style type="text/css">
     <![CDATA[  
        svg > svg:not(:target) {
        display: none;
        }
         ]]> 
    </style>
    <desc>
    <g id="cat">
    <path id="cat_body" d="M121.506,108.953. . . z"/>
    <path id="cat_head" d="M129.747,18.651. . . .z"/>
    </g>
    </desc>
    <svg version="1.1" id="blackcat" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 225 225">
    <use xlink:href ="#cat" fill="black" />
    </svg>
    <svg version="1.1" id="redcat" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 225 225">
    <use xlink:href ="#cat" fill="red" />
    </svg>
    

    您可以在Using SVG with CSS3 and HTML5: Vector Graphics for Web Design 第 9 章:新观点一书中了解更多关于此技术的信息

    更新:在这种情况下,我使用一个按钮来更改 SVG 路径的颜色。您可以使用您喜欢的任何其他事件。

    let data = "https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/cat.svg";
    let object = document.querySelector("object");
    
    black.addEventListener("click", function changeColor(e){
       object.setAttribute('data', data +"#blackcat");
       let clone = object.cloneNode(true);
       let parent = object.parentNode;
       parent.removeChild(object );
       parent.appendChild(clone );
      
       e.currentTarget.removeEventListener(e.type, changeColor);
    })
    object,button {  
    display: inline-block;
    margin:.5em;
    width: 100px;
    height: auto;
    border:1px solid #d9d9d9;
    }
    <div>
    <object id="svgContent" type="image/svg+xml"
    data="https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/cat.svg#redcat">
    </object>
    </div>
    <p><button id="black">black cat</button></p>

    【讨论】:

    • 很抱歉,我认为这个解决方案对我的情况没有帮助。
    • 感谢您的回答。问题是我想根据主题设置动态更改颜色。我不想选择保存在 svg 文件中的预定义颜色之一。
    • 在这种情况下,您是否考虑过使用内联 svg?如果您正在查看 CSS-Tricks.com(查看源代码),他们在页脚下有一个带有符号的 svg 元素,并且他们在小的内联 svg 元素中使用 &lt;use&gt; 重用这些符号。这非常方便,您可以轻松更改颜色。在这种情况下使用对象毫无意义。
    • @enxaneta 您可以将填充颜色更改为任何颜色,只要您没有 CORS 问题,看看我的回答
    【解决方案2】:

    是的,您应该可以使用 fill 属性来做到这一点,如下所示:

    <button id="btnColor">change color</button><br>
    <object id="svgContent" type="image/svg+xml" data="cat.svg#redcat"></object>
    
    <script>
        var i = 0
        var colors = ["lime", "cyan", "red", "pink", "blue"]
        var object = document.querySelector("object");
    
        btnColor.addEventListener("click", function (e) {
            var svg = object.contentDocument.documentElement
            svg.getElementById("redcat").children[0].setAttribute('fill', colors[i])
            i = (i+1) % colors.length   
        })
    </script>
    

    只要您没有任何 CORS 问题,这里有一个工作示例:
    https://raw.githack.com/heldersepu/hs-scripts/html/HTML/SVG/object.html

    现在在那个例子中,我正在使用@enxaneta 提供的 SVG 图像,希望它与你的图像接近,如果不是,请提供你的图像。

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多