js实现3d拖拽环绕旋转

js实现拖动节点围绕圆心转动在这里插入图片描述

1.使用transform属性,将圆环放倒展示为椭圆

圆环上有不同的色彩,在转动的同时,需要让圆环也转动,所以圆环不能是椭圆,而是圆形,这样在转动的时候,改变rotate,可以让圆环绕中间转动

<div class="home-cirque-hidden"><div class="home-cirque-div" :style="`transform: rotateX(76deg) rotateZ(${theta * -1}deg);`"></div></div>.home-cirque{width: 1560px;height: 1560px;position: absolute;left: 55px;top: -773px;transform-style: preserve-3d;perspective: 3000px;}.home-cirque-div{width: 1560px;height: 1560px;position: absolute;left: 0;top: -638px;background: url('../assets/home/circle1.png') no-repeat center;background-size: contain;}.home-cirque-hidden{width: 1560px;height: 371px;position: absolute;left: 0;top: 629px;overflow: hidden;transform-style: preserve-3d;perspective: 3000px;}

2.将12个节点绘制上去,并且进行旋转

12个节点的圆心设置到外部,在转动的时候可以围绕一个圆心点转动,形成3d旋转,但是点位不能旋转,所以在旋转的同时,需要让点位自转,抵消掉父元素围绕圆心的转动

<div class="home-ellipse" @mousedown="turnDown" @mousemove="turnMove"><div :style="`transform: translateZ(800px) rotateY(${theta + item.num}deg);`" :class="`home-dot home-dot${item.index}`" v-for="item in dotList" :key="item.index"><div class="home-dot-line" :style="`transform: rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);height:${scaleFun(item)==1.3?93:64}px;`"></div><div :style="`transform: rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);`" class="home-dot-box"><div></div></div><div :style="`transform:translateZ(1px) translateX(-50%) rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);`" :class="`home-list home-list${item.index}`"><div :style="`transform: translateX(-50%) translateY(${scaleFun(item)==1.3?-50:0}%);`" :class="scaleFun(item)==1.3?'home-list-active':'home-list-bg'">{{ item.title }}</div></div></div>
</div>
.home-ellipse{width: 280px;height: 400px;position: absolute;left: 697px;top: -192px;transform-style: preserve-3d;transform: rotateX(-13deg) rotateY(0deg);perspective: 7000px;}.home-dot{width: 100%;height: 100%;position: absolute;transform-origin: center center -750px;left: 0;top: 0;right: 0;bottom: 0;margin: auto;z-index: 100;transform-style: preserve-3d;perspective: 10000px;}.home-dot-box{width: 52px;height: 52px;position: absolute;left: 0;top: 0;right: 0;bottom: 0;margin: auto;z-index: 1;background: url('../assets/home/dot.png') no-repeat center;background-size: contain;}.home-dot-line{width: 1px;height: 64px;position: absolute;left: 0;right: 0;margin: 0 auto;bottom: 56%;background: url('../assets/home/dot-line.png') no-repeat center top;background-size: cover;}.home-list{position: absolute;width: 199px;height: 98px;left: 50%;top: calc(50% - 170px);z-index: 2;transform: translateX(-50%);}.home-list div{position: absolute;left: 50%;top: 0;z-index: 2;text-align: center;text-wrap: balance;transition: transform 0.3s;box-sizing: border-box;display: flex;align-items: center;justify-content: center;}.home-list-bg{font-size: 16px;width: 229px;height: 98px;padding: 20px 20px;background: url('../assets/home/list-bg.png') no-repeat center;background-size: 100%;}.home-list-active{width: 405px;height: 197px;font-size: 22px;line-height: 26px;padding: 47px 61px;font-weight: bold;background: url('../assets/home/list-active.png') no-repeat center;background-size: 100%;}

3.全部源码

