[vue3+js]实现3d旋转效果

1. 实现效果图:

2.实现代码:

css:

<style lang="scss" scoped>
    .bottomContainer{
        width: 1200px;
        height: 400px;
        display: flex;
        justify-content: center;
        position: relative;
        margin:200px auto;
        align-items: center;
        // background-image: url("@/assets/image/test/rote_center_bg.png");
        
        background-size: 100% 100%;
        background-repeat: no-repeat;
        background-position: center;

        
        .bottomboxtest{
            position: absolute;
            width: 1000px;
            height: 1000px;
            background:radial-gradient(rgba(181, 214, 243, 0.5) 30%, rgb(108, 165, 230) 80%);
            left: 50%;
            margin-left: -500px;
            transform: rotateX(90deg);
            margin-top: -300px;
            border-radius: 50%;
        }
        .arrow-img {
            position: absolute;
            width: 22px;
            height: 22px;
            // top: calc(50% + 60px);
            top:calc(50% - 66px);
            cursor: pointer;
            z-index: 10;

            &.left {
                left: 40px;
            }

            &.right {
                right: 40px;
            }
        }
        .device-list-container{
            // position: absolute;
            display: flex;
            transform-style: preserve-3d;
            // transform: rotateX(-20deg);
            transform: rotateX(-10deg);
            width: 940px;
            height: 200px;
            .device-list {
                position: absolute;
                transform-origin: center center;
                transform-style: preserve-3d;
                transform: rotateY(-8deg);
                transition: all .8s;
                // margin-top: 75px;
                width: 940px;
                height: 400px;
                // left: 10%;
                left: -10px;
                display: flex;
                justify-content:center;
                .device-item {
                    position: absolute;
                    font-size: 16px;
                    color: #FFFFFF;
                    text-align: center;
                    margin-top: 10px;
                    .iconBox{
                        width: 80px;
                        height: 80px;
                        margin:0 auto;
                        // background: radial-gradient( circle, #E2F1FF,#A8D4FD);
                        background: #A8D4FD;

                        border-radius: 50%;
                        border: 2px solid #E5F2FF;
                        text-align: center;
                        line-height: 80px;
                        .roateIcon{
                            color:#58A0F5;
                            font-size: 32px;
                        }
                    }

                    .groupName {
                        color:#2E5480;
                        font-size: 16px;
                        margin-top:8px;
                       
                    }

                   
                }
            }    
        }
    }
</style>

html:

<div class="bottomContainer">
            
            <div class="device-list-container">
                <div class="device-list" ref="deviceListRef">
                  <div class="device-item" v-for="(item,index) in roteList">
                   
                    <div class="iconBox">
                        test
                        <!-- <i class="iconfont icon-baojing roateIcon"></i> -->
                    </div>
                    <p class="groupName">test</p>
                    
                  </div>
                  <div class="bottomboxtest"></div>
                </div>
            </div>
            <img class="arrow-img left" src="@/assets/image/test/arrow-left.png" @click="rotate(true)" alt="">
            <img class="arrow-img right" src="@/assets/image/test/arrow-right.png" @click="rotate(false)" alt="">
        </div>

js:

