炫酷鼠标悬停随机渐变文本动画效果

如图所示,这是一个很炫酷的鼠标悬停动画效果,卡片的文字随着鼠标的移动不断变化着,且文字的颜色伴随着渐变色跟随鼠标移动,中心部分是突出的LOGO效果,整个交互效果十分引人注目。原效果来源于 evervault.com/customers 这个网站,有兴趣的可以体验看看~

本次文章将解析如何用代码实现这个效果,根据上面的动图分析出我们要实现的几个主要功能点:

  • 卡片在鼠标悬停时出现渐变随机文字
  • 中心LOGO部分呈透明圆形覆盖在文字上方
  • 渐变文字随着鼠标的移动随机变化
  • 随机的文字呈渐变色

代码实现

界面布局

根据上面的分析中心的LOGO部分的层级高于文字内容,所以我们的布局采用定位的方式,使LOGO部分的z-index更高即可,核心代码如下,card-image即是LOGO部分,card-gradient则是渐变颜色的控制,card-letters控制随机文本:

html:

<div class="card"><div class="card-image"><img src="https://assets.codepen.io/1468070/Hyperplexed+Logo+-+Color+5.svg" /></div><div class="card-gradient"></div><div class="card-letters"></div>
</div>

css:

.card {display: flex;align-items: center;justify-content: center;position: relative;
}.card-image {position: relative;z-index: 4;
}.card-letters {position: absolute;left: 0px;top: 0px;height: 100%;width: 100%;
}.card-gradient {height: 100%;width: 100%;position: absolute;z-index: 3;
}

随机文本效果

这里的随机文本需要借助于JavaScript生成随机文本再填充到card-letters中,首先定义需要随机的所有文本字符:

const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

然后定义随机字符的函数,这段代码定义了两个函数:randomCharrandomString

randomChar 函数通过从 chars 数组中随机选择一个字符来生成一个随机字符。它使用 Math.random() 函数生成一个随机数,这个随机数用来在 chars 数组中选取一个随机的字符。

randomString 函数则生成一个指定长度的随机字符串。这个函数首先创建一个与给定长度相同的数组,然后用 map 方法对数组中的每个元素调用 randomChar 函数,最后使用 join 方法将所有字符连接成一个字符串。

使用方式只需要调用randomString(length)传入需要随机字符的长度即可。

const randomChar = () => chars[Math.floor(Math.random() * (chars.length - 1))],randomString = length => Array.from(Array(length)).map(randomChar).join("");

当鼠标移动的时候通过监听onmousemove事件将生成的随机内容设置到文本标签的innerText即可。

const handleOnMove = e => {letters.innerText = randomString(1500);    
}card.onmousemove = e => handleOnMove(e);

以下是设置完成的效果:

卡片内默认文本是不展示的,鼠标移入后展示,离开后消失,这块采用透明度实现。我们对.card-letters增加透明度的控制,默认透明度是0,鼠标移入修改为1,代码如下:

.card-letters {opacity: 0;transition: opacity 400ms;
}.card:hover .card-letters {opacity: 1;
}

移动阴影效果

观察文章开始的效果可以发现卡片内文本只有在鼠标周围才是高亮状态,其他位置都有阴影效果,以此来突出鼠标移动的焦点效果。即然是跟随鼠标位置而变化,所以我们首先需要获取到当前鼠标的x,y坐标数据。还是基于刚刚的onmousemove事件,稍加改造即可获取:

const handleOnMove = e => {
+  const rect = card.getBoundingClientRect(),
+        x = e.clientX - rect.left,
+        y = e.clientY - rect.top;+  letters.style.setProperty("--x", `${x}px`);
+  letters.style.setProperty("--y", `${y}px`);letters.innerText = randomString(1500);    
}

将计算好的x,y通过属性设置在letters标签上,下一步我们就可以在CSS使用动态的坐标值。

这里的动态阴影效果我们使用mask-image实现,这里的阴影本质也是就是渐变背景,通过radial-gradient创意一个从中心向外逐渐变化的效果,代码如下:

-webkit-mask-image: radial-gradient(calc(var(--card-size) * 0.8) circle at var(--x) var(--y), rgb(255 255 255) 20%, rgb(255 255 255 / 25%), transparent
);

这段代码中,calc(var(--card-size) * 0.8) 是用来确定渐变区域的大小,这里代表的是卡片尺寸的80%。

