一个炫酷的头像悬停效果 2

基于上次翻译的 🔥🔥一个炫酷的头像悬停效果 收获了不少同学的喜欢,原作者近期进行了优化升级。本文将升级后的核心实现过程进行梳理讲解,如果没看过第一期的推荐先看看第一期的实现过程。升级后的效果如下图所示。

gif动画效果如下:

相对于上次的效果主要增加了背景的变化,增加了默认的旋转动画以及背景花瓣的效果。核心实现技术点如下:

  • 不需要额外的元素,仅使用<img>标签
  • 不使用伪元素
  • 使用future CSS,mask,@property,三角函数和大量的数学函数
  • 使用Sass和CSS变量优化代码量
  • 小圆的大小和数量可配置

对于实现过程的相关三角函数及Sass相关函数不过多解析,有兴趣的可以详细了解。

基础变量定义

为了方便后面操作与更改配置,首先定义几个变量方便调整配置和后续代码引用。

背景圆中的小圆数量 $n

$n: 15;

控制小圆半径和主体的尺寸大小:

--r: 50px; 

控制小圆放大比例基数,控制数值在1.2和2之间:

--f: 2;

主体背景颜色:

--c: #E4844A;

除此之外还通过 @property 定义了2个变量,控制旋转的角度及小圆之间的间距。

通过 @property 声明的变量可以定义其语法、继承性和初始值。这样做的好处是可以在文档中明确地声明变量,并指定其用途和限制条件。这种声明方式更适合需要详细定义的场景,例如自定义属性。

@property --a {syntax: "<angle>";initial-value: 0deg;inherits: true;
}
@property --i {syntax: "<length>";initial-value: 0px;inherits: true;
}

背景绘制

背景图形上有多个小圆组成,小圆的数量是可配置的,所以背景的小圆需要基于所配置的数量动态生成,这里需要用到几个Sass的函数。

由于小圆的数量$n支持配置,所以整个元素的大小会随之影响发生变化。通过设置aspect-ratio,我们只需要控制width的变化即可。宽度的最终值基于小圆的半径和小圆的数量计算得出。