<style scoped>.home{width: 100%;height: 100%;position: relative;overflow: hidden;background-color: #0a4662;color: #fff;}.home-content{width: 1623px;height: 683px;position: absolute;bottom: -79px;left: 204px;}.home-ellipse{width: 280px;height: 400px;position: absolute;left: 697px;top: -192px;transform-style: preserve-3d;transform: rotateX(-13deg) rotateY(0deg);perspective: 7000px;}.home-cirque{width: 1560px;height: 1560px;position: absolute;left: 55px;top: -773px;transform-style: preserve-3d;perspective: 3000px;}.home-cirque-div{width: 1560px;height: 1560px;position: absolute;left: 0;top: -638px;background: url('../assets/home/circle1.png') no-repeat center;background-size: contain;}.home-cirque-hidden{width: 1560px;height: 371px;position: absolute;left: 0;top: 629px;overflow: hidden;transform-style: preserve-3d;perspective: 3000px;}.home-dot{width: 100%;height: 100%;position: absolute;transform-origin: center center -750px;left: 0;top: 0;right: 0;bottom: 0;margin: auto;z-index: 100;transform-style: preserve-3d;perspective: 10000px;}.home-dot-box{width: 52px;height: 52px;position: absolute;left: 0;top: 0;right: 0;bottom: 0;margin: auto;z-index: 1;background: url('../assets/home/dot.png') no-repeat center;background-size: contain;}.home-dot-line{width: 1px;height: 64px;position: absolute;left: 0;right: 0;margin: 0 auto;bottom: 56%;background: url('../assets/home/dot-line.png') no-repeat center top;background-size: cover;}.home-list{position: absolute;width: 199px;height: 98px;left: 50%;top: calc(50% - 170px);z-index: 2;transform: translateX(-50%);}.home-list div{position: absolute;left: 50%;top: 0;z-index: 2;text-align: center;text-wrap: balance;transition: transform 0.3s;box-sizing: border-box;display: flex;align-items: center;justify-content: center;}.home-list-bg{font-size: 16px;width: 229px;height: 98px;padding: 20px 20px;background: url('../assets/home/list-bg.png') no-repeat center;background-size: 100%;}.home-list-active{width: 405px;height: 197px;font-size: 22px;line-height: 26px;padding: 47px 61px;font-weight: bold;background: url('../assets/home/list-active.png') no-repeat center;background-size: 100%;}.home-line{width: 1500px;height: 1500px;position: absolute;left: 77px;top: -700px;transform-style: preserve-3d;perspective: 5000px;transform: rotateX(-12.7deg);}.home-line-box{width: 1600px;height: 393px;position: absolute;left: 0;top: 597px;overflow: hidden;background: url('../assets/home/line-1.png') no-repeat center;background-size: contain;}.home-point{width: 7px;height: 7px;position: absolute;transform-origin: center center -750px;left: 0;top: 0;right: 0;bottom: 0;margin: auto;background-color: rgba(255, 255, 255, 0.4);border-radius: 500%;}.home-title{position: absolute;height: 13px;transform-origin: center center -750px;left: 0;top: 0;right: 0;bottom: 0;margin: auto;transform-style: preserve-3d;perspective: 500px;}.home-title div{position: absolute;width: 93px;height: 13px;left: 0;top: 0;right: 0;bottom: 0;margin: auto;font-size: 12px;}
</style>
<template><div class="home" @mouseup="turnUp"><div class="home-content"><div class="home-light"></div><div class="home-line"><div class="home-line-box"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + (-13.7)}deg);`"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + 115}deg);`"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + 147}deg);`"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + 241.7}deg);`"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + 284.5}deg);`"></div><div class="home-point" :style="`transform: translateZ(790px) rotateY(${theta + 322.6}deg);`"></div><div class="home-title home-title1" :style="`transform: translateY(-2px) translateZ(810px) rotateY(${theta + 49}deg) scale(1)`"><div :style="`transform: rotateY(${titleComput(49,'+')}deg);`">测试环绕文字1</div></div><div class="home-title home-title3" :style="`transform: translateY(-2px) translateZ(810px) rotateY(${theta + 137.1}deg) scale(1);`"><div :style="`transform: rotateY(${titleComput(137.1,'+')}deg);`">测试环绕文字2</div></div><div class="home-title home-title6" :style="`transform: translateY(-2px) translateZ(810px) rotateY(${theta + 307.5}deg) scale(1);`"><div :style="`transform: rotateY(${titleComput(307.5,'+')}deg);`">测试环绕文字4</div></div><div class="home-title home-title7" :style="`transform: translateY(-2px) translateZ(810px) rotateY(${theta + 338}deg) scale(1);`"><div :style="`transform: rotateY(${titleComput(338,'+')}deg);`">测试环绕文字5</div></div><div class="home-title home-title8" :style="`transform: translateY(-2px) translateZ(810px) rotateY(${theta + 272}deg) scale(1);`"><div :style="`transform: rotateY(${titleComput(272,'+')}deg);`">测试环绕文字3</div></div></div><div class="home-cirque"><div class="home-cirque-hidden"><div class="home-cirque-div" :style="`transform: rotateX(76deg) rotateZ(${theta * -1}deg);`"></div></div></div><div class="home-ellipse" @mousedown="turnDown" @mousemove="turnMove"><div :style="`transform: translateZ(800px) rotateY(${theta + item.num}deg);`" :class="`home-dot home-dot${item.index}`" v-for="item in dotList" :key="item.index"><div class="home-dot-line" :style="`transform: rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);height:${scaleFun(item)==1.3?93:64}px;`"></div><div :style="`transform: rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);`" class="home-dot-box"></div><div :style="`transform:translateZ(1px) translateX(-50%) rotateY(${item.index==10?(theta*-1):rotateYfun(item.num)}deg);`" :class="`home-list home-list${item.index}`"><div :style="`transform: translateX(-50%) translateY(${scaleFun(item)==1.3?-50:0}%);`" :class="scaleFun(item)==1.3?'home-list-active':'home-list-bg'">{{ item.title }}</div></div></div></div></div></div>
</template>
<script>
export default{data(){return{isdown:false,startX:0,startY:0,upspin:0,theta:-0.5,  //一版本每个点位角度32.7  现在是27.8dotList:[{ index:10, num:0,title:'点位文字1'},{ index:11, num:32.7,title:'点位文字2'},{ index:1, num:65.4,title:'点位文字3'},{ index:2, num:98.1,title:'点位文字4'},{ index:3, num:130.8,title:'点位文字5'},{ index:4, num:163.5,title:'点位文字6'},{ index:5, num:196.2,title:'点位文字7'},{ index:6, num:228.9,title:'点位文字8'},{ index:7, num:261.6,title:'点位文字9'},{ index:8, num:294.3,title:'点位文字10'},{ index:9, num:327,title:'点位文字11'},],isItem:{}}},mounted(){},methods:{titleComput(data,symbol){if(symbol=='-'){return ((Math.abs(this.theta - data) % 360>100)&&(Math.abs(this.theta - data) % 360<300)?180:0)}else{return ((Math.abs(this.theta + data) % 360>100)&&(Math.abs(this.theta + data) % 360<300)?180:0)}},rotateYfun(data){return (this.theta + data)<=0?Math.abs(this.theta + data):(-1 * Math.abs(this.theta + data))},scaleFun(data){if((Math.abs(this.theta + data.num)%360)<=10||(Math.abs(this.theta + data.num)%360)>=350){this.isItem = data.num}return (Math.abs(this.theta + data.num)%360)<=7||(Math.abs(this.theta + data.num)%360)>=353?1.3:1},turnDown(e){this.isdown = truethis.startX = e.clientXthis.startY = e.clientY},async turnMove(e){if(this.isdown){this.theta = (this.upspin + (e.clientX - this.startX) / 10) % 360}},turnUp(){this.isdown = falsethis.upspin = this.theta// 计算if((Math.abs(this.theta + this.isItem)%360)<=7||(Math.abs(this.theta + this.isItem)%360)>=353){this.theta = 0-this.isItemthis.upspin = this.theta}}}
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源 AI 智能名片 S2B2C 商城小程序在现代商业中的创新与启示

摘要&#xff1a;本文通过分析一种以 9.9 元裙子为代表的独特商业模式&#xff0c;探讨了其背后的现金流、产品和渠道组合策略&#xff0c;以及开源 AI 智能名片 S2B2C 商城小程序在其中可能发挥的作用和带来的启示。 一、引言 在当今竞争激烈的商业环境中&#xff0c;企业不断…

认知杂谈41

今天分享 有人说的一段争议性的话 I I 贫富根源在观念 I 你知道不&#xff1f;穷人穷啊&#xff0c;好多时候是因为他们自己还有家里好几代人呢&#xff0c;都陷在一种不对的想法里出不来&#xff0c;还觉得这样挺好&#xff0c;就一直这么过下去了。可富人的那些想法呢&am…

3127.构造相同颜色的正方形

1.题目描述 给你一个二维 3 x 3 的矩阵 grid &#xff0c;每个格子都是一个字符&#xff0c;要么是 B &#xff0c;要么是 W 。字符 W 表示白色&#xff0c;字符 B 表示黑色。 你的任务是改变 至多一个 格子的颜色&#xff0c;使得矩阵中存在一个 2 x 2 颜色完全相同的正方形。…

YOLO实践

一. 环境安装 参考视频 Pytorch环境安装细节 pytorch安装&#xff1a;一个单独的环境中&#xff0c;能使用pip就尽量使用pip&#xff0c;实在有问题的情况&#xff0c;例如没有合适的编译好的系统版本的安装包&#xff0c;再使用conda进行安装&#xff0c;不要来回混淆CUDA是…

数据结构---顺序表---单链表

目录 一、什么是程序&#xff1f; 程序 数据结构 算法 二、一个程序是否优秀的两个标准 2.1.时间复杂度 2.2.空间复杂度 三、数据结构 3.1.数据结构间的关系 1.逻辑结构 1&#xff09;线性关系 2&#xff09;非线性关系 2.存储结构 1&#xff09;顺序存储结构 …

exit_hook和setcontext

文章目录 exit_hook概述例题:思路:利用:setcontextglibc-2.27以及 之前glibc-2.29以及之后:exit_hook 概述 大佬文章:exit_hook在pwn题中的应用 - 不会修电脑 - 博客园 (cnblogs.com) exit_hook :是程序在执行exit函数时,会去该位置拿一个函数指针,进而执行的一段程序…

【单片机开发】IAP技术详解及应用

【前言】 在单片机开发过程中&#xff0c;程序的烧录是一个至关重要的环节。随着技术的不断演进&#xff0c;单片机烧录方式也日益多样化。 【单片机开发】单片机的烧录方式详解&#xff08;ICP、IAP、ISP&#xff09;-CSDN博客文章浏览阅读775次&#xff0c;点赞14次&#x…

低空经济概念火爆:无人机飞手人才培养先行

随着科技的飞速发展&#xff0c;低空经济作为新兴的经济形态&#xff0c;正以前所未有的速度崛起&#xff0c;成为推动产业升级和经济发展的新引擎。无人机作为低空经济的重要组成部分&#xff0c;其应用领域已从最初的军事侦察、航拍扩展到农业植保、物流配送、环境监测、应急…

Question mutiple pdf‘s using openai, pinecone, langchain

题意&#xff1a;使用 OpenAI、Pinecone 和 LangChain 对多个 PDF 文件进行提问。 问题背景&#xff1a; I am trying to ask questions against a multiple pdf using pinecone and openAI but I dont know how to. 我正在尝试使用 Pinecone 和 OpenAI 对多个 PDF 文件进行提…

【计算机组成原理】计算机系统的层次结构——计算机软件

计算机系统的层次结构 导读一、计算机软件的分类二、计算机语言三、计算机系统的层次结构3.1 从计算机语言的角度来理解多级层次结构3.2 计算机层次之间的关系3.3 指令集体系结构&#xff08;ISA&#xff09; 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&a…

市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1

目录 一、简介 二、TFT-LCD驱动系统概述 &#xff08;一&#xff09;系统概述 &#xff08;二&#xff09;设计要点 二、扫描驱动电路设计 &#xff08;一&#xff09;概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 &#xff08;二&#xff09…

多目标应用:基于MOPSO的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

Ubuntu上qt使用SSH样式表

SSH样式表 如果学习过web的同学都知道&#xff0c;我们在学习HTML的时候会用到样式表&#xff0c;我们使用它来更改我们的颜色、大小、背景等等。上到后面&#xff0c;老师会说&#xff1a;我们如果在HTML文件中编辑太多的样式&#xff0c;就会让代码看起来非常的繁琐&#xf…

学习计算机网络

a类0~127&#xff0c;b类128~191&#xff0c;c类192~223 网络地址&#xff1a;看子网掩码&#xff0c;分网络位和主机位&#xff0c;后面是主机位&#xff0c;主机位全部为0&#xff0c;网络地址。 直接广播地址&#xff1a;看子网掩码&#xff0c;分网络位和主机位&#xff…

自建一款开源音乐服务-Navidrome

自建一款开源音乐服务-Navidrome Navidrome&#xff0c;一个开源的音乐服务器和播放器&#xff0c;提供了一个优雅且功能丰富的解决方案&#xff0c;让你的音乐库无论在何处都能触手可及。本文将带你一步步搭建自己的Navidrome音乐服务器&#xff0c;让你的音乐生活更加自由和…

【Qt】关于QMenuBar创建方式的讨论

关于QMenuBar创建方式的讨论 如果在创建项目的时候&#xff0c;没有勾选自动生成ui文件&#xff0c;此时上述代码是正确的&#xff1b;而如果勾选了自动生成ui文件&#xff0c;上述代码则会出现内存泄漏的问题。因为Qt已经生成了一个QMenuBar了 由于之前程序已经自己创建好了一…

STM32 系列MCU 开发利器 STM32CubeIDE

前言 由于自己接触较多的 ARM 系列芯片主要是 STM32 系列的&#xff0c;接触过 STM32 F1、F4、L4、H7 等几个系列&#xff0c;使用的 开发工具&#xff0c;主要是 Keil MDK5、IAR&#xff0c;所以也比较关注开发工具的使用。 Keil MDK5、IAR 属于商用收费的功能强大的IDE&…

【MATLAB】matlab生成的图像如何导出(三种方法教会你)

我们经常使用matlab生成各类的图&#xff0c;如何将其导出&#xff0c;导出为何种类型。 方法一&#xff1a;选择 matlab 生成的图形界面 " Figure 1 " 的菜单栏 " 编辑 " — " 复制图窗 " , 就可以将图像拷贝到 Word 文档中 打开 Word 文档 ,…

单片机编程魔法师-消息处理

消息机制 消息处理的编程思路是当某件事产生后只发送一条事件产生消息以通知相应执行机构执行的一种编程思路。 消息定义 什么是消息&#xff0c;消息是一个指示&#xff0c;可以是数字&#xff0c;字符串&#xff0c;字符或者是任何形式的其他标识符 消息定义的形式与消息…

简易的 Websocket + 心跳机制 + 尝试重连

文章目录 演示大纲基础 WebSocket前端: 添加心跳机制前端: 尝试重新连接历史代码 还没有写完&#xff0c;bug 是有的&#xff0c;我在想解决办法了… 演示 大纲 基础的 webSocket 连接前后端&#xff1a;添加心跳机制后端无心跳反应&#xff0c;前端尝试重新连接设置重新连接…