使用js和css 实现div旋转围绕圆分布排列

news2024/11/27 8:43:50

记录,以防忘记

围绕圆

import React, { useEffect } from 'react';
import './index.scoped.scss';


const Test = () => {


    const arr = Array.from({ length: 28 }, (_, index) => index + 1);

    useEffect(() => {
        const dayTotal = arr.length;

        // 动态设置每个点的旋转角度
        const dots = document.querySelectorAll('.dot') as NodeListOf<HTMLElement>;
        const pDeg = 360 / dayTotal;
        dots.forEach((dot, index) => {
            dot.style.transform = `rotate(${index * pDeg}deg) translate(0, -200px)`;
        });
    }, [arr.length]);


    return <div className='flex items-center justify-center w-full h-[100vh]'>

        <div className='relative bg-gray-700 rounded-full box'>
            {arr.map((item, index) => {
                return <div key={index} className='absolute bg-blue-400 dot'>{item}</div>;
            })}
        </div>
    </div>;
};

export default Test;



// scss


$containSize: 400px;
$ballSize: 20px;

.box {
    width: $containSize;
    height: $containSize;
    position: relative;

    .dot {
        width: $ballSize;
        height: $ballSize;
        position: absolute;
        top: 50%;
        left: 50%;
        margin-left: calc(-1 * $ballSize / 2);
        margin-top: calc(-1 * $ballSize / 2);
        transform-origin: center;
    }
}

进阶 实现loading加载

import React, { useEffect } from 'react';
import './index.scoped.scss';


const Test = () => {


    const arr = Array.from({ length: 32 }, (_, index) => index + 1);


    return <div className='flex items-center justify-center w-full h-[100vh] bg-[#5bbff1]'>

        <div className='relative rounded-full loading'>
            {arr.map((item, index) => {
                return <div key={index} className='absolute dot' />;
            })}
        </div>
    </div>;
};

export default Test;



// scss

$containSize: 150px;
$ballSize: 10px;

