RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1018678
Accepted
MoloF
MoloF
Asked:2020-08-29 22:28:40 +0000 UTC2020-08-29 22:28:40 +0000 UTC 2020-08-29 22:28:40 +0000 UTC

如何为对象的曲线边框设置动画?

  • 772

有这样一个网站:

一个东西

这个“印迹”在右侧和底部有一个曲线边框。

图片是静态的,但我将提供一个链接,说明它是如何在一种流行的服务上实现的。

我想知道如何实现这个效果?只对这些“四舍五入”的动画感兴趣。

你至少可以从哪个方向找到大致的信息?该站点使用画布绘制对象,但我确信这也可以在 SVG 上完成。

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Stranger in the Q
    2020-08-30T01:46:30Z2020-08-30T01:46:30Z

    布局中最类似于​​极坐标中的正弦曲线。

    让我们从一个圆开始,在极坐标系中(d-距离,t-角度),它的公式极其简单:

     d = r; // d - расстояние до точки равно радиусу оркужности.
    

    如何理解:想象你拿起指南针画了一个圆。看起来就是这样。从圆心到圆的每个点的距离是恒定的,等于半径。拐角处的半径值不变。

    如果在指南针的旋转过程中,根据角度改变其半径并以正弦曲线的形式进行这种羡慕,您将获得类似于布局中的形状

    d = r + sin(t*freq)*amp; // freq - частота, amp - амплитуда.
    

    如果你给这种依赖增加时间,你就会得到动画。

    let lerp = (a, b, val) => a + val * (b - a);   // линейная интерполяция
    let rand = n => (Math.sin(n)*43758.5453123)%1; // псевдо случайное число
    
    https://joshondesign.com/2013/03/01/improvedEasingEquations
    function easeOutElastic(t) {
        var p = 0.5;
        return Math.pow(2,-10*t) * Math.sin((t-p/4)*(2*Math.PI)/p) + 1;
    }
    
    // одномерный шум
    let noise = p => {
      let fl = Math.floor(p);
      return lerp(rand(fl), rand(fl + 1.0), p%1);
    }
    
    requestAnimationFrame(draw);
    
    function draw(t) {
      requestAnimationFrame(draw);
      t = Math.max(0, t - 200); // небольшая задержка на старте
      let pts = "0,0";
      // для каждого угла в первой четверти окружности с шагом 0.01 радиан считаем точку
      for (var a = 0; a <= Math.PI/2; a += 0.01) {
        a %= Math.PI*2; // нормализуем угол
        // анимация увеличения радиуса кляксы на старте до значения 90
        let grow = Math.min(1, t/1000);
        grow = easeOutElastic(grow)
        let r = grow*70 // добавляем к базовому радиусу синус и косинус от времени и угла.
              + Math.cos(a*11 - t/379) * 2*grow
              + Math.sin(a*17 + noise(t/1e4)*15) * 3*grow;
        pts += "," + Math.cos(a)*r + "," + Math.sin(a)*r; 
      }
      shape.setAttribute('points', pts);
    }
    body { margin:0;overflow:hidden; }
    <svg viewbox=0,0,100,100 height=100vh>
      <polygon id=shape></polygon>
    </svg>

    加入了伪随机元素,更好玩

    • 14
  2. Alexandr_TT
    2020-08-30T00:11:57Z2020-08-30T00:11:57Z

    这样的动画是通过改变“d”路径属性来实现的。

    • 首先你需要得到曲线在初始位置的形状:

    在此处输入图像描述

    • 然后,通过在矢量编辑器中移动曲线的节点,我们得到曲线的最终形状:

    在此处输入图像描述

    接下来,我们编写曲线动画命令:

    <animate attributeName="d" values="path1 ; path2 ; path1" />

    svg {
    width:40%;
    height:40%;
    }
    path {
    fill:#2F3136;
    stroke:black;
    stroke-width:4;
    }
    <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="770" height="770" viewBox="0 0 770 770" preserveAspectRatio="xMinYMin meet" >
    
    <path d="M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z" >
    <animate attributeName="d"
      dur="8s"
      values="
             M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 76.8 2.3 110.7-24.2 67.7-52.9 94.4-1.3 137.3-18.5 40.1-16.1 39.1-57.3 105-76.1 93.8-26.8 81.5-74.9 124.6-109.6 22.3-17.9 50.6-23.4 69.2-50.8 41.5-61.1 14.5-80.4 66.9-115.4 0 0 28.1-21.9 36.9-36.9 16.5-28.3 27.7-30.3 26.5-94.6-0.4-21.7 2.5-76.9 19.6-94.6C730.2 67.3 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z"
    		 repeatcount="indefinite"
    		 />
    		 
    </path>
    
    </svg>

    • 带有背景图像和阴影的选项

    .container {
    width:75%;
    height:75%;
    
    }
    
    path {
    fill:#2F3136;
    stroke:black;
    stroke-width:0;
    fill-opacity:0.5;
    -webkit-filter: drop-shadow(4px 4px 1px black);
        filter: drop-shadow(4px 4px 1px black);
    }
    <div class="container">
    <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1"  viewBox="0 0 770 770" preserveAspectRatio="none" >
    <image  xlink:href="https://isstatic.askoverflow.dev/ABxSm.jpg" x="10" width="1125px" height="750px" >
     
    </image>
    <path   d="M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z" >
    <animate id="an_d" attributeName="d"
      dur="8s"
      begin="0s"
      values="
             M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 76.8 2.3 110.7-24.2 67.7-52.9 94.4-1.3 137.3-18.5 40.1-16.1 39.1-57.3 105-76.1 93.8-26.8 81.5-74.9 124.6-109.6 22.3-17.9 50.6-23.4 69.2-50.8 41.5-61.1 14.5-80.4 66.9-115.4 0 0 28.1-21.9 36.9-36.9 16.5-28.3 27.7-30.3 26.5-94.6-0.4-21.7 2.5-76.9 19.6-94.6C730.2 67.3 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z"
    		 repeatCount="indefinite"
    		 />
    		
    </path>
    
    </svg>
    </div>

    • 边框动画加上整个块大小的动画

    .container {
    width:75%;
    height:75%;
    
    }
    
    path {
    fill:#2F3136;
    stroke:black;
    stroke-width:0;
    fill-opacity:0.5;
    
    }
    <div class="container">
    <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1"  viewBox="0 0 770 770" preserveAspectRatio="none" >
    <defs>
    <filter id='shadow'>
        <feGaussianBlur in='SourceAlpha' stdDeviation='2' />
        <feOffset dx='3' dy='3' result='blur' />
        <feMerge>
          <feMergeNode in='blur' />
          <feMergeNode in='SourceGraphic' />
        </feMerge>
      </filter>
      </defs>
    <image  xlink:href="https://isstatic.askoverflow.dev/ABxSm.jpg" x="10" width="1125px" height="750px" >
     
    </image>
    <path filter="url(#shadow)"  d="M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z" >
    <animate id="an_d" attributeName="d"
      dur="8s"
      begin="0s;an_t.end"
      values="
             M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 76.8 2.3 110.7-24.2 67.7-52.9 94.4-1.3 137.3-18.5 40.1-16.1 39.1-57.3 105-76.1 93.8-26.8 81.5-74.9 124.6-109.6 22.3-17.9 50.6-23.4 69.2-50.8 41.5-61.1 14.5-80.4 66.9-115.4 0 0 28.1-21.9 36.9-36.9 16.5-28.3 27.7-30.3 26.5-94.6-0.4-21.7 2.5-76.9 19.6-94.6C730.2 67.3 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z;
    		 M8.1 1.2V721.6c0 0 73.2 20.7 105 16.1 39.9-5.6 63.5-61.7 105-66.9 35-4.4 74.9 1 105-13.8 41.9-20.7 60.2-90.1 92.3-108.4 30.9-17.7 74.9-13.9 101.5-33.5 63.3-46.3 5.3-81.5 76.1-145.3 0 0 47.9-24.3 61.1-46.1 19.6-32.3 18.5-61.6 18.5-111.9 0-21.7 15.2-38.8 32.3-56.5C730.2 121.6 752.7 68.8 719.8 2.9 516.8-0.6 218-0.6 8.1 1.2Z"
    		 repeatcount="1"
    		 />
    		<animateTransform id="an_t" attributeName="transform" type="scale" dur="12s" begin="an_d.end" values="1;0.5;0.5;1" /> 
    </path>
    
    </svg>
    </div>

    • 8

相关问题

Sidebar

Stats

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

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • 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