circle at var(--x) var(--y) 是用来设置渐变的位置,这里的位置即跟随鼠标移动变化着。

接下来的颜色部分是定义了渐变的颜色变化,从rgb(255 255 255)开始,颜色逐渐变淡到透明。最后的 transparent 是渐变的结束颜色,也就是mask的透明区域。

这段代码创建了一个放射状的渐变效果,用于遮罩一个元素,使得该元素只有部分可见。增加后的效果如下:

渐变色文本效果

观察文章开始的完整效果可以发现渐变颜色的区域是没有发生变化的,因为有阴影的变化让人感觉渐变颜色似乎也在跟着变化。这里主要用到了混合模式,混合模式用于控制两个图层在叠加时的显示方式。我们的文本mask渐变是不断变化的,那我们只需要在卡片上再设置一个渐变背景色就可以达到混合模式的效果。

这里我们对card-gradient元素通过radial-gradient增加渐变背景色,效果如下图所示,中心部分保留暗色,剩余部分设置两个渐变颜色。

--background-light-rgb: 30 41 59;
--hyperplexed-main-rgb: 41 121 255;
--hyperplexed-main-light-rgb: 56 182 255;
--hyperplexed-secondary-rgb: 42 252 152;background: radial-gradient(rgb(var(--background-light-rgb)) 40%, rgb(var(--hyperplexed-main-rgb)) 50%, rgb(var(--hyperplexed-main-light-rgb)),rgb(var(--hyperplexed-secondary-rgb))
);

设置完成后的效果:

来到了关键的一步,设置混合模式darken。通过设置混合模式mix-blend-mode: darken表示当前图层的颜色会通过与背景的颜色的减法运算来决定最终显示的颜色。也就是说这个元素如果背景颜色较深,那么元素的颜色将会变得更暗,反之则会变得更亮。回顾我们设置文本阴影部分,只有鼠标周围是亮色,其他都是深色阴影,这样结合上面的渐变背景即可应用到文本的颜色,通过下图更清晰的展示的设置前后的区别。

结语

本文详细解析了用代码实现一个炫酷鼠标悬停渐变随机文本的动画效果,将这个效果应用到你的网站中,相信会大大的提升用户交互体验。有兴趣的朋友可以尝试看看~

关注公众号回复【 20240102 】可获取完整源代码~

参考

evervault.com/customers
codepen.io/Hyperplexed/pen/VwqLQbo


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

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

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

相关文章

Head First Design Patterns - 装饰者模式

什么是装饰者模式 装饰者模式动态地将额外责任附加到对象上。对于拓展功能&#xff0c;装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义 为什么会有装饰者模式 根据上述定义&#xff0c;简单来说&#xff0c;装饰者模式就是对原有的类&#xff0c…

绝地求生:PUBG到底怎么穿?

闲游盒突然就认为这条裤子很不错&#xff0c;褶皱设计&#xff0c;版型&#xff0c;和其他饰品的搭配能力方面&#xff0c;私以为比柏林裤和悲喜白色长裤的可搭配能力要强一些。可能是因为看起来更日常化&#xff0c;在我进行尝试后发现柏林裤版型在穿鞋的时候会露出脚脖子&…

目标检测-Owo Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 和Fast-CNN相比&#xff0c;速度快&#xff0c;但精度下降。&#xff08;边框回归不加限制&#xff09;…

2023年最新版的linux运维面试题(四)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…

oracle 9i10g编程艺术-读书笔记2

配置Statspack 安装Statspack需要用internal身份登陆&#xff0c;或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。 select instance_name,host_name,version,startup_time from v$instance;检查数据文件路径及磁盘空间&…

CNAS中兴新支点——软件测试报告模板分享

第三方检测机构推荐 欢迎私信或评论咨询&#xff0c;也可看本人收藏夹获取详细咨询信息。下面开始进入正文 1、测试背景&#xff1a; 本次测试的软件是一款名为“XXX”的应用程序&#xff0c;主要用于解决某种需求。本次测试目的是发现软件中的问题和缺陷&#xff0c;并进行优…

【VMware】Windows安装MySQL及网络配置---图文并茂详细介绍

一 安装MySQL ① 连接虚拟机传输MySQL压缩包 先查看虚拟机中的地址 命令&#xff1a; ipconfig 主机连接 在主机连接虚拟机后&#xff0c;将mysql压缩包和Navicat安装包复制到虚拟机下即可 ②解压MySQL压缩包 ③ my文件拷贝mysql安装根目录下 如下图的第一步&#xff0c;…

