vue css box-shadow transition实现类似游戏中的模糊圈游走的感觉

先看效果:

在这里插入图片描述
在这里插入图片描述

代码如下:

<template><div style="height: 800px"></div><divclass="rainbow-position"ref="host"><divv-for="config in colorStyles"class="one-shadow":style="config"></div></div>
</template><script>
const rainbowColorsBlue = [{heightScale: 0.5,color: '#5cf7ff',},{heightScale: 0.3,color: '#5c9cff',leftOffset: -0.1,},{heightScale: 1,color: '#5275ff',leftOffset: -0.1,blurScale: 1.5,topOffset: -0.5,},{heightScale: 0.3,color: '#a581ff',},
];
// 这个其实没用到
const rainbowColorsGreen = [{heightScale: 0.5,color: '#d5c240',},{heightScale: 0.3,color: '#c2d540',leftOffset: -0.1,},{heightScale: 1,color: '#5ed540',leftOffset: -0.1,blurScale: 1.5,topOffset: -0.5,},{heightScale: 0.3,color: '#5cf7ff',},
];export default {name: 'app',data() {return {originColors: [],nowColors: [],posConfigs: [],  // [{top, left, height, blurW},{top, left, height, blurW}]colorStyles: [], // 其实就是为了动态获取这些值 [{left: , top:, height:, box-shadow:, -moz-box-shadow: , -webkit-box-shadow: }]loopTimer: null,colorTimer: null,themeColor: 'blue',// themeColor: 'green',};},created() {this.nowColors =this.themeColor === 'blue'? [...rainbowColorsBlue]: [...rainbowColorsGreen];this.originColors = [...this.nowColors];this.nowColors.push(this.nowColors.shift()); // shift()删除第一个},mounted() {clearTimeout(this.loopTimer);this.loopPosFn();clearTimeout(this.colorTimer);this.loopColorFn();},beforeDestroy() {clearTimeout(this.loopTimer);clearTimeout(this.colorTimer);},methods: {loopPosFn() {this.getPosConfigs();this.calcStyles();let timeout = (1 + (Math.random() - 0.5) * 0.4) * 1000; // 0.8到1.2秒之间this.loopTimer = setTimeout(() => {  // 死循环调用this.loopPosFn();}, timeout);},loopColorFn() {this.nowColors.unshift(this.nowColors.pop());this.calcStyles();let timeout = (1 + (Math.random() - 0.5) * 0.3) * 1000;this.colorTimer = setTimeout(() => {this.loopColorFn();}, timeout);console.log("this.colorStyles", this.colorStyles);},getPosConfigs() {let cfgs = [];this.originColors.forEach((color, i) => {cfgs.push(this.getPosConfig(color, i, this.originColors));});this.posConfigs = cfgs;},getPosConfig(colorCfg, index, array) {if (!this.$refs.host) {return;}let { clientWidth, clientHeight } = this.$refs.host;// console.log("clientWidth, clientHeight", clientWidth, clientHeight)  // width:100%,这里的100%需要换成像素即可,  clientHeight为0因为设置的height=0let spanW = 1 / array.length;  // 1/4=0.25// ~ 1 左右移动范围,确定一个leftlet baseLeft = (index + 1) / (array.length + 1); // (0.2, 0.8)let leftOffset = (Math.random() - 0.5) * 0.6 * spanW;  // (-0.075, 0.075)if (colorCfg.leftOffset) {leftOffset += colorCfg.leftOffset;}let left = (baseLeft + leftOffset) * clientWidth;// ~ 2 确定扩散宽度 水平let blurScale = spanW * ((Math.random() - 0.5) * 0.2 + 0.55); // 0.25*(0.45, 0.65)if (colorCfg.blurScale) {blurScale *= colorCfg.blurScale;}let blurW = blurScale * clientWidth;  //// console.log("blurW", blurW)// ~ 3 高度范围,确定heightlet heightScale = 3 + (Math.random() - 0.5) * 0.6;if (colorCfg.heightScale) {heightScale *= colorCfg.heightScale;}let height = heightScale * clientHeight;  // 0 因为clientHeight=0// console.log("height", height)// ~ 4 上下移动范围,确定toplet topOffset = (Math.random() - 0.5) * 0.6;if (colorCfg.topOffset) {topOffset += colorCfg.topOffset;}let top = topOffset * clientHeight;// console.log("top", top); // 0return {left,top,height,blurW,};},calcStyles() {let styles = [];this.posConfigs.forEach((pos, i) => {try {let color = this.nowColors[i].color;let { left, top, height, blurW } = pos;let shadow = `0 0 ${blurW}px ${blurW / 2}px ${color}`;styles.push({left: `${left}px`,top: `${top}px`,height: `${height}px`,'box-shadow': shadow,'-moz-box-shadow': shadow,'-webkit-box-shadow': shadow,});} catch (err) {}});this.colorStyles = styles;},},
};
</script><style lang="less" scoped>
.rainbow-position {position: relative;width: 1000px;.one-shadow {position: absolute;transition: all 1.2s linear;}
}
</style>

本质上还是操作box-shadow的值以及绝对定位中left的值

在这里插入图片描述

[{"left": "192.8242165893445px","top": "0px","height": "0px","box-shadow": "0 0 135.25323349796668px 67.62661674898334px #5c9cff","-moz-box-shadow": "0 0 135.25323349796668px 67.62661674898334px #5c9cff","-webkit-box-shadow": "0 0 135.25323349796668px 67.62661674898334px #5c9cff"},{"left": "296.2928408628739px","top": "0px","height": "0px","box-shadow": "0 0 149.301217974191px 74.6506089870955px #5275ff","-moz-box-shadow": "0 0 149.301217974191px 74.6506089870955px #5275ff","-webkit-box-shadow": "0 0 149.301217974191px 74.6506089870955px #5275ff"},{"left": "476.47387807345px","top": "0px","height": "0px","box-shadow": "0 0 188.3680661548236px 94.1840330774118px #a581ff","-moz-box-shadow": "0 0 188.3680661548236px 94.1840330774118px #a581ff","-webkit-box-shadow": "0 0 188.3680661548236px 94.1840330774118px #a581ff"},{"left": "812.9763044334327px","top": "0px","height": "0px","box-shadow": "0 0 116.1677125622857px 58.08385628114285px #5cf7ff","-moz-box-shadow": "0 0 116.1677125622857px 58.08385628114285px #5cf7ff","-webkit-box-shadow": "0 0 116.1677125622857px 58.08385628114285px #5cf7ff"}
]

box-shadow的语法

box-shadow: h-shadow v-shadow blur spread color inset;
注意:boxShadow 属性把一个或多个下拉阴影添加到框上。该属性是一个用逗号分隔阴影的列表,每个阴影由 2-4 个长度值、
一个可选的颜色值和一个可选的 inset 关键字来规定。省略长度的值是 0。值	                   说明
h-shadow	           必需的。水平阴影的位置。允许负值
v-shadow	           必需的。垂直阴影的位置。允许负值
blur	               可选。模糊距离
spread	               可选。阴影的大小
color	               可选。阴影的颜色。在CSS颜色值寻找颜色值的完整列表
inset	               可选。从外层的阴影(开始时)改变阴影内侧阴影

例如:看下面的效果是不是有那个味,还可以把盒子弄小点,比如高度为0

在这里插入图片描述

盒子高度为0的效果:

在这里插入图片描述

然后让盒子动起来,即通过定时更改盒子的颜色和位置即可做到 transition: all 1.2s linear;再加一个定时器setInterval()即可

代码如下:

<template><div style="height: 800px;background-color: pink; overflow: hidden"><div style="width:100px; height:0; margin: 200px auto; box-shadow: 0 0 135.25323349796668px 67.62661674898334px #5c9cff"></div></div></template><script>export default {name: '',data() {return {};},
};
</script><style lang="less" scoped>
</style>

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

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

相关文章

欧拉计划启航篇(一)

目录 1.什么是欧拉计划 2.简单介绍 3.访问不上去怎么办 4.第一题的代码编写 5.代码的优化 1.什么是欧拉计划 欧拉计划是和我们的数学知识相关的一个网站&#xff0c;但是这个网站上面的相关的问题需要我们去使用编程的知识去进行解决&#xff0c;因此这个适合对于想要提升…

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次&#xff0c;点赞17次&#xff0c;收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明&#xff1a;简单的布局组件&#xff0c;可容纳其他组件&#xff0c;并依据alignment属性精确指定内部组件的对…

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

Ubuntu离线安装Docker容器

前言 使用安装的工具snap安装在沙箱中&#xff0c;并且该沙箱之外的权限有限。docker无法从其隔离的沙箱环境访问外部文件系统。 目录 前言准备环境卸载已安装的Docker环境快照安装的Dockerapt删除Docker 安装docker-compose下载执行文件将文件移到 /usr/local/bin赋予执行权限…

【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData

组件继承于IBufferElementData&#xff0c;可以让一个实体拥有多个相同的组件。 using Unity.Entities;public struct MyBuffComponentData : IBufferElementData {public int num; }using System.Collections; using System.Collections.Generic; using UnityEngine; using U…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

背景 接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771 OS还是比较庞大&#xff0c;且上面搭载了Nsh&#xff08;Nuttx Shell&#xff09;&#xff0c;需要接入串口才能正常工作&#xff0c;一般调试的时候用&#xff0c;非调试…

学习 Python 编程的规则与风格指南

文章目录 1. Python 编程规则1.1 Python 的哲学&#xff1a;The Zen of Python1.2 遵守 PEP 81.3 Python 是大小写敏感的1.4 使用 Pythonic 风格 2. Python 编程风格2.1 命名风格2.2 注释风格2.3 文档字符串&#xff08;Docstring&#xff09;2.4 空格使用2.5 文件和代码组织 3…

Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】

在分布式事务中&#xff0c;Seata 的 AT 模式&#xff08;Automatic Transaction&#xff09;是一种基于两阶段提交协议的事务模式。它通过自动生成数据快照&#xff08;before image 和 after image&#xff09;&#xff0c;实现了对分布式事务的高效管理。本文将详细解析 Sea…

中关村科金外呼机器人智能沟通破解营销难题

当今&#xff0c;传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性&#xff0c;难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员&#xff0c;成为企业的难题。中关村科金外呼机器人通过智能化沟通技术&#xff0c;为企业提供了一站…

旅游景点票价预测02

5.数据预处理 经过4的数据分析环节&#xff0c;我们得出了一些和目标特征‘price’关联度比较高的特征&#xff0c;现在将这些特征列进行提取 df.head(5)# 筛选对应的数据列 rs_df df[[price,comment,sight_comment_score,level,city,address]] # 判断是否有缺失值 rs_df.isnu…

“事务认证平台”:个人日常事务管理系统的诚信体系建设

3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统&#xff0c;属于开放式的平台&#xff0c;所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求&#xff0c;…

单片机与MQTT协议

MQTT 协议简述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布 / 订阅&#xff08;publish/subscribe&#xff09;模式的 “轻量级” 通讯协议&#xff0c;该协议构建于 TCP/IP 协议上&#xf…

小程序基础 —— 07 创建小程序项目

创建小程序项目 打开微信开发者工具&#xff0c;左侧选择小程序&#xff0c;点击 号即可新建项目&#xff1a; 在弹出的新页面&#xff0c;填写项目信息&#xff08;后端服务选择不使用云服务&#xff0c;开发模式为小程序&#xff0c;模板选择为不使用模板&#xff09;&…

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

“拍卖认证平台”:网上拍卖系统的诚信体系建设

2.1 B/S结构介绍 在早期&#xff0c;一些使用HTML语言编写的文件&#xff0c;再集合一些其它资源文件就可以组成一个最简单的Web程序&#xff0c;了解了Web程序也需要了解Web站点&#xff0c;它们之间的关系就是一个或者多个Web程序可以放在Internet上的一个Web站点&#xff08…

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

&#xff1a;羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言&#xff1a; 在当今数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师&#xff0c;…

C++:单例模式

创建自己的对象&#xff0c;同时确保对象的唯一性。 单例类只能有一个实例☞静态成员static☞静态成员 必须类外初始化 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 静态成员类内部可以访问 构造函数私有化☞构造函数私有外部不能创建&#x…