用老三件实现页面路径动画 | 豆包MarsCode AI 刷题

71 阅读3分钟

html,css,js被称作是前端开发的老三件,虽然近年来被很多新兴的开发框架取代了部分地位,但是由于它们的简介性,依赖少的特点,依旧被很多前端开发者所青睐。

前几天看到一个网站上有按照路径运动的小图像动来动去地很好玩,于是想要尝试写一个代码实现它。

总体流程

看着很复杂实际代码并不是很困难。我们可以用HTML来规定图标的运动路径(用svg),用CSS来设计一些样式,再利用JavaScript来设计动画。

补充信息:SVG(Scalable Vector Graphics)是一种用于描述二维矢量图形的图像格式,允许用户通过标签来定义图形的形状、颜色、文本和其他属性。

开始写代码

首先我们可以设计一个小球在一条贝塞尔曲线上移动。贝塞尔曲线是一种广泛用于图形设计和动画中的曲线,能够创建平滑的路径。以下是定义贝塞尔曲线的代码示例:

<path id="path" d="M 50 350 Q 250 50 450 350" fill="transparent" stroke="lightgray" stroke-width="2"/>

在这段代码中,d="M 50 350 Q 250 50 450 350"表示从点(50,350)开始运动,路径是一条贝塞尔曲线。具体来说:

  • M 50 350M表示移动到起点(50, 350)。
  • Q 250 50 450 350Q表示使用一个控制点(250, 50)来绘制曲线,终点为(450, 350)。

此外,其他参数描述了轨迹的外观:fill="transparent"表示路径内部不填充颜色,stroke="lightgray"设置路径的颜色为浅灰色,stroke-width="2"则定义了边框的宽度为2个单位。

完整的代码 如下:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>路径动画示例</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        svg {
            width: 80%;
            height: auto;
        }
        .dot {
            fill: red;
            transition: transform 0.3s ease;
        }
    </style>
</head>
<body>
    <svg viewBox="0 0 500 400">
        <path id="path" d="M 50 350 Q 250 50 450 350" fill="transparent" stroke="lightgray" stroke-width="2"/>
        <circle class="dot" r="5"></circle>
    </svg>

    <script>
        const path = document.getElementById('path');
        const dot = document.querySelector('.dot');

        const pathLength = path.getTotalLength();

        // 动画函数
        function animateDot() {
            let startTime = null;

            function step(timestamp) {
                if (!startTime) startTime = timestamp;
                const progress = (timestamp - startTime) / 3000; // 动画持续时间3000ms

                const point = path.getPointAtLength(progress * pathLength);
                dot.setAttribute('cx', point.x);
                dot.setAttribute('cy', point.y);

                if (progress < 1) {
                    requestAnimationFrame(step);
                }
            }

            requestAnimationFrame(step);
        }

        // 开始动画
        animateDot();
    </script>
</body>
</html>

在这个完整的代码中,我们创建了一个SVG画布,其中包含了定义的贝塞尔曲线和一个小球。通过JavaScript,我们实现了小球沿着曲线移动的动画效果,使其在视觉上更具动感和趣味性。这种实现方式不仅直观易懂,还能灵活调整,以适应不同的动画需求。

扩展思考

如果我们不想要运动小球,我们想要移动一个图片,则把dot改成image即可。

<image class="dot" href="图片路径" width="30" height="30" x="0" y="0"></image>

并且不要忘了把dot属性设置的名称从cx,cy改成x,y哦!

===

前端学习分享,欢迎讨论,斧正。