<script setup lang="ts">
    const roteList= ref([
        {},{},{},{},{},{}
    ]);
    const deviceListRef = ref<HTMLDivElement>();
    const imgList = ref<NodeListOf<Element>>();
    let timer: NodeJS.Timer;
    let timeout: NodeJS.Timeout;
    let current = 2;
    let angle = 360 / 4;
    let rotateDeg = 1 ;
    const previewCount = roteList.value!.length;
    onMounted(async () => {
        rotate(true);
    })
    function rotate(isPlus: boolean) {
      imgList.value = imgList.value ?? deviceListRef.value!.querySelectorAll('.device-item');
      const SIZE = imgList.value!.length;
      current += isPlus ? 1 : -1;
      current = (current + SIZE) % SIZE;
      const index = getDisplayCard(current, Math.ceil(previewCount/2), SIZE);
      angle = 360/SIZE;
      rotateDeg -= angle * (isPlus ? 1 : -1);
      deviceListRef.value!.style.transform = `rotateY(${rotateDeg}deg)`;
        // deviceListRef.value!.style.transform = `rotateY(${rotateDeg}deg)`;
      imgList.value!.forEach((v: any, i: number) => {
            (v as HTMLDivElement).style.opacity = '0';
            if (index.includes(i)) {
          (v as HTMLDivElement).style.opacity = '1';
        }
            (v as HTMLDivElement).style.transform = `rotateY(${(i - 2) * angle}deg) translateZ(370px)`;
  })
    
    function getDisplayCard(current: number, num: number, size: number) {
        const offset = Math.trunc(num / 2);
        const res = [current];
        for (let i = 1; i <= offset; i++) {
          const pos1 = current + i;
          const pos2 = current - i < 0 ? current - i + size : current - i;
          res.push(pos1, pos2);
        }
        return res.map(v => v % size);
     }
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

迈向智慧水利新时代:聚焦智慧水利解决方案的核心技术与发展方向,展望其在推动水利行业可持续发展中的重要作用

目录 一、引言 二、智慧水利解决方案的核心技术 1. 物联网技术 2. 大数据与云计算 3. 人工智能与机器学习 4. 区块链技术 三、智慧水利的发展方向 1. 深化技术融合与创新 2. 强化系统集成与协同 3. 提升公众参与与互动 4. 注重生态友好与可持续发展 四、智慧水利在…

5.3.3、二维数组案例-考试成绩统计

代码 #include <iostream> using namespace std; #include <string>int main() {//二维数组案例-考试成绩统计//1、创建二维数组int scores[3][3] {{100,100,100},{90,50,100},{60,70,80},};string names[3] { "张三","李四","王五&quo…

Qt——升级系列(Level Seven):事件、文件

目录 Qt事件 事件介绍 事件的处理 按键事件 鼠标事件 定时器 事件分发器 事件过滤器 Qt文件 Qt文件概述 输入输出设备类 文件读写类 文件和目录信息类 Qt事件 事件介绍 事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所有的 Qt …

STM32 ADC精度提升方法

STM32 ADC精度提升方法 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊量的积累引起质的变化 硬件方法 优化布局布线&#xff0c;尽量减小其他干扰增加电源、Vref去耦电容使用低通滤波器&#xff0c;或加磁珠使用DCDC时尽…

在Android运行时切换Retrofit Base URL:简化开发环境与生产环境的切换

在运行时切换Retrofit Base URL:简化开发环境与生产环境的切换 在Android开发中,Retrofit是一个由Square开发的类型安全的HTTP客户端库。它为API认证和网络请求提供了一个强大的框架。然而,在开发过程中,我们常常需要在不同的环境(如开发环境和生产环境)之间切换Base UR…

2024上半年剧集市场复盘:质增量减之下,腾讯持续领跑

随着2024上半年结束&#xff0c;剧集市场长视频平台的比拼也告一段落了。 总结2024H1阶段的剧集市场&#xff0c;依旧延续了“高质量增长”的发展路线&#xff0c;具体表现在数量上的减少和质量上的提升&#xff0c;“质增量减”成为这一阶段的关键词。 根据灯塔专业版数据&a…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 二(51-)

环境&#xff1a;OpenCV3.2.0 VS2015 51、Mean-Shift算法分割图像 cv::pyrMeanShiftFiltering() 参考链接&#xff1a;【从零学习OpenCV 4】分割图像——Mean-Shift分割算法 Mean-Shift算法又被称为均值漂移法&#xff0c;是一种基于颜色空间分布(彩色图像的像素值)的图像分割…

java框架的落地实践案例:大数据平台设计与实现

使用 java 框架设计和实现大数据平台可为企业提供数据处理和分析解决方案&#xff0c;使之能够做出数据驱动的决策。系统采用微服务架构&#xff0c;分解数据处理任务为松散耦合组件&#xff0c;构建于 spring boot 等 java 框架之上。数据采集通过kafka 进行&#xff0c;数据清…

【原理】随机森林模型是怎么训练的

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、随机森林简介二、随机森林训练原理2.1. 随机森林的训练流程2.2. 随机森林训练的核心代码 用过随机森林的朋友都知道&#xff0c;随机森林是集成决策的一个经典代表&#xff0c;它通过训练多棵决策树&#xf…

1、线性回归模型

1、主要解决问题类型 1.1 预测分析(Prediction) 线性回归可以用来预测一个变量(通常称为因变量或响应变量)的值,基于一个或多个输入变量(自变量或预测变量)。例如,根据房屋的面积、位置等因素预测房价。 1.2 异常检测(Outlier Detection) 线性回归可以帮助识别数…

鸿蒙应用开发-时间屏幕

点击下载源码&#xff1a; https://download.csdn.net/download/liuhaikang/89509449 做一个时间屏幕&#xff0c;可以点击切换白色和黑色&#xff0c;有渐变效果&#xff0c;使用到了鸿蒙的动画效果。 在这个设计中&#xff0c;我们首先引入了通用能力包&#xff0c;以实现功…

将一个立方体对象的值赋给另一个立方体对象

如果对一个类定义了两个或多个对象&#xff0c;则这些同类的对象之间可以互相赋值&#xff0c;或者说&#xff0c;一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。 对象之间的赋值也是通过赋值运算符""进行的。本来&…

MYSQL substring_index

1.substring_index( 参数1,参数2 ,参数3 ) 2.group by 也可以用我们起的别名来划分&#xff0c;以及起别名可以不用as SELECT IF(profile LIKE %female,female,male) gender,COUNT(*) number FROM user_submitGROUP BY gender; 3.切割、截取、删除、替换 select -- 替换法 r…

logback log.info耗时异常,RollingFileAppender+TimeBasedRollingPolicy配置踩坑

我喜欢把核心内容放开头 此次log.info耗时异常升高&#xff0c;是由于日志量过大&#xff08;5G甚至以上&#xff09;&#xff0c;并且使用同步阻塞的RollingFileAppenderTimeBasedRollingPolicy&#xff0c;导致log.info一直等待日志文件滚动&#xff0c;造成了异常。解决方式…

innovus:timing报告的精度如何设置

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 innovus设置timing报告精度常用方法: set_global report_precision 6 report_timing&#xff0c;report_net&#xff0c;report_cell_instance_timing&#xff0c;report_cloc…

记录前端发现问题之 mock接口无返回数据导致所有后续接口调用报错:网络异常

1. 背景 就更新了代码&#xff0c;发现新涉及的页面&#xff0c;切换tab 之后会报错网络异常&#xff0c;再次切换其他没涉及的功能页面&#xff0c;继续报错网络异常 测试环境&#xff1a;纯前端代码&#xff0c;后端是前端mock的数据&#xff0c;仅供demo 2. 问题报错 手动…

如何构建智能聊天系统

聊天分为听、思考、读&#xff0c;简单的通过ASR、LLM、TTS三类模型的组合可以实现&#xff0c;最近openai推出支持多模态的GPT-4o模型&#xff0c;可以把三个模型真正融合成在一起。 现在市面上的模型百花齐放&#xff0c;各有所长。要实现可落地的方案&#xff0c;需要结合业…

ffmpeg在powershell和ubuntu终端下的不同格式

在win10下的powershell中&#xff0c;如果想运行一个exe文件&#xff0c;就不能再像cmd命令行一样用名字来直接运行了&#xff0c;否则会提示格式不对。 正确的做法是&#xff1a; . \ffmpeg.exe -re -i video-test.mpr -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://您的…

模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同

大家好,我是LvZi,今天带来模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同 一.基本概念 模拟算法就是根据题意 模拟出代码的过程,模拟算法的题意往往都很简单,考验的是将思路转化为代码的能力,十分的锻炼代码能力,且能很好…

Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息

摘要&#xff1a; 本文将介绍如何构建一个基于Zigbee和微信小程序的智能家居网关&#xff0c;实现对家居传感器数据的采集、汇总和展示。用户可通过微信小程序实时查看家中温湿度、光照等环境数据&#xff0c;为智能家居系统提供数据支撑。 关键词&#xff1a; Zigbee&#xf…