JavaScript小案例

烟花

html

<body><div id="box"></div><script src="./move.js"></script><script src="./fire.js"></script>
</body>
js代码
fire.js
function Fire(){// 获取box盒子this.box = document.querySelector('#box')  
}
// 火花启动
Fire.prototype.init = function(){// 给box设置样式并绑定点击事件setStyle(this.box,{width:'1000px',height:'600px',background:'#000',border:'10px solid pink',position:'relative'})this.box.onclick = ()=>{// 访问方法创建小烟花this.click()}
}
// 盒子点击创建小烟花
Fire.prototype.click = function(e){// 获取鼠标点击的坐标e = e || window.eventlet x = e.offsetXlet y = e.offsetY// 生成一个小烟花并设置样式let div = document.createElement('div')setStyle(div,{width:'10px',height:'10px',position:'absolute',left:x+'px',bottom:0,background: getColor()})this.box.appendChild(div)// 调用toUP方法让烟花升空this.toUp(div,x,y)
}
Fire.prototype.toUp = function(ele,x,y){move(ele,{top:y},()=>{    this.box.removeChild(ele)// 调用createManyFire方法 在这个位置 生成很多小烟花this.createManyFire(x,y)})
}
// 生成许多小烟花
Fire.prototype.createManyFire = function(x,y){let num = getNum(25,30)// 循环创建多个小烟花for (let i = 0; i < num; i++) {let div = document.createElement('div')// 设置小烟花的样式setStyle(div,{width:'10px',height:'10px',background:getColor(),borderRadius:'50%',position:'absolute',left:x+'px',top:y+'px'})this.box.appendChild(div)// 调用boom方法 让小烟花炸开this.boom(div)    }
}
// 烟花炸开
Fire.prototype.boom = function(ele){move(ele,{left:getNum(0,this.box.clientWidth-ele.clientWidth),top:getNum(0,this.box.clientHeight-ele.clientHeight)},()=>{this.box.removeChild(ele)})
}
// 实例化对象
let fire = new Fire()
fire.init()// 设置元素样式函数
function setStyle(ele,obj){for (const attr in obj) {ele.style[attr] = obj[attr]}
}// 生成随机颜色
function getColor(){let rgb1 = getNum(0,255)let rgb2 = getNum(0,255)let rgb3 = getNum(0,255)return `rgb(${rgb1},${rgb2},${rgb3})`
}// 生成随机数
function getNum(a,b){return Math.floor(Math.random()*(b-a+1))+a
}

move.js

/*** @description:封装运动函数 * @param {Object} ele 运动元素* @param {Object} obj  运动目标属性和值  {left:100,top:300,opacity:0.5}* @param {function} fn 运动结束后执行的函数*/
function move(ele,obj,fn=null){let timerObj = {}for(let attr in obj){let currentStyle = parseInt(getStyle(ele,attr))let target = obj[attr]if(attr == 'opacity'){currentStyle = currentStyle*100target = target*100}timerObj[attr] = setInterval(function(){let speed = (target-currentStyle)/10speed = speed>0?Math.ceil(speed):Math.floor(speed)currentStyle += speedif(currentStyle == target){clearInterval(timerObj[attr])delete timerObj[attr]let k = 0for(let i in timerObj){k++}if(k == 0 ){// 运动结束if(fn){fn()}}        }else{if(attr == 'opacity'){ele.style[attr] = currentStyle/100}else{ele.style[attr] = currentStyle + 'px'}}},30)}
}
/**  * @description: 获取元素属性* @param {Object} ele* @param {string} attr* @return {string}*/
function getStyle(ele,attr){if(window.getComputedStyle){return window.getComputedStyle(ele)[attr];}else{return ele.currentStyle(atrr)}
}

放大镜

html
<div class="box"><div class="middleBox"><img src="./images/middle1.jpg"><div class="shade"></div></div><div class="smallBox"><img src="./images/small1.jpg" middleImg='./images/middle1.jpg' bigImg='./images/big1.jpg' class="active"><img src="./images/small2.jpg" middleImg='./images/middle2.jpg' bigImg='./images/big2.jpg'></div><div class="bigBox"></div></div>

css

*{margin: 0;padding: 0;}
.middleBox{width: 400px;height: 400px;border: 1px solid #000;position: relative;
}
.middleBox img{width: 400px;height: 400px;
}
.shade {width: 200px;height: 200px;background: yellow;position: absolute;left: 0;top: 0;opacity: 0.5;display: none;
}
.shade:hover{cursor: move;
}
.smallBox {margin-top: 10px;
}
.smallBox img {border: 1px solid #000;margin-left: 5px;
}
.smallBox img.active{border-color: red;
}
.box {width: 402px;margin: 50px;position: relative;
}
.bigBox {width: 400px;height: 400px;border: 1px solid #000;position: absolute;top: 0;left: 110%;background-image: url('./images/big1.jpg');background-position: 0 0;background-repeat: no-repeat;background-size: 800px 800px;display: none;
}

js

// 定义一个空构造函数
function Enlarge(){// 获取需要操作的元素并绑定到对象的属性上this.box = document.querySelector('.box')this.middleBox = this.box.querySelector('.middleBox')this.middleImg = this.box.querySelector('.middleBox img')this.shade = this.box.querySelector('.shade')this.smallImgs = this.box.querySelectorAll('.smallBox img')this.bigBox = this.box.querySelector('.bigBox')
}
// 给需要操作的元素绑定事件
Enlarge.prototype.bind = function(){// 中等盒子绑定鼠标移入事件this.middleBox.onmouseover = ()=>{// 鼠标移入显示遮罩层this.shade.style.display = 'block'// 鼠标移动遮罩层移动this.middleBox.onmousemove = ()=>{// 调用移动方法this.move()}}// 中等盒子绑定鼠标移出事件this.middleBox.onmouseleave = ()=>{this.shade.style.display = 'none'this.bigBox.style.display = 'none'this.middleBox.onmousemove = null}// 点击小图切换图片是for (let i = 0; i < this.smallImgs.length; i++) {this.smallImgs[i].onclick = ()=>{// 访问tab方法实现切换图片this.tab(this.smallImgs[i])}}
}// 鼠标在盒子上的移动事件
Enlarge.prototype.move = function(e){e = e || window.event// 鼠标相对于浏览器窗口左上角的坐标let x = e.clientXlet y = e.clientY// 遮罩层的宽高的一半let shadeWidthBan = this.shade.clientWidth/2let shadeHeightBan = this.shade.clientHeight/2// 限定x和y在左上角最小的位置坐标if(x<this.box.offsetLeft+shadeWidthBan){x = this.box.offsetLeft+shadeWidthBan}if(y<this.box.offsetTop+shadeHeightBan){y = this.box.offsetTop+shadeHeightBan}// 限定x和y在右下角最大的位置坐标if(x>this.box.offsetLeft+this.middleBox.clientWidth-shadeWidthBan){x = this.box.offsetLeft+this.middleBox.clientWidth - shadeWidthBan}if(y>this.box.offsetTop+this.middleBox.clientHeight-shadeHeightBan){y = this.box.offsetTop+this.middleBox.clientHeight-shadeHeightBan}// 给遮罩层设置left和top,让遮罩层移动起来this.shade.style.left = x - this.box.offsetLeft - shadeWidthBan + 'px'this.shade.style.top = y - this.box.offsetTop - shadeHeightBan + 'px'// 调用bigMove方法让大图移动this.bigMove()
}// 移动遮罩层让大图移动
Enlarge.prototype.bigMove = function(){this.bigBox.style.display = 'block'// 遮罩层移动的距离/中盒子大小 ===  大图移动距离/大图的大小// 计算 遮罩层移动的距离/中盒子大小 的比例let xPercent = this.shade.offsetLeft/this.middleBox.clientWidthlet yPercent = this.shade.offsetTop/this.middleBox.clientHeight// 获取大图的大小// 获取大盒子的背景图的尺寸 background-sizelet bigImgSize = getStyle(this.bigBox,'background-size')// 获取出来是字符串,通过字符串方法获取到背景图的宽高数值let bigImgWidth = parseInt(bigImgSize.split(' ')[0])let bigImgHeight = parseInt(bigImgSize.split(' ')[1])// 计算大图移动的距离let xMove = bigImgWidth*xPercentlet yMove = bigImgHeight*yPercent// 把大图要移动的距离,赋值到大图的背景图定位上 background-positionthis.bigBox.style.backgroundPosition = `-${xMove}px -${yMove}px`
}// 点击小图片切换中图和大图
Enlarge.prototype.tab = function(smallImg){// 获取小图元素中的middleImg和bigImg属性let middleImg = smallImg.getAttribute('middleImg')let bigImg = smallImg.getAttribute('bigImg')console.log(middleImg,bigImg);// 将中图和大图的图片地址替换this.middleImg.setAttribute('src',middleImg)this.bigBox.style.backgroundImage = `url(${bigImg})`// 去除小图片的active类名,给点击的这个加上activefor (let i = 0; i < this.smallImgs.length; i++) {this.smallImgs[i].className = ''}smallImg.className = 'active'
}
// 实例化对象
let enlarge = new Enlarge()
enlarge.bind()// 获取样式函数
function getStyle(ele,attr){if(window.getComputedStyle){return window.getComputedStyle(ele)[attr]}else{return ele.currentStyle[attr]}
}

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

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

相关文章

虚幻UE 材质-材质编辑器节点2

上一篇&#xff1a;虚幻UE 材质-材质编辑器节点 1 上一篇文章对材质编辑器的部分节点做了讲解和对比较常用的功能做了展示 这篇文章继续对上一篇的文章进行补充 文章目录 前言一、ReflectionVector反射向量二、Material Parameter Collection材质参数集三、TwoSideSign和Vertex…

使用 Process Explorer 和 Windbg 排查软件线程堵塞问题

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码&#xff0c;找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…

uniapp(vue2)+VoerkaI18n多语言

今天我学习了VoerkaI18n国际化插件&#xff0c;它是一个适用于Javascript/Vue/React/Solid/ReactNative的国际化全流程解决方案。VoerkaI18n可以帮助我们轻松地实现应用程序的多语言支持&#xff0c;使得应用程序可以适应不同的语言环境。 比较吸引我的是集成自动翻译,t(“中华…

基于net6的asp.net core webapi项目打包为docker镜像,并推送至私有镜像仓库harbor中

基于net6的asp.net core webapi项目打包为docker镜像&#xff0c;并推送至私有镜像仓库harbor中 0、环境说明1、打包步骤1.1 创建Asp.net core WebApi项目1.2 在Asp.net core WebApi项目根目录下创建Dockerfile文件1.3 在子系统Ubuntu20.04.4中通过docker build生成docker镜像1…

【angular教程240105】02绑定属性 绑定数据、条件判断、加载图片、【ngClass】 【ngStyle】、Angular管道

【angular】02绑定属性 绑定数据、条件判断、加载图片、【ngClass】 【ngStyle】、Angular管道 0 一些基础的概念 标记为可注入的服务 在Angular中&#xff0c;一个服务是一个通常提供特定功能的类&#xff0c;比如获取数据、日志记录或者业务逻辑等。标记为可注入的服务意味着…

PTA——查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0c;1&am…

判断一个数是NaN和Infinity的方法

1. isNaN()、 Number.isNaN()的区别 isNaN()只要不是数字都会返回true&#xff0c; Number.isNaN()只有NaN才 返回 true 所以&#xff0c;想严格检查一个值是否是 NaN&#xff0c;就选择 Number.isNaN() isNaN() isNaN() 函数会尝试将传入的值转换为数字&#xff0c;然后检查…

PCL 计算异面直线的距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,PCL 计算异面直线的距离,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 设置直线 A B AB A

在vue3上挂载方法,以及在页面中使用setup语法糖 该怎么使用原型(公共)上的方法

//新建的项目的main.js文件是这样的 //main.js 文件 //befor import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app);以下例子用于解释在vue3.0的main.js中挂载公共的方法&#xff08;foo&#xff09; //main.js 文件 //afte…

【JVM 基础】 Java 类加载机制

JVM 基础 - Java 类加载机制 类的生命周期类的加载: 查找并加载类的二进制数据连接验证: 确保被加载的类的正确性准备: 为类的静态变量分配内存&#xff0c;并将其初始化为默认值解析: 把类中的符号引用转换为直接引用 初始化使用卸载 类加载器&#xff0c; JVM类加载机制类加载…

nuxt 不解析HTML结构bug

记录一个本人Vue3迁移Nuxt3的报错 报错信息 [Vue warn]: Failed to resolve directive: top [nitro] [unhandledRejection] TypeError: Cannot read properties of undefined (reading ‘getSSRProps’) 原因是Vue3在迁移到nuxt3的时候有一个自定义指令没有搬过来&#xff0…

flutter 打包安卓apk 常用配置

打包之前需要先不配置不然会报错 Execution failed for task ‘:app:mergeReleaseResources’. APP目录下的build.gradleaaptOptions.cruncherEnabled falseaaptOptions.useNewCruncher false如图 配置targetSdkVersion 、minSdkVersion 在android/app/src目录下的build.…

自承载 Self-Host ASP.NET Web API 1 (C#)

本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。 创建控制台应用程序项目 启动 Visual Studio&#xff0c;然后从“开始”页中选择“新建项目”。 或者&#xff0c;从“ 文件 ”菜单中选择“ 新建 ”&a…

【小工具】pixi-live2d-display,直接可用的live2d的交互网页/桌面应用

效果&#xff1a; <script src"https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js"></script> <script src"https://cdn.jsdelivr.net/gh/dylanNew/live2d/webgl/Live2D/lib/live2d.min.js"></script> <…

CCSC,一种CPU架构

core-circuit-separate-computer 核与执行电路的分离&#xff0c;最初是为了省电。 用寄存器实现这种分离。 V寄存器控制着执行电路的供电&#xff0c;V0则不供电&#xff0c;进入省电模式&#xff1b;V1则供电&#xff0c;进入工作模式。 P寄存器是parameter-register&#xf…

4.【TypeScript 教程】TypeScript BigInt

TypeScript BigInt 本节介绍的 bigint 数据类型是用来表示那些已经超出了 number 类型最大值的整数值&#xff0c;对于总是被诟病的整数溢出问题&#xff0c;使用了 bigint 后将完美解决。 1. 解释 bigint 是一种基本数据类型&#xff08;primitive data type&#xff09;。 …

算法练习:查找二维数组中的目标值

题目&#xff1a; 编写一个高效的算法来搜索矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a;每行的元素从左到右升序排列。每列的元素从上到下升序排列。 实现&#xff1a; 1. main方法 public static void main(String[] args) {int[][] matrix {{1…

考研自命题资料、考题如何找

这篇文章是抖音和b站上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音和b站账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。 去年我发布了一个视频&am…

qt打包完整详细过程 包你成功

找问题找了一个多小时&#xff0c;不停调试&#xff0c;还修改文件路径&#xff0c;配置路径&#xff0c;开机关机&#xff0c;最后终于做出来了&#xff0c;得出来了一个结论 我绝对是天才 首先 看这个视频 k14 打包发布_哔哩哔哩_bilibili 不出意外&#xff0c;你绝对会在…

2024.01.09.Apple_UI_BUG

我是软件行业的&#xff0c;虽然不是手机设计的&#xff0c;但是这个设计真的导致经常看信息不完整&#xff0c;要下拉的。 特别读取文本或者其他文件的时候&#xff0c;上面有个抬头就是看不到&#xff0c;烦&#xff0c;体验感很差