30天JS挑战(第十六天)----鼠标拖影效果

2024-03-05 09:52

本文主要是介绍30天JS挑战(第十六天)----鼠标拖影效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十六天挑战(鼠标拖影效果)

地址:https://javascript30.com/

所有内容均上传至gitee,答案不唯一,仅代表本人思路

中文详解:https://github.com/soyaine/JavaScript30

该详解是Soyaine及其团队整理编撰的,是对源代码的详解强烈推荐大家观看学习!!!

本人gitee:https://gitee.com/thats-all-right-ha-ha/30-days—js-challenge

效果

在这里插入图片描述

  • 样式分析

    • 组件本体页面内居中(黑色),其他效果是组件的文本阴影
  • 逻辑分析

    • 阴影效果以组件中心点作为基准点向四周移动

    • 阴影效果随着鼠标移动进行移动,对位的阴影效果向相反方向移动

本人代码及思路分析

仅提供布局及逻辑代码

结构:

<div class="hero"><h1 contenteditable>🔥WOAH!</h1>
</div>

逻辑:

//设定横纵向初始值
let transverse = 0;
let direction = 0
//获取鼠标偏移量
let iniX = 0
let iniY = 0
const title = document.querySelector('h1')
document.addEventListener('mousemove', (e) => {iniX = e.clientX - title.offsetLeft - title.offsetWidth / 2iniY = e.clientY - title.offsetTop - title.offsetHeight / 2direction = iniY / 2transverse = iniX / 2title.style.textShadow = `${transverse}px ${direction}px 0 rgba(255, 0, 255, 0.7), ${-transverse}px ${-direction}px 0 rgba(0, 255, 255, 0.7), ${-direction}px ${transverse}px 0 rgba(0, 255, 0, 0.7) , ${direction}px ${-transverse}px 0 rgba(0, 0, 255, 0.7)`
})

分析:

  • **整体思路:**这里监听了整个dom对象的鼠标移动事件,以鼠标移动距离为偏移量,给中心组件动态添加textShadow样式

  • 具体实现:

    • 首先选定需要监听和修改的元素
    • 由于这里监听的是根Dom,根Dom的位移基准点在页面最左上角,获取组件中心点的位置作为偏移量,将clientX的起始点初始化至组件的中心
    • 由于clientX是只读属性,所以这里的修改只是通过增加偏移量实现的伪修改
    • 将修改后的clientX和clientY的值进行处理,作为组件阴影效果移动的值。
    • 添加textShadow样式
  • 弊端分析(与官方方法对比):

    • 性能问题:监听了整个文档的mousemove事件,当鼠标移动时会频繁地触发事件处理函数,可能导致性能问题,尤其是在页面元素较多或复杂的情况下。
    • 硬编码:阴影效果的计算是硬编码在JavaScript中的,如果标题文字的样式或布局发生变化,需要手动调整计算阴影的逻辑,不够灵活。
    • 重复计算:每次鼠标移动都重新计算阴影效果的位置,即使鼠标移动的距离很小,也会触发整个计算和样式更新的过程,这样的重复计算可能会影响性能。

官方代码

官方代码仅代表该案例原作者思路,不唯一

结构

<div class="hero"><h1 contenteditable>🔥WOAH!</h1>
</div>

逻辑

const hero = document.querySelector('.hero');
const text = hero.querySelector('h1');
const walk = 500; // 500px
function shadow(e) {const { offsetWidth: width, offsetHeight: height } = hero;let { offsetX: x, offsetY: y } = e;if (this !== e.target) {x = x + e.target.offsetLeft;y = y + e.target.offsetTop;}const xWalk = Math.round((x / width * walk) - (walk / 2));const yWalk = Math.round((y / height * walk) - (walk / 2));text.style.textShadow = `${xWalk}px ${yWalk}px 0 rgba(255,0,255,0.7),${xWalk * -1}px ${yWalk}px 0 rgba(0,255,255,0.7),${yWalk}px ${xWalk * -1}px 0 rgba(0,255,0,0.7),${yWalk * -1}px ${xWalk}px 0 rgba(0,0,255,0.7)`;
}
hero.addEventListener('mousemove', shadow);

分析

仅代表本人对该代码的分析

建议直接去看Soyaine的中文详解

  • **整体思路:**整体思路与上述保持一致

  • 具体实现:

    • 这里先获取了组件的高度和宽度,其次获取了鼠标的偏移量
    • 第二步判断了鼠标事件是否是在hero元素中,如果鼠标在组件内移动,则切换偏移量的计算方式
    • 偏移量的计算方式:
      • 通过比值的方式,在文字组件中映射鼠标移动的距离,通过这个比值和最大范围数进行相乘并减最大范围的一半,作为移动的距离
      • 在这里插入图片描述
  • 优点:

    • 更高效的事件处理:代码只监听了.hero元素的mousemove事件,而不是整个文档,这样可以减少事件处理函数的触发次数,提高性能。
    • 更精简的阴影计算逻辑:通过使用解构赋值和简洁的计算,将阴影效果的计算逻辑简化了,使代码更易读、更易维护。
    • 更灵活的阴影效果:阴影效果的移动距离通过walk变量控制,可以通过修改这个变量来调整阴影的移动范围,增加了代码的灵活性。

这篇关于30天JS挑战(第十六天)----鼠标拖影效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/776124

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2