2024年山东省中职“网络安全”试题——B-3:Web安全之综合渗透测试

B-3&#xff1a;Web安全之综合渗透测试 服务器场景名称&#xff1a;Server2010&#xff08;关闭链接&#xff09; 服务器场景操作系统&#xff1a;"需要环境有问题加q" 使用渗透机场景Kali中的工具扫描服务器&#xff0c;通过扫描服务器得到web端口&#xff0c;登陆…

计算机专业个人简历范文(8篇)

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析

NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人&#xff1a;最好资料就是上面三份资料&#xff0c;可以通过官网明确的获取一手信息&#xff0c;你所遇到的99%的问题都可以找到&#xff0c;明确的解决方案&#xff0c;建议最好看…

linux sh 脚本文件换行错误

windows 写好的脚本到服务运行不起来&#xff0c;显示换行问题 因为 windwos 的换行和 linux 的换行风格不同 解决办法&#xff1a;在使用的文本编辑器中&#xff0c;修改格式为 unix 格式 以 notepad 为例&#xff0c;在编辑 -> 文档格式转换中设置格式为 Unix

fmincon函数的决策变量可以是二维矩阵,但不建议是高维矩阵

1&#xff09;二维矩阵代码 clear all clc% 定义目标函数 fun (x) sum(sum(x.^2));% 初始矩阵 x0 2 rand(2, 2);% 定义空的线性不等式约束 A []; b [];% 定义空的线性等式约束 Aeq []; beq [];% 定义变量的上下界 lb ones(2,2); ub [];% 使用 fmincon 求解 options …

Rancher 单节点 docker 部署备份与恢复

Rancher 单节点 docker 部署备份与恢复 1. 备份集群 获取 rancher server 容器名&#xff0c;本例为 angry_aryabhata docker ps | grep rancher/rancher6a27b8634c80 rancher/rancher:v2.5.14 xxx angry_aryabhata停止容器 docker stop angry_aryabhata创建备…

基于Spring Boot的美妆分享系统:打造个性化推荐、互动社区与智能决策

基于Spring Boot的美妆分享系统&#xff1a;打造个性化推荐、互动社区与智能决策 1. 项目介绍2. 管理员功能2.1 美妆管理2.2 页面管理2.3 链接管理2.4 评论管理2.5 用户管理2.6 公告管理 3. 用户功能3.1 登录注册3.2 分享商品3.3 问答3.4 我的分享3.5 我的收藏夹 4. 创新点4.1 …

国标GB28181对接的时候如何配置服务端口和本地端口

目 录 一、国标GB28181对接需要配置的端口等参数 二、GB28181服务器端口的配置&#xff1a;SIP服务器端口 三、GB28181设备测端口的配置&#xff1a;本地SIP端口 &#xff08;一&#xff09;本地SIP端口配置的意义 &#xff08;二&#xf…

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址&#xff0c;在 SRO_EX 目录下&…

全志R128使用SPI驱动ST7789V1.47寸LCD

R128 平台提供了 SPI DBI 的 SPI TFT 接口&#xff0c;具有如下特点&#xff1a; Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 video formatMaximum resoluti…

开源在线客服系统源码全端通吃:聊天记录云端实时保存 附带完整的搭建教程

随着互联网的普及和消费者对客户服务体验的要求提高&#xff0c;传统的电话客服已经不能满足用户的需求。企业需要一个更加便捷、高效、实时的在线客服系统来提供更好的客户服务。然而&#xff0c;市场上的许多在线客服系统要么功能不全&#xff0c;要么价格昂贵。在这种情况下…

jsp结合servlet

servlet配置 环境配置2023.12.31 idea配置搭建 创建一个普通的java项目 由于新版idea去除了add framework support的ui显示&#xff0c;可以在左边项目栏中使用快捷键shiftk或者setting中搜索add framework support在修改对应的快捷键 点击ok然后应该就是下面这样的结果 这里…

HarmonyOS应用开发-搭建开发环境

本文介绍如何搭建 HarmonyOS 应用的开发环境&#xff0c;介绍下载安装 DevEco Studio 开发工具和 SDK 的详细流程。华为鸿蒙 DevEco Studio 是面向全场景的一站式集成开发环境&#xff0c;面向全场景多设备&#xff0c;提供一站式的分布式应用开发平台&#xff0c;支持分布式多…