.loading {
    width: $containSize;
    height: $containSize;

    
    $n: 32; // 小球数量
    $pDeg: calc(360deg / $n);   // 每个小球旋转的角度


    .dot {
        width: $ballSize;
        height: $ballSize;
        top: 0;
        left: 50%;
        margin-left: calc(-1 * $ballSize / 2);
        margin-top: calc(-1 * $ballSize / 2);
        transform-origin: center calc($containSize / 2) + calc($ballSize / 2);
        
        $duration: 2s; // 小球动画总时长

        @for $i from 1 through $n {
            &:nth-child(#{$i}) {
                transform: rotate(calc($i - 1) * $pDeg);

                &::after,
                &::before {
                    animation-delay: -(calc($duration / $n * ($i - 1) * 6));
                }

            }
        }

        &::before,
        &::after {
            content: '';
            position: absolute;
            width: 100%;
            height: 100%;
            border-radius: 100px;
        }

        perspective: 70px;
        transform-style: preserve-3d;

        &::before {
            top: -100%;
            background: #000;
            animation: rotate-black $duration infinite;

            @keyframes rotate-black {
                0% {
                    animation-timing-function: ease-in;
                }

                25% {
                    transform: translate3d(0, 100%, $ballSize);
                    animation-timing-function: ease-out;
                }

                50% {
                    transform: translate3d(0, 200%, 0);
                    animation-timing-function: ease-in;
                }

                75% {
                    transform: translate3d(0, 100%, -$ballSize);
                    animation-timing-function: ease-out;
                }
            }
        }

        &::after {
            top: 100%;
            background: #fff;
            animation: rotate-white $duration infinite;

            @keyframes rotate-white {
                0% {
                    animation-timing-function: ease-in;
                }

                25% {
                    transform: translate3d(0, -100%, -$ballSize);
                    animation-timing-function: ease-out;
                }

                50% {
                    transform: translate3d(0, -200%, 0);
                    animation-timing-function: ease-in;
                }

                75% {
                    transform: translate3d(0, -100%, $ballSize);
                    animation-timing-function: ease-out;
                }
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速找出问题快件:批量查询与筛选技巧

在日常生活中&#xff0c;我们经常需要查询大量的快递信息。尤其在电商、物流等行业&#xff0c;快速、准确地查询和筛选快递信息至关重要。固乔快递查询助手是一款强大的工具&#xff0c;能帮助用户批量查询快递&#xff0c;并快速筛选出问题快件。下面我们将详细介绍如何使用…

opengl创建柱面和鱼眼重展uv

专业软件 先看一下专业软件 可以拉取很多的uv点 以下是使用 OpenGL 创建不规则面片并指定 UV 的一般步骤&#xff1a; 1 顶点数据准备 2 定义面片的顶点坐标。这些顶点构成了面片的形状。 3 为每个顶点指定对应的纹理坐标&#xff08;UV&#xff09;。 4 创建顶点缓冲区对象…

Springboot整合hutool验证码

在 Spring Boot 中&#xff0c;你可以将 Hutool 生成验证码的功能集成到 RESTful API 接口中。 依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.14</version> <!-- 使用最新版…

EF Core 索引器属性(Indexer property)场景及应用

EF Core 索引器属性&#xff08;Indexer property&#xff09;场景及应用 简介 EF Core 中的索引器属性&#xff08;Indexer Property&#xff09;是指通过一个特殊的属性来访问实体类中的数据&#xff0c;而不必明确声明实体属性。这种属性在一些动态或未预定义的场景中非常…

【Java算法专场】位运算(下)

目录 判定字符是否唯一 ​编辑 算法分析 算法步骤 算法代码 hash表 位运算 两整数之和 算法分析 算法步骤 算法代码 只出现一次的数字 II 算法分析 算法步骤 算法代码 只出现一次的数字 III 算法分析 算法步骤 算法代码 面试题 17.19. 消失的两个数字 算…

python 如何实现执行selenium自动化测试用例自动录屏?

做自动化测试已经好多年了&#xff0c;随着项目技术的正增长提升&#xff0c;我们也不断完善并提高自己的技术能力&#xff0c; 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助&#xff01; 首先&#xff0c;我们为什么要执行自动化录屏功能呢…

TIOBE 8月编程排行榜出炉!Python 正在追赶 Java 的 TIOBE 指数记录

2024年8月的TIOBE编程语言排行榜出炉了&#xff01;对于开发者而言&#xff0c;这份排行榜不仅仅是编程语言的简单排序&#xff0c;更是行业趋势的风向标。而今年&#xff0c;Python的表现格外引人注目&#xff0c;它正在一步步逼近Java的TIOBE指数记录。让我们一起看看这两大编…

es的执行命令日志输出

1. 说明 最近项目对接es&#xff0c;使用的客户端为&#xff1a; <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.11.4</version></dependency>使用过程中希望能…

3-1 介绍及传感器(智能应用篇)

3-1 介绍及传感器&#xff08;智能应用篇&#xff09; 3-0 本章介绍3-1 传感器介绍 3-0 本章介绍 Arduino实际应用到生活中 科技创作给生活的乐趣与便利 前两部分内容为基础 太极创客官方网站 课程主角led Led蕴含丰富的科技知识 水立方&#xff0c;led 主机led 汽车le…

整理 酷炫 Flutter 开源UI框架 FAB

flutter_villains 灵活且易于使用的页面转换。 项目地址&#xff1a;https://github.com/Norbert515/flutter_villains 项目Demo&#xff1a;https://download.csdn.net/download/qq_36040764/89631324

前端开发攻略---一篇文章让你快速上手TypeScript

目录 1、TypeScript简介 2、为何需要TypeScript 2.1 今非昔比的JavaScript 2.2 JavaScript中的困扰 2.3 静态类型检查 3、编译TypeScript 3.1 命令行编译 3.2 自动化编译 4、类型声明 5、类型推断 6、类型总览 6.1 JavaScript中的数据类型 6.2 TypeScript中的数据类…

【模电笔记】——信号的运算和处理电路(含电压比较器)

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…

Python实战项目:天气数据爬取+数据可视化(完整代码)

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

搭建高可用OpenStack(Queen版)集群(十一)之OpenStack集成ceph服务

一、OpenStack集成ceph服务 一&#xff09;Openstack集成Ceph准备 1、OpenStack存储知识 1、OpenStack数据存储分类 Openstack环境中&#xff0c;数据存储可分为临时性存储与永久性存储。 临时性存储&#xff1a;主要由本地文件系统提供&#xff0c;并主要用于nova虚拟机的本地…

开放式耳机哪种好用又实用?五款爆火单品推荐

现在市面上的开放式耳机真的参差不齐&#xff0c;而且想要挑选到一款适合自己的开放式耳机&#xff0c;那真的很难&#xff0c;要做很多功课&#xff0c;现在购物就像是在大海捞针一样&#xff0c;所以我们该怎么挑选才能选到一款适合自己的开放式耳机呢&#xff1f;这个问题相…

数据库原理面试-核心概念-问题理解

目录 1.数据库、数据库系统与数据库管理系统 2.理解数据独立性 3.数据模型 4.模式、外模式和内模式 5.关系和关系数据库 6.主键与外键 7.SQL语言 8.索引与视图 9.数据库安全 10.数据库完整性 11.数据依赖和函数依赖 12.范式&#xff1f;三范式&#xff1f;为什么要遵…

Java基础11:JavaDoc生成文档

本节内容教学视频连接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p32&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p32&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.什么是JavaDoc&#xff1f; Javado…

双向重发布实验

要求&#xff1a; 1. 如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接 口&#xff0c;合理规划 IP 地址 2.R1-R2-R3-R4-R6 之间使用 OSPF 协议&#xff0c; R4-R5-R6 之间使用 RIP 协议 3.R1 环回重发布方式引入 OSPF 网络 4.R4/R6 上进行双点双向重发布 5. …

开发效率翻倍攻略!大学生电脑小白管理秘籍,资料秒搜技巧大公开!C盘满了怎么办?如何快速安全的清理C盘?烦人的电脑问题?一键解决!

如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f; 文章目录 如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f;前言初级基础分区操…

我开源了一个新项目! Product Hunt 每日中文热榜

Product Hunt 每日中文热榜 大家好&#xff0c;今天非常兴奋地与大家分享一个我刚刚开源的新项目 —— producthunt-daily-hot。这个项目从构思到实现仅花了 1 天时间&#xff0c;希望对大家有所帮助。Product Hunt 每日热榜 已上线&#xff0c;榜单会在每天下午 4 点自动更新…