vue项目中实现3D万花筒和3D文字旋转效果

一、万花筒

 

        1、html部分 

//万花筒html
<div class="carousel" data-gap="368"><figure><div class="carouselItem" v-for="(item,index) in exhibitionList" :key="index"><div class="itemContent" :class="`cardBg${index+1}`" @click="toExhibitionHall(item)" @mouseenter="showEnterprise(item)"><h6>{{item.name}}</h6><p :title="item.des">{{item.des}}</p></div></div></figure>
</div>

        2、js部分

mounted() {this.cardRotate();
},
methods: {// 卡片旋转cardRotate(){let that = this;carousel();var xdeg = 0;this.timer = setInterval(function() {xdeg = xdeg + 0.3;$('figure').css('transform', "rotateY(" + (-xdeg) + "deg)");}, 20);function carousel(){var figure = $("figure"),items = $(".carouselItem"),n = items.length,theta = 2 * Math.PI / n,currImage = 0;setUpCarousel(n, items.width());function setUpCarousel(n, s) {let padg = window.screen.width / 1920 * $(".carousel").attr("data-gap");var apothem = s / (2 * Math.tan(Math.PI / n));figure.css('transformOrigin', '50% 50% ' + (-apothem) + 'px');items.css("padding", "20px " + padg + "px 0");for (var i = 1; i < n; i++) {items.eq(i).css({'transformOrigin': '50% 50% ' + (-apothem) + 'px','transform': 'rotateY(' + i * theta + 'rad)',});}rotateCarousel(currImage);}function rotateCarousel(index) {figure.css({"transform": "rotateX(0deg) rotateY(" + index * -theta + "rad)"});}// 暂停启动定时器$(".carousel").mouseleave(function() {that.timer = setInterval(function() {xdeg = xdeg + 0.3;$('figure').css('transform', "rotateY(" + (-xdeg) + "deg)");}, 20);})$(".carousel").mouseenter(function() {clearInterval(that.timer);})// $(".prev").click(() => {//     currImage--;//     rotateCarousel(currImage);// })// $(".next").click(() => {//     currImage++;//     rotateCarousel(currImage);// })}},
},

        3、css部分

.carousel {width: 26.75rem;height: 13rem;// perspective: 700px;overflow: hidden;display: flex;flex-direction: column;align-items: center;position: absolute;bottom: 3.5rem;left:50%;transform: translateX(-50%);z-index: 4;
}
.carousel figure {margin: 0;// width: 1070px;transform-style: preserve-3d;transition: transform 0.5s;
}.carouselItem {width: 100%;height: 11.55rem;box-sizing: border-box;cursor: pointer;z-index: 1;// -webkit-box-reflect: below 20px -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, .5) 100%);
}.itemContent {width: 100%;height: 100%;padding: 5.8rem 1.7rem 0;box-sizing: border-box;color:#fff;h6{font-weight: bold;font-size: .65rem;line-height: .65rem;margin-bottom:.4rem;text-align: center;}p{font-size: .45rem;font-weight: 400;text-align: center;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}
}
.cardBg1{background: url(~img/cardBg1.png) no-repeat center / 100% 100%;
}
.cardBg2{background: url(~img/cardBg2.png) no-repeat center / 100% 100%;
}
.cardBg3{background: url(~img/cardBg3.png) no-repeat center / 100% 100%;
}
.cardBg4{background: url(~img/cardBg4.png) no-repeat center / 100% 100%;
}
.cardBg5{background: url(~img/cardBg5.png) no-repeat center / 100% 100%;
}
.cardBg6{background: url(~img/cardBg6.png) no-repeat center / 100% 100%;
}.carouselItem:not(:first-of-type) {position: absolute;left: 0;top: 0;
}

二、文字旋转

         1、html部分  

<div class="textCricle1"><canvas id="canvas1" width="1310" height="1310" style="width: 100%;height: 100%;"></canvas>
</div>
<div class="textCricle2"><canvas id="canvas2" width="1550" height="1550" style="width: 100%;height: 100%;"></canvas>
</div>
<div class="textCricle3"><canvas id="canvas3" width="1790" height="1790" style="width: 100%;height: 100%;"></canvas>
</div>

         2、js部分

