【问题标题】:Change fill of inline SVG path on click单击时更改内联 SVG 路径的填充
【发布时间】:2018-10-16 11:00:06
【问题描述】:

我是 html 等的新手,我正在尝试制作一个 SVG 地图,可以通过点击它来更改一个国家/地区的填充颜色(path)。

到目前为止,当我将鼠标悬停在路径上时,我设法更改了填充,但我无法让它在点击时切换颜色。因此,目标是用户可以将鼠标悬停在路径上并突出显示。当他单击时,填充更改为某个值(“标记”),并在第二次单击后再次更改回原始填充颜色。 如何实现点击路径时填充颜色的切换?

这里是html文件的一部分,只排除了其他svg路径:

<link rel="stylesheet" class="st0"type="text/css" class="st0"href="main.css" class="st0"/>

<?xml version="1.0" class="st0"encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1"
     id="world-map" class="st0"inkscape:version="0.91 r13725" class="st0"sodipodi:docname="World_map_-_low_resolution.svg" class="st0"xmlns:cc="http://creativecommons.org/ns#" class="st0"xmlns:dc="http://purl.org/dc/elements/1.1/" class="st0"xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" class="st0"xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" class="st0"xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" class="st0"xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg" class="st0"xmlns:xlink="http://www.w3.org/1999/xlink" class="st0"x="0px" class="st0"y="0px" class="st0"viewBox="0 0 950 620"
     style="enable-background:new 0 0 950 620;" class="st0"xml:space="preserve">

<path id="estonia" fill="#F5F5F5" d="M517.8,143.7l-5.6-0.2l-3.5,2.2l0,1.6l2.3,2.2l7.2,1.2L517.8,143.7L517.8,143.7z
M506.8,147.6l-1.5-0.1l-0.9,0.9l0.6,1l1.5,0.1l0.8-1.2L506.8,147.6L506.8,147.6z
M506.6,151.7l-1.5-0.1l-2.7,3.2v1.5l0.9,0.4l1.8,0.1l2.9-2.4l0.4-0.8L506.6,151.7L506.6,151.7z"/>

<path id="sweden" fill="#F5F5F5" d="M497.7,104.6l2,1.8h3.7l2,3.9l0.5,6.7l-5,3.5v3.5l-3.5,4.8l-2,0.2l-2.8,4.6l0.2,4.4l4.8,3.5l-0.4,2l-1.8,2.8
    l-2.8,2.4l0.2,7.9l-4.2,1.5l-1.5,3.1h-2l-1.1-5.5l-4.6-7l3.8-6.3l0.3-15.6l2.6-1.4l0.6-8.9l7.4-10.6L497.7,104.6L497.7,104.6z
    M498.5,150.2l-2.1,1.7l1.1,2.4l1.9-1.8L498.5,150.2L498.5,150.2z"/>

</svg>
<script src="main.js"></script>

这是css文件:

#world-map{
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
path:hover {
  stroke: #339999 !important;
  stroke-width:2px;
  stroke-linejoin: round;
  fill: #002868 !important;
  cursor: pointer;
}

到目前为止,作为 main.js,我尝试了很多东西,但都没有奏效。我认为这可能是这样的,但我不确定:

