javascript - 如何通过单击命令将一个 SVG 路径元素变形为另一个?

标签 javascript xml html svg

我正在尝试制作一个播放和停止按钮。我不知道如何在单击时将三 Angular 形(它是一条路径)变形为方形(它是一条路径)。一次只显示一个形状。谁能帮忙?

<svg class="playStop" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 971 530" style="enable-background:new 0 0 971 530;" xml:space="preserve">
<style type="text/css">

    .st0{fill:none;
    stroke:#000000;
    stroke-width:4;
    stroke-miterlimit:10;}
</style>

<path id="playTriangle" class="st0" d="M432,290.7V187.8c0-11.4,9.2-20.7,20.6-20.8c3.2,0,6.3,0.7,9.2,2.2l86.9,43.3l16.2,8.1c10.2,5,14.5,17.5,9.4,27.7c-2,4.1-5.3,7.5-9.4,9.5l-13.4,6.7l-89.8,44.8c-10.2,5-22.6,0.8-27.6-9.5C432.7,297,432,293.9,432,290.7z"/>

<path id="stopSquare" class="st0" d="M458.6,167h91.3c14.7,0,26.6,11.9,26.6,26.6v91.3c0,14.7-11.9,26.6-26.6,26.6h-91.3c-14.7,0-26.6-11.9-26.6-26.6v-91.3C432,178.9,443.9,167,458.6,167z"/>

</svg>

最佳答案

我认为一种方法是在 defs 中定义两个路径,然后使用 use xlink:href="#shapeName" 和一个 onclick 处理程序来切换该属性或相应的 DOM 属性(如果支持)..

具有完全实现的 SVG DOM 的 use 元素对象有一个 href 属性和一个可以读取和设置的 baseVal 属性,所以在里面就我测试过的浏览器而言(使用 Firefox、Chrome、IE 和 Edge on Window)我们可以简单地切换该属性,请参阅 https://jsfiddle.net/4x0gnkob/获取在线示例。

  .st0{fill:none;
    stroke:#000000;
    stroke-width:4;
    stroke-miterlimit:10;}
<svg class="playStop" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 971 530" style="enable-background:new 0 0 971 530;" xml:space="preserve">

  <defs>
    <path id="playTriangle" class="st0" d="M432,290.7V187.8c0-11.4,9.2-20.7,20.6-20.8c3.2,0,6.3,0.7,9.2,2.2l86.9,43.3l16.2,8.1c10.2,5,14.5,17.5,9.4,27.7c-2,4.1-5.3,7.5-9.4,9.5l-13.4,6.7l-89.8,44.8c-10.2,5-22.6,0.8-27.6-9.5C432.7,297,432,293.9,432,290.7z"/>

<path id="stopSquare" class="st0" d="M458.6,167h91.3c14.7,0,26.6,11.9,26.6,26.6v91.3c0,14.7-11.9,26.6-26.6,26.6h-91.3c-14.7,0-26.6-11.9-26.6-26.6v-91.3C432,178.9,443.9,167,458.6,167z"/>


  </defs>
  <use xlink:href="#playTriangle" pointer-events="all" onclick="this.href.baseVal = this.href.baseVal == '#playTriangle' ? '#stopSquare' : '#playTriangle';"></use>
  </svg>

另一种方法是切换 DOM 属性,这在 HTML5 环境中似乎有点复杂,因为我认为我可以在一行中使用 setAttributeNSgetAttributeNS 来解决它,经过一些测试,似乎在 HTML5 中 getAttribute('xlink:href') 工作得更好,所以完整的代码试图测试哪个函数返回一个值。

function toggleLink(element, value1, value2) {
  var xlinkNS = 'http://www.w3.org/1999/xlink';
  var linkName = 'xlink:href';
  var oldValue = element.getAttributeNS(xlinkNS, linkName) || element.getAttribute(linkName);
  if (element.hasAttributeNS(xlinkNS, 'href')) {
    element.setAttributeNS(xlinkNS, linkName, oldValue == value1 ? value2 : value1)
  }
  else {
    element.setAttribute(linkName, oldValue == value1 ? value2 : value1);
  }
}
    .st0{fill:none;
    stroke:#000000;
    stroke-width:4;
    stroke-miterlimit:10;}
<svg class="playStop" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 971 530" style="enable-background:new 0 0 971 530;" xml:space="preserve">

  <defs>
    <path id="playTriangle" class="st0" d="M432,290.7V187.8c0-11.4,9.2-20.7,20.6-20.8c3.2,0,6.3,0.7,9.2,2.2l86.9,43.3l16.2,8.1c10.2,5,14.5,17.5,9.4,27.7c-2,4.1-5.3,7.5-9.4,9.5l-13.4,6.7l-89.8,44.8c-10.2,5-22.6,0.8-27.6-9.5C432.7,297,432,293.9,432,290.7z"/>

<path id="stopSquare" class="st0" d="M458.6,167h91.3c14.7,0,26.6,11.9,26.6,26.6v91.3c0,14.7-11.9,26.6-26.6,26.6h-91.3c-14.7,0-26.6-11.9-26.6-26.6v-91.3C432,178.9,443.9,167,458.6,167z"/>


  </defs>
  <use xlink:href="#playTriangle" pointer-events="all" onclick="toggleLink(this, '#stopSquare', '#playTriangle')"></use>
  </svg>

在线 https://jsfiddle.net/w36k21uz/1/ .

关于javascript - 如何通过单击命令将一个 SVG 路径元素变形为另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567002/

相关文章:

javascript - Google Apps 脚本 OAuth - returnURL 以更新附加组件

javascript - 如何添加类到使用document.createElement创建的元素?

c# - Soap服务方法类定义c#

sql - 在 SQL Server 中使用 XML 类型字段获取值

html - 将 enctype ="multipart/form-data"放入每个表单标签中是否不好

javascript - 文本区域调整大小的移动浏览器问题

html - 谷歌浏览器滚动溢出错误

JavaScript:在 Firefox 上,调整窗口大小时触发 mousemove

javascript - 使用 Javascript 进行 HtmlEditorExtender 的 Google 翻译不起作用

xml - 在 xslt 期间保留字符实体