mounted() {this.textMove();
},
methods: {// 环形文字textMove(){let canvas1 = document.getElementById('canvas1'),fill1 = 'rgba(0, 168, 255, 0.8)',stroke1 = 'rgba(0, 168, 255, 0.8)';this.canvasDraw(canvas1, fill1, stroke1)let canvas2 = document.getElementById('canvas2'),fill2 = 'rgba(0, 168, 255, 0.2)',stroke2 = 'rgba(0, 168, 255, 0.2)';this.canvasDraw(canvas2,fill2,stroke2)let canvas3 = document.getElementById('canvas3'),fill3 = 'rgba(0, 168, 255, 0.1)',stroke3 = 'rgba(0, 168, 255, 0.1)';this.canvasDraw(canvas3,fill3,stroke3)},// canvas绘制文字canvasDraw(dom,fill,stroke){let context = dom.getContext('2d'),TEXT_FILL_STYLE = fill,TEXT_STROKE_STYLE = stroke,TEXT_SIZE = 30,circle = {x: dom.width / 2,y: dom.height / 2,radius: (dom.width / 2) - 20,},startAngle = Math.PI*2+Math.PI/2,endAngle = Math.PI/60+Math.PI/2,text = '0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101';/*** 绘制环形文字* @param{string} string 传入的文字* @param startAngle 起始角* @param endAngle 末尾角*/let drawCircularText = (string, startAngle, endAngle) => {let radius = circle.radius,angleDecrement = (startAngle - endAngle) / (string.length - 1),angle = parseFloat(startAngle),index = 0,character;context.save();context.fillStyle=TEXT_FILL_STYLE;context.strokeStyle=TEXT_STROKE_STYLE;context.font=TEXT_SIZE+'px Lucida Sans';while(index < string.length){//获取传入的字符串的每个字符character = string.charAt(index);context.save();context.beginPath();//位移到每个字符的指定位置context.translate(circle.x+Math.cos(angle)*radius,circle.y - Math.sin(angle)*radius);//旋转坐标系到每个字符应该达到到角度context.rotate(Math.PI/2-angle);context.fillText(character,0,0);context.strokeText(character,0,0);//角度递减angle -= angleDecrement;index++;context.restore();}};//Initlet init=(startAngle,endAngle)=>{context.textAlign='center';context.textBaseline='middle';drawCircularText(text,startAngle,endAngle);};init(startAngle,endAngle);}
},

        3、css部分

.textCricle1{position: absolute;bottom:2rem;left:50%;width:32.75rem;height:32.75rem;transform: translate(-50%, 38%) rotateX(77deg);z-index: 1;#canvas1{animation: rotate 80s infinite linear;}
}.textCricle2{position: absolute;bottom:2rem;left:50%;width:38.75rem;height:38.75rem;transform: translate(-50%, 40%) rotateX(78deg);z-index: 1;#canvas2{animation: rotate 80s infinite linear;}
}.textCricle3{position: absolute;bottom:2rem;left:50%;width:44.75rem;height:44.75rem;transform: translate(-50%, 41%) rotateX(79deg);z-index: 1;#canvas3{animation: rotate 80s infinite linear;}
}
@keyframes rotate {0% { transform: rotate(0deg); }50% { transform: rotate(-180deg); }100% { transform: rotate(-360deg); }
}

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

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

相关文章

青翼科技自主研发4路AD子卡FMC137

FMC137是一款基于VITA57.4标准规范的JESD204B接口FMC子卡模块&#xff0c;该模块可以实现4路14-bit、2GSPS/2.6GSPS/3GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9208芯片&#xff0c;&#xff0c;与ADI公司的AD9689可以实现PIN脚兼容。该ADC与FPGA的主机接口通过16通道的…

如何用smardaten无代码平台进行复杂逻辑编排?