$('path').on("click", function(e) {
    $(this).html({ fill: "#ff0000" });
});

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript html css svg


    【解决方案1】:

    您可以通过单击时的类操作来做到这一点(使用类属性更改,因为 jquery 的 addClass 不适用于 SVG,请参阅this 了解更多详细信息)。非常幼稚的实现如下:

    $('path').on("click", function() {
        $('path.selected').attr("class", "");
        $(this).attr("class", "selected");
    });
    path {
      cursor: pointer;
      fill: grey
    }
    .selected {
      fill: #002868;
      stroke: #339999;
      stroke-width: 2px;
      stroke-linejoin: round;;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <svg width="100%" height="100%" viewBox="400 0 500 320" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    
        <path id="estonia" d="M517.8,143.7l-5.6-0.2l-3.5,2.2l0,1.6l2.3,2.2l7.2,1.2L517.8,143.7L517.8,143.7z
    M506.8,147.6l-1.5-0.1l-0.9,0.9l0.6,1l1.5,0.1l0.8-1.2L506.8,147.6L506.8,147.6z
    M506.6,151.7l-1.5-0.1l-2.7,3.2v1.5l0.9,0.4l1.8,0.1l2.9-2.4l0.4-0.8L506.6,151.7L506.6,151.7z"></path>
    
    <path id="sweden" d="M497.7,104.6l2,1.8h3.7l2,3.9l0.5,6.7l-5,3.5v3.5l-3.5,4.8l-2,0.2l-2.8,4.6l0.2,4.4l4.8,3.5l-0.4,2l-1.8,2.8
        l-2.8,2.4l0.2,7.9l-4.2,1.5l-1.5,3.1h-2l-1.1-5.5l-4.6-7l3.8-6.3l0.3-15.6l2.6-1.4l0.6-8.9l7.4-10.6L497.7,104.6L497.7,104.6z
        M498.5,150.2l-2.1,1.7l1.1,2.4l1.9-1.8L498.5,150.2L498.5,150.2z"></path>
    
    </svg>

    【讨论】:

    • 谢谢!这几乎正​​是我正在寻找的东西,但不知何故我仍然无法让它工作。在 html 文件的脚本标记中,我需要放置 main.js 文件的路径,对吗?
    • 是的,您还需要确保已导入 jquery 库。另外,我总是将 SVG 放置在具有明确宽度/高度的 div 容器中(根据您的需要)。什么不适合你?什么错误?
    • 啊,这实际上可能是问题所在。我只是使用文本编辑器,所以没有任何错误消息,但网页对点击没有反应。如何导入 jquery 库?
    • 啊,明白了!导入 jQuery 库后,此解决方案也可以完美运行。这个link here 阐明了如何做到这一点,以防有人偶然发现同样的问题。
    • noice;) 如果您觉得有帮助,请接受答案;)
    【解决方案2】:

    如果你不能像 Sergey 提到的那样使用 Jquery,你可以使用纯 Javascript,使用 classList.toggle() 方法。

    // first we get all the path elements and put them in an array
    let paths = document.getElementsByTagName('path')
    
    //now we can loop over the array and add an eventlistener to each path in the array
    // it listens to the 'click' event and then runs function toggleClass()
    for(let i=0; i<paths.length; i++){
        paths[i].addEventListener('click', toggleClass)
    }
    
    // In the function toggleClass we can toggle the 'clicked' class.
    function toggleClass() {
        this.classList.toggle('clicked')
    }
    path {
      cursor: pointer;
      fill: grey
    }
    
    .selected {
      fill: #002868;
      stroke: #339999;
      stroke-width: 2px;
      stroke-linejoin: round;;
    }
    
    .clicked {
      fill: #ff0000;
    }
    <svg width="100%" height="100%" viewBox="400 0 500 320" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    
        <path id="estonia" d="M517.8,143.7l-5.6-0.2l-3.5,2.2l0,1.6l2.3,2.2l7.2,1.2L517.8,143.7L517.8,143.7z
    M506.8,147.6l-1.5-0.1l-0.9,0.9l0.6,1l1.5,0.1l0.8-1.2L506.8,147.6L506.8,147.6z
    M506.6,151.7l-1.5-0.1l-2.7,3.2v1.5l0.9,0.4l1.8,0.1l2.9-2.4l0.4-0.8L506.6,151.7L506.6,151.7z"></path>
    
        <path id="sweden" d="M497.7,104.6l2,1.8h3.7l2,3.9l0.5,6.7l-5,3.5v3.5l-3.5,4.8l-2,0.2l-2.8,4.6l0.2,4.4l4.8,3.5l-0.4,2l-1.8,2.8
        l-2.8,2.4l0.2,7.9l-4.2,1.5l-1.5,3.1h-2l-1.1-5.5l-4.6-7l3.8-6.3l0.3-15.6l2.6-1.4l0.6-8.9l7.4-10.6L497.7,104.6L497.7,104.6z
        M498.5,150.2l-2.1,1.7l1.1,2.4l1.9-1.8L498.5,150.2L498.5,150.2z"></path>
    
    </svg>

    【讨论】:

    • 太好了,效果很好,谢谢!我发现脚本标签需要在 svg 标签之后,这之前也引起了一些问题。
    【解决方案3】:

    另一种选择是使用 jQuery 在两个类之间切换:

    $('path').on("click", function() {
        var n = $(this).attr("class");
    
        if(n == "clicked") {
        	$(this).attr("class", "");
        }
        else {
        	$(this).attr("class", "clicked");
        }
    });
    #world-map{
      display: block;
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
    path:hover {
      stroke: #002868 !important;
      stroke-width:2px;
      stroke-linejoin: round;
      fill: #002868 !important;
      cursor: pointer;
    }
    .clicked {
      fill: #ff9800;
      stroke: #ff9800;
      stroke-width: 2px;
      stroke-linejoin: round;;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <svg width="100%" height="100%" viewBox="400 0 500 320" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    
    <path id="estonia" fill="#F5F5F5" d="M517.8,143.7l-5.6-0.2l-3.5,2.2l0,1.6l2.3,2.2l7.2,1.2L517.8,143.7L517.8,143.7z
    M506.8,147.6l-1.5-0.1l-0.9,0.9l0.6,1l1.5,0.1l0.8-1.2L506.8,147.6L506.8,147.6z
    M506.6,151.7l-1.5-0.1l-2.7,3.2v1.5l0.9,0.4l1.8,0.1l2.9-2.4l0.4-0.8L506.6,151.7L506.6,151.7z"/>
    
    <path id="sweden" fill="#F5F5F5" d="M497.7,104.6l2,1.8h3.7l2,3.9l0.5,6.7l-5,3.5v3.5l-3.5,4.8l-2,0.2l-2.8,4.6l0.2,4.4l4.8,3.5l-0.4,2l-1.8,2.8
    	l-2.8,2.4l0.2,7.9l-4.2,1.5l-1.5,3.1h-2l-1.1-5.5l-4.6-7l3.8-6.3l0.3-15.6l2.6-1.4l0.6-8.9l7.4-10.6L497.7,104.6L497.7,104.6z
    	M498.5,150.2l-2.1,1.7l1.1,2.4l1.9-1.8L498.5,150.2L498.5,150.2z"/>
    
    <path id="finland" fill="#F5F5F5" d="M506.8,116.9l2.1,0.9l1.3,2.4l-1.3,1.7l-6.4,7l-1.1,3.7l1.5,5.4l5,3.7l6.6-3.1l5.3-0.7l5-7.9l-3.7-8.7
    	l-3.5-8.3l0.5-5.4l-2.2-0.4l-0.6-3.9l-3-4.8l-3.3,2.3l-1.3,5.3l-3.5-2.1l-4.8-1.2l-1.1,1.3l1.9,1.7l3.4-0.1l2.7,4.4L506.8,116.9
    	L506.8,116.9z"/>
    
    <path id="norway" fill="#F5F5F5" d="M515.5,102.1l2-1.5l-0.2-1.7l-1.3-0.7l0.2-2h1.1v-1.1l-4.8-1.3l-7.1,0.7l-0.7,3.1l-1.6-0.5l-1.1-1.8l-3.5,0.2
    	L498,99l-1.6,0.7l-0.9-1.8l-7.3,5.9l1.5,1.7l-2.8,1.3l-6.2,12.4l-2.2,1.5l0.2,1.1l2.2,1.1l-0.5,2.4l-3.7-0.2l-1.1-1.3l-2.4,2.8
    	l-1.5,1.1l-0.4,2.6L470,131l-3.3,0.7l-1.6,5.2l1.1,8.5l1.3,3.9l1.5,1.5l3.3-0.2l4.8-4.6l1.8-3.1l0.5,4.6l3.1-5.5l0.2-15.5l2.5-1.6
    	l0.8-8.6l7.7-11.1l3.7-1.3l1.6-2l5.5,1.3l2.8,1.7l0.9-4.6l4.6-2.8L515.5,102.1L515.5,102.1z
    M488.3,54l-1.6-1.7l-3.7,1.8h-6.7l-1.1,3.9l3.8,3.3l1.6-0.2l2.4-4l2,1.4l-1.4,2.8l-0.7,4.2l1.6,2.6l3.5-5.9l4.6-5.6l-1.8-1.5L488.3,54L488.3,54z
    	M490.3,46.8l-3,2.7l1.8,2.7h3.2l1.3,1.8l3.9,2l4.5-2.6l3.1-2.6l-1.1-2.1l-3.1-1.8l-2.2,2l-1.5-1.9l-1.2,0.1l-1.5,3.3l-2.2-2.3l-0.2-1.5L490.3,46.8L490.3,46.8z
    	M497,59.1l-2.4,2.1l-2,1.5l0.9,1.7l1.9,0.6l3.1-1.4l1.4-1.8l-1.3-2.1L497,59.1L497,59.1z"/>
    
    </svg>

    【讨论】:

      【解决方案4】:

      不妨试试:

      svg:hover path {
          "your css"
      }
      

      哦,你已经有这个工作了吗?看错文章见谅

      <script>
      
      $('path').on("click", function() {
          $(this).css({ fill: "#ff0000" });
      });
      
      </script>
      

      这个小样本是我能做的最好的:) js 不太好,但也许你可以改进。

      【讨论】:

      • 是的,这是用于悬停的,已经可以了。点击几乎相同的事情让我头疼
      • 您是否尝试通过单击时添加/删除类来执行此操作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2020-10-30
      • 1970-01-01
      • 2014-01-31
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多