RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1270158
Accepted
Sevastopol'
Sevastopol'
Asked:2022-04-14 21:14:17 +0000 UTC2022-04-14 21:14:17 +0000 UTC 2022-04-14 21:14:17 +0000 UTC

如何在点击时绘制贝塞尔曲线?

  • 772

我有两个点 (A和B) 和连接它们的贝塞尔曲线。线条绘制动画在文档加载后立即开始。

svg path {
  fill: none;
  stroke: cornflowerblue;
  stroke-width: 1;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  animation: path 5s linear forwards;
}
@keyframes path {
  to {
    stroke-dashoffset: 0;
  }
}
<svg width="500" height="300" viewBox="15 15 150 50">

  <circle id="a" cx="26.5" cy="13.2" r="4" fill="cornflowerblue" cursor="pointer"></circle>
  <circle id="b" cx="87.3" cy="23.8" r="4" fill="cornflowerblue" cursor="pointer"></circle>
  
  <text y="15" x="18" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">A</text>
  <text y="26" x="92" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">B</text>

  <path d="m 26.458333,13.229167 c 2.776366,16.871891 9.790064,18.199908 18.520833,13.229166 L 63.499999,13.229167 C 77.382834,4.1082137 88.663388,0.52362484 87.312499,23.8125 v 0"stroke="cornflowerblue" stroke-width="1" fill="none" id="mPath"></path>

</svg>

问题:如何在单击某个点时开始绘制一条线的动画A?有兴趣通过问题标签中指示的任何方式和技术详细描述此类实现和实现本身,这可以是 and CSS, and SMIL SVG, 以及使用 and JavaScript。

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Oliver Patterson
    2022-04-14T21:26:13Z2022-04-14T21:26:13Z

    我们挂在带有id=a点击处理程序的元素上,然后我们寻找父元素svg并给它一个 class active,它开始动画(在 css 中path,我们svg用 class开始动画active)。

    document.getElementById('a').addEventListener('click', (e) =>
    {
      e.target.closest('svg').classList.add('active');
    });
    svg path {
      fill: none;
      stroke: cornflowerblue;
      stroke-width: 1;
      stroke-linecap: round;
      stroke-linejoin: round;
      stroke-dasharray: 100;
      stroke-dashoffset: 100;
    }
    
    svg.active path
    {
      animation: path 5s linear forwards;
    }
    
    @keyframes path {
      to {
        stroke-dashoffset: 0;
      }
    }
    <svg width="500" height="300" viewBox="15 15 150 50">
    
      <circle id="a" cx="26.5" cy="13.2" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      <circle id="b" cx="87.3" cy="23.8" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      
      <text y="15" x="18" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">A</text>
      <text y="26" x="92" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">B</text>
    
      <path d="m 26.458333,13.229167 c 2.776366,16.871891 9.790064,18.199908 18.520833,13.229166 L 63.499999,13.229167 C 77.382834,4.1082137 88.663388,0.52362484 87.312499,23.8125 v 0"stroke="cornflowerblue" stroke-width="1" fill="none" id="mPath"></path>
    
    </svg>

    • 7
  2. Best Answer
    Alexandr_TT
    2022-04-14T22:19:29Z2022-04-14T22:19:29Z

    纯 SVG SMIL

    线条绘制动画基于stroke-dashoffset从最大值减小到零的技术。因此,实现了线从零增长到全长的动画。

    • 计算最大行长,使用JS方法 getTotalLength()

    console.log(p1.getTotalLength());我们明白了~=91px

    • 接下来,您需要添加到 CSS 样式或直接添加到 SVG 路径
    stroke-dasharray="91" 
     stroke-dashoffset="91"
    
    • 接下来,我们编写将stroke-dashoffset减小为零的动画命令
    <animate attributeName="stroke-dashoffset" begin="a.click" dur="4s" to="0" fill="freeze" /> 
    

    , 在哪里 begin="a.click"是通过单击圆圈来启动动画的条件id="a"

    <svg width="500" height="300" viewBox="15 15 150 50">
    
      <circle id="a" cx="26.5" cy="13.2" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      
      <circle id="b" cx="87.3" cy="23.8" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      
      <text y="15" x="18" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">A</text>
      <text y="26" x="92" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">B</text>
    
      <path id="p1" stroke-dasharray="91" stroke-dashoffset="91" d="m 26.458333,13.229167 c 2.776366,16.871891 9.790064,18.199908 18.520833,13.229166 L 63.499999,13.229167 C 77.382834,4.1082137 88.663388,0.52362484 87.312499,23.8125 v 0" stroke="cornflowerblue" stroke-width="1" fill="none" id="mPath">
        <animate attributeName="stroke-dashoffset" begin="a.click" dur="4s" to="0" fill="freeze" /> 
      
      </path>
    
    </svg> 
    <script>
    console.log(p1.getTotalLength());
    </script>

    来回动画

    增加了values="91;0;0;91;91",也就是从最大值-91到0和返回到0
    重复值\u200b\u200b在极端位置提供停顿

    <svg width="500" height="300" viewBox="15 15 150 50">
    
      <circle id="a" cx="26.5" cy="13.2" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      
      <circle id="b" cx="87.3" cy="23.8" r="4" fill="cornflowerblue" cursor="pointer"></circle>
      
      <text y="15" x="18" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">A</text>
      <text y="26" x="92" fill="cornflowerblue" stroke="none" stroke-width="0.1" font-size="6px">B</text>
    
      <path id="p1" stroke-dasharray="91" stroke-dashoffset="91" d="m 26.458333,13.229167 c 2.776366,16.871891 9.790064,18.199908 18.520833,13.229166 L 63.499999,13.229167 C 77.382834,4.1082137 88.663388,0.52362484 87.312499,23.8125 v 0" stroke="cornflowerblue" stroke-width="1" fill="none" id="mPath">
        <animate attributeName="stroke-dashoffset" begin="a.click" dur="4s" values="91;0;0;91;91" fill="freeze" repeatCount="indefinite" restart="never"/> 
      </path>
    </svg> 

    • 4

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5