目录 1、前言2、复杂逻辑编排是什么&#xff1f;3、服务编排-进销存&#xff08;1&#xff09;业务说明&#xff08;2&#xff09;设计说明1&#xff09;数据库设计2&#xff09;表单设计3&#xff09;列表设计4&#xff09;逻辑设计4.1 逻辑控制设计4.2 服务编排设计 4、使用体…

阿里云EMAS超级App助力Agmo电动车超级应用程序发布

近日&#xff0c;阿里云宣布与马来西亚本土数字方案专家Agmo控股&#xff08;Agmo Holdings Berhad&#xff0c;简称Agmo&#xff09;展开合作&#xff0c;签署谅解备忘录&#xff0c;联手推出马来西亚首个Agmo电动车超级应用程序。此次合作也标志着阿里云在中国以外的市场首次…

[QT编程系列-21]:基本框架 - QT常见数据结构:QString、QList、QVector、QMap、QHash、QSet、QPair详解

目录 1 QString 2 QList 3 QVector 4 QMap 5 QHash 6 QSet 7 QPair 1 QString QString是Qt中用于存储和操作字符串的类。它提供了丰富的字符串处理方法和功能。 以下是QString的一些主要特点和常用操作&#xff1a; 创建QString对象&#xff1a; QString str "H…

Activity引擎(初次学习与总结梳理全记录,包括易混淆知识点分析,常用报错解决方案等)

最近工作需要使用Acticity框架处理审批业务&#xff0c;简单了解后能虽能很快的上手&#xff0c;但是对于Activity的整体认识并不够&#xff0c;特此花费很多精力全面的学习并记录。包含对很多的概念的第一次理解过程&#xff1b;对知识点的混淆地方的梳理&#xff1b;对实践过…

ArcGIS一张图的制作过程

来源&#xff1a;GIS荟 数据 首先&#xff0c;第一步是数据的准备和处理&#xff0c;这里没什么好说的。 使用的所有数据都是在网上下载的 OSM 数据。 第一步 主视觉 为了更好的说明该地图的完整操作过程&#xff0c;同时又要有条理、比较好理解&#xff0c;所以我采用拆分…

Alvas.Audio v2019 Crack

Alvas.Audio v2019 Crack 该库使C#和VB.Net程序员能够创建执行&#xff08;包括混合声音信息&#xff09;、捕获、转换和编辑音频的应用程序。 阿尔瓦斯。音频是C#音乐库。网络程序员。 这使你能够生产。NET程序&#xff0c;例如Winforms/WPF/Windows服务/控制台录音机、Int…

设计模式 ~ 单例模式

单例模式 单例模式是一种设计模式&#xff0c;指在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff1b; 前端对于单例模式不常用&#xff0c;但是单例的思想无处不在&#xff1b; 创建之后缓存以便继续使用&#xff1b; 如&#xff1a;弹窗、遮罩…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定&#xff0c;需要制作棋盘格&#xff0c;无奈其电脑有些卡&#xff0c;对此毫无经验的博主从头开始安装&#xff08;此前博主已经安装了ROS环境&#x…

10.Ceph接口使用

文章目录 Ceph接口使用CephFS文件系统服务端添加mds服务创建存储池授权用户权限 客户端前期准备客户端挂载方式一&#xff1a;基于内核方式二&#xff1a;基于 fuse 工具 Ceph 块存储系统 RBD 接口服务端创建存储池和镜像管理镜像 客户端镜像挂载快照管理快照分层快照展平镜像的…

从小白到大神之路之学习运维第61天--------Ansible自动化运维工具(playbook配置文件深入了解)

第三阶段基础 时 间&#xff1a;2023年7月14日 参加人&#xff1a;全班人员 内 容&#xff1a; playbook配置文件 目录 playbook配置文件 一、playbook配置文件概念 修改hosts文件 建立playbook配置文件 yml脚本写法注释&#xff1a; 二、Playbook的核心元素 三、…

Docker基本概念

1、容器化 如何确保应用能够在开发环境和生产环境中运行和通过质量检测&#xff1f;并在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案&#xff1a;使用容器&#xff0c;Docker之所以发展如此&#xff0c;是因为它…