width: calc(var(--r)*(1 + 1/tan(180deg/#{$n})));
aspect-ratio: 1;
border-radius: 50%;

接下来开始绘制附属在大圆上面的小圆。

$m: ();
@for $i from 1 through ($n) {$m: append($m, radial-gradient(var(--c) 70%,#0000 72%) no-repeatcalc(50% + (50% - var(--i,0px))*cos(360deg*#{$i/$n} + var(--a,0deg))) calc(50% + (50% - var(--i,0px))*sin(360deg*#{$i/$n} + var(--a,0deg)))/var(--r) var(--r), comma);}

首先,我们定义一个变量 $m,并将其初始化为空。然后使用 @for 循环从 1 到 $n 小圆的数量进行遍历。

在循环内部,使用 Sassappend() 函数将新生成的 radial-gradient 样式追加到 $m 变量中。append() 函数用于在列表类型的变量后面添加一个新的元素,并返回新的列表。

radial-gradient 样式由以下几部分组成:

  • var(--c) 70%:表示渐变的颜色和渐变的位置,其中颜色使用 CSS 变量 --c
  • #0000 72%:表示渐变的结束颜色和结束位置。
  • no-repeat:表示不重复渐变。
  • calc(50% + (50% - var(--i,0px))*cos(360deg*#{$i/$n} + var(--a,0deg)))calc(50% + (50% - var(--i,0px))*sin(360deg*#{$i/$n} + var(--a,0deg))):计算渐变的圆心位置,其中变量 --i--a是自定义变量,默认值分别为 0px0deg
  • / var(--r) var(--r):表示渐变的尺寸,其中尺寸使用 CSS 变量 --r
  • comma:表示多个背景图像之间使用逗号分隔。

循环结束后,变量 $m 将包含所有生成的 radial-gradient 样式,可以在后续的样式中使用 $m 来应用这些背景图像。

基于上面的代码继续完善,将最终生成的图形绘制到背景中。

--_m: radial-gradient(var(--c) calc(72% - var(--r)/2 - var(--i,0px)),#0000 0),#{$m};
-webkit-mask: linear-gradient(#000 0 0) top/100% 50% no-repeat,var(--_m);
background: var(--_m);

在上面的代码中,定义了一个新的CSS变量 --_m。它的值由两部分组成:

  1. 一个 radial-gradient 背景图像样式,其中渐变的颜色和位置使用 var(--c)calc(72% - var(--r)/2 - var(--i,0px)) 表示,这个渐变的结束颜色是 #0000,结束位置是 0。这部分内容就是整个背景的中心大圆部分。

  2. 以插值的方式引用之前定义的变量 $m

接着使用 -webkit-mask 属性为元素设置背景遮罩效果。它包含两部分:

  1. 一个线性渐变 linear-gradient,表示从顶部开始的黑色渐变。其中渐变的颜色为 #000,渐变的起始位置、结束位置分别为 00。设置了 top/100% 50% 表示 linear-gradient 的尺寸是水平方向占满整个宽度,垂直方向占高度的一半。no-repeat 表示不重复渐变。
  2. 引用之前定义的变量 --_m,将其作为元素的遮罩图像。

最后使用 background 属性将之前定义的变量 --_m 作为元素的背景图像。这样整个元素的背景就会显示之前生成的 radial-gradient 多个小圆的样式。

动画绘制

元素hover后动画细节拆分:

  • 背景圆旋转动画运行速度加快
  • 大圆附属小圆放大配置比例
  • 中心人物放大

hover前后动画速度不一样是两段不同执行时间的动画在切换,默认设置的动画如下:

--_a: rotate linear infinite;
animation: var(--_a) 10s,var(--_a) 16s reverse;@keyframes rotate {to{--a:360deg}
}

hover时将第一段动画设置running,第二段动画设置paused

animation-play-state: running, paused;

上面绘制小圆的时候是基于--r半径绘制,我们还定义了--f控制hover时小圆放大比例的基数。--i在绘制小圆的时候设置了默认值是0pxhover时基于设定的变量进行计算赋值到--i,即可对校园进行放大的动画控制。

--i: calc(var(--r)/var(--f));

对中心人物图像的放大使用如下代码,核心使用了小圆数量 $n,小圆半径--r进行计算最终放大的比例。

scale: calc((1 + 1/tan(180deg/#{$n}))/(1 - 2/var(--f) + 1/tan(180deg/#{$n})));

另外还对主要的动画增加了过渡的效果,针对--iscale的切换增加0.4s的过渡时间,使动画更加丝滑。

transition: --i .4s, scale .4s;

在线源码

https://code.juejin.cn/pen/7269700151160078348

最后

到此整体核心实现的逻辑就结束了,整个实现过程用到了不少Sass函数以及CSS3相关能力,定义了部分配置项使整个代码更加灵活可控,简洁高效。有兴趣的可以自己尝试看看。

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

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

参考

A Fancy Hover Effect For Your Avatar II: css-tip.com/avatar-hover-effect-2/

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

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

相关文章

Baklib是比语雀、Notion、石墨文档更好用的在线知识库管理工具

在当今信息爆炸的时代&#xff0c;如何高效地管理和利用知识成为了每个人都面临的问题。在线知识库管理工具应运而生&#xff0c;帮助用户整理、存储和共享知识。在这篇文章中&#xff0c;我将介绍一个更好用的在线知识库管理工具——Baklib&#xff0c;并探讨它相对于其他知识…

变上限积分求导

y ∫ 0 x t f ( t 2 − x 2 ) d t y \int _0^x t f( t^2 - x^2)dt y∫0x​tf(t2−x2)dt 设 t 2 − x 2 u , 那么 t u x 2 , d t d u 2 u x 2 &#xff0c; 并且当 t x 时 u 0 , 当 t 0 时&#xff0c; u − x 2 设 t^2 - x^2 u,那么t \sqrt{ux^2},dt \frac{du}{2\s…

Spring系列篇--关于IOC【控制反转】的详解

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是Spring 二.Spring的特点 三.什…

【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图

作品概况 页面数量&#xff1a;共 110 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;外卖配送、生鲜配送 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为外卖订餐骑手端APP原型设计图&#x…

Datawhale Django 后端开发入门 Task05 DefaultRouter、自定义函数

一、DefaultRouter是Django REST framework中提供的一个路由器类&#xff0c;用于自动生成URL路由。路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由&#xff0c;从而减少了手动编写URL路由的工作量…

Redis Lua脚本执行原理和语法示例

Redis Lua脚本语法示例 文章目录 Redis Lua脚本语法示例0. 前言参考资料 1. Redis 执行Lua脚本原理1.1. 对Redis源码中嵌入Lua解释器的简要解析&#xff1a;1.2. Redis Lua 脚本缓存机制 2. Redis Lua脚本示例1.1. 场景示例1. 请求限流2. 原子性地从一个list移动元素到另一个li…

基于郊狼算法优化的BP神经网络(预测应用) - 附代码

基于郊狼算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于郊狼算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.郊狼优化BP神经网络2.1 BP神经网络参数设置2.2 郊狼算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

【深入解析:数据结构栈的魅力与应用】

本章重点 栈的概念及结构 栈的实现方式 数组实现栈接口 栈面试题目 概念选择题 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数…

指针(一)【C语言进阶版】

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a; 指针的主题&#xff0c;在初阶指针章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址的唯一标识一块内存空间&#xff08;指针变量&#xff09;&a…

【云原生|Docker系列第3篇】Docker镜像的入门实践

欢迎来到Docker入门系列的第三篇博客&#xff01;在前两篇博客中&#xff0c;我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念&#xff0c;以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像&#xff0c;这是使用Do…

jenkins同一jar包部署到多台服务器

文章目录 安装插件配置ssh服务构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍&#xff0c;我这篇主要讲jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 安装插件 Publish Over SSH 这…

stm32g070的PD0/PD2 PA8和PB15

目前在用STM32G070做项目&#xff0c;其中PD2TIMER3去模拟PWM&#xff0c;PD0用作按键检测&#xff0c;测试发现PD0低电平检测没有问题&#xff0c;高电平检测不到&#xff0c;电路图如下图所示&#xff1a; 用万用表测试电平&#xff0c;高电平1.0V左右&#xff0c;首先怀疑硬…

PyTorch安装教程:从头开始配置PyTorch环境

PyTorch是一个开源的机器学习框架&#xff0c;广泛用于深度学习任务。要开始使用PyTorch&#xff0c;您需要在计算机上正确配置PyTorch环境。本文将为您提供一步步的指南&#xff0c;帮助您成功安装和配置PyTorch。 第一部分&#xff1a;安装Python和相关工具 第一步&#xf…

rust踩雷笔记(4)——刷点Vec相关的题(持续更新)

俗话说&#xff0c;孰能生巧&#xff0c;今天是第六天接触Rust&#xff0c;感觉基础语法和特性没什么问题了&#xff08;当然如果你整天都学这个可能2天半就够了&#xff09;&#xff0c;但是想达到熟练使用&#xff0c;还需要刷点题。算法我相信能来看rust博客的人都是大牛&am…

【项目实践】基于LSTM的一维数据扩展与预测

基于LSTM的一维数据拟合扩展 一、引(fei)言(hua) 我在做Sri Lanka生态系统服务价值计算时&#xff0c;中间遇到了一点小问题。从世界粮农组织(FAO)上获得Sri Lanka主要农作物产量和价格数据时&#xff0c;其中的主要作物Sorghum仅有2001-2006年的数据&#xff0c;而Millet只有…

算法通关村第4关【黄金】| 表达式问题

1. 计算器问题 思路&#xff1a;此题不考虑括号和负数情况&#xff0c;单纯使用栈即可解决。注意的是数字可能是多位数需要保留完整的num&#xff0c; 保留数字的前缀符号&#xff0c;当碰到加号&#xff0c;存进去&#xff1b;当碰到减号&#xff0c;存相反数进去&#xff1b;…

Apinto 网关进阶教程,插件开发入门指南

Apinto 是基于Go语言&#xff0c;由 Eolink 自主研发的一款高性能、可扩展、易维护的云原生 API 网关。Apinto 能够帮助用户简单、快速、低成本、低风险地实现&#xff1a;系统微服务化、系统集成、向合作伙伴、开发者开放功能和数据。 通过 Apinto&#xff0c;企业能够专注于…

clickhouse修改默认密码

1.明文密码 vim /etc/clickhouse-server/users.xml找到下面的语句,增加明文密码 <password>123456789</password> 2. sha256密码 # echo -n 123456789 | openssl dgst -sha256 (stdin) 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 修改…

js new关键字的作用

创建一个新对象&#xff0c;如&#xff1a;var person {};新对象的_proto_属性指向构造函数的原型对象。将构造函数的作用域赋值给新对象。&#xff08;也所以this对象指向新对象&#xff09;执行构造函数内部的代码&#xff0c;将属性添加给person中的this对象。返回新对象pe…

MobileNet、MobileNetV2和MobileNetV3创新点总结

当谈论MobileNet、MobileNetV2和MobileNetV3时&#xff0c;我们指的是一系列基于深度学习的轻量级神经网络架构&#xff0c;这些架构旨在在保持高度准确性的同时减少模型的计算和参数量。以下是它们各自的创新点的详细总结&#xff1a; MobileNet&#xff1a; 深度可分离卷积&…