找回密码
 立即注册
搜索
查看: 21|回复: 4

这个图案以前用svgdr画过 转自马黑黑教程专版

[复制链接]

1642

主题

3447

回帖

1万

积分

管理员

积分
13965
发表于 昨天 22:37 | 显示全部楼层 |阅读模式
<style>
    /* svg id选择器可以定义使用的部分属性(fill、stroke-*等) */
    #msvg { display: block; margin: auto; fill: none; stroke: steelblue; stroke-width: 6; stroke-linecap: round; stroke-linejoin: round; }
    /* 外层图案(齿轮)样式 */
    .path{ stroke-dasharray: var(--len); stroke-dashoffset: var(--len); animation: draw linear 6s var(--delay) forwards; --delay: 4s; }
    /* 里层图案(圆)样式 */
    .cc { animation: grow linear 4s forwards; }
    /* 描边动画 */
    @keyframes draw { to { stroke-dashoffset: 0; } }
    /* 圆变大动画 */
    @keyframes grow { to { r: 120; } }
</style>

<svg id="msvg" width="600" height="600" viewBox="-200 -200 400 400" xmlns="http://www.w3.org/2000/svg"></svg>

<script>
    loadJs('https://638183.freep.cn/638183/svgdr/svgdr.min.js', tzRun);

    function tzRun() {
        var dr = _dr(msvg);

        const vertex1 = dr.circlePoints(26, 200, 180); // 外切圆1点坐标
        const vertex2 = dr.circlePoints(26, 200, 160); // 外切圆2点坐标
        // 拼接路径
        let path = 'M';
        for (let i = 0; i < vertex1.length; i++) {
            const v1 = vertex1[i].join(',');
            const v2 = vertex2[i].join(',');
            path += i % 2 === 0 ? v1 + ' ' + v2 + ' ' : v2 + ' ' + v1 + ' ';
        };
        path += 'Z'; // 路径闭环
        dr.path(path).set('class', 'path'); // 绘制路径
        dr.elm.style.setProperty('--len', dr.elm.getTotalLength()); // 设置--len变量

        dr.circle(0, 0, 0).set('class', 'cc'); // 画圆
    }

    function loadJs(url, callback) {
        var script = document.createElement('script');
        script.charset = 'utf-8';
        script.src = url;
        script.onload = function() {
            if (callback) callback();
        };
        document.head.appendChild(script);
    }
</script>

1642

主题

3447

回帖

1万

积分

管理员

积分
13965
 楼主| 发表于 昨天 22:38 | 显示全部楼层

1642

主题

3447

回帖

1万

积分

管理员

积分
13965
 楼主| 发表于 昨天 22:39 | 显示全部楼层

path 路径通过两个外切圆获取各 26 个圆周上的点坐标,这些点按照预设规则连线成为闭合路径,最终的路径数据如下:
M180.00,0.00 160.00,0.00 155.35,38.29 174.77,43.08 159.38,83.65 141.67,74.36 119.76,106.10 134.73,119.36 102.25,148.14 90.89,131.68 56.74,149.60 63.83,168.30 21.70,178.69 19.29,158.83 -19.29,158.83 -21.70,178.69 -63.83,168.30 -56.74,149.60 -90.89,131.68 -102.25,148.14 -134.73,119.36 -119.76,106.10 -141.67,74.36 -159.38,83.65 -174.77,43.08 -155.35,38.29 -160.00,0.00 -180.00,0.00 -174.77,-43.08 -155.35,-38.29 -141.67,-74.36 -159.38,-83.65 -134.73,-119.36 -119.76,-106.10 -90.89,-131.68 -102.25,-148.14 -63.83,-168.30 -56.74,-149.60 -19.29,-158.83 -21.70,-178.69 21.70,-178.69 19.29,-158.83 56.74,-149.60 63.83,-168.30 102.25,-148.14 90.89,-131.68 119.76,-106.10 134.73,-119.36 159.38,-83.65 141.67,-74.36 155.35,-38.29 174.77,-43.08 Z

1642

主题

3447

回帖

1万

积分

管理员

积分
13965
 楼主| 发表于 昨天 22:40 | 显示全部楼层
图案中,圆从小到大的动画,是通过改变圆的半径而得,半径从 0 长到 120。

在CSS中,圆的半径属性 r 得到原生支持,所以可以使用 @keyframes 关键帧动画选择器基于圆的半径设置动画


1642

主题

3447

回帖

1万

积分

管理员

积分
13965
 楼主| 发表于 昨天 22:41 | 显示全部楼层

计算圆周上指定点的坐标使用到三角函数,公式如下:

x = x0 + r * cos(angle * PI / 180)
y = y0 + r * sin(angle * PI /180)

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

协同嘉业科技有限公司 ( 京ICP备2024053108号-1 )

GMT+8, 2026-11-1 18:12 , Processed in 0.092863 second(s), 34 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表