一个炫酷的头像悬停效果 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;并探讨它相对于其他知识…

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;首先怀疑硬…

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;企业能够专注于…

【LeetCode-中等题】15. 三数之和

题目 题解一&#xff1a;双指针法 图解参考链接&#xff1a;画解算法&#xff1a;15. 三数之和 详解参考代码随想录讲的非常好 梦破碎的地方&#xff01;| LeetCode&#xff1a;15.三数之和 代码&#xff1a; class Solution {public List<List<Integer>> thre…

Codeforces Round 893 (Div. 2) A ~ C

比赛链接 A. Buttons 博弈、最优策略一定是先去按都能按的按钮&#xff0c;按完之后再按自己的。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typede…

jstack(Stack Trace for Java)Java堆栈跟踪工具

jstack&#xff08;Stack Trace for Java&#xff09;Java堆栈跟踪工具 jstack&#xff08;Stack Trace for Java&#xff09;命令用于生成虚拟机当前时刻的线程快照&#xff08;一般称为threaddump或者javacore文件&#xff09;。 线程快照就是当前虚拟机内每一条线程正在执…

动手学深度学习-pytorch版本(二):线性神经网络

参考引用 动手学深度学习 1. 线性神经网络 神经网络的整个训练过程&#xff0c;包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。经典统计学习技术中的线性回归和 softmax 回归可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个…

Linux系统的目录结构

file system hierarchy standard文件系统层级标准&#xff0c;定义了在类Unix系统中的目录结构和目录内容。 即让用户了解到已安装软件通常放置于哪个目录下。 Linux目录结构的特点 使用树形目录结构来组织和管理文件。 整个系统只有一个根目录&#xff08;树根&#xff09;&a…