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

news2024/9/24 0:23:41

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

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-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)))/
        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.coloradmin.cn/o/908388.html

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

相关文章

0008Java程序设计-JSP学生成绩管理系统设计与实现

摘 要目录系统实现开发环境 摘 要 随着网络的不断发展&#xff0c;一个好的成绩查询系统&#xff0c;不仅便于学生查询成绩、查询个人信息&#xff0c;而且有利于管理员对学生成绩的统一管理&#xff0c;考试之后学生能及时的对个人信息进行查看&#xff0c;减少了老师和学生之…

高性能MySQL实战(一):表结构 | 京东物流技术团队

最近因需求改动新增了一些数据库表&#xff0c;但是在定义表结构时&#xff0c;具体列属性的选择有些不知其所以然&#xff0c;索引的添加也有遗漏和不规范的地方&#xff0c;所以我打算为创建一个高性能表的过程以实战的形式写一个专题&#xff0c;以此来学习和巩固这些知识。…

09强化学习

强化学习有关词汇 state:对Environment的完整描述 action: 给定环境中所有有效操作的集合&#xff0c;通常称为动作空间 agent:执行action的模型 Environment:代理之外的所有部分。agent可以直接或间接的与之交互的一切&#xff0c;Agent执行操作时&#xff0c;Environment…

BarCodeWiz ActiveX Control Crack

BarCodeWiz ActiveX Control Crack BarcodeWiz ActiveX Control–只需单击按钮即可将所有基本条形码类型添加到Microsoft Office中。在Microsoft Word中&#xff0c;创建单独的条形码、标签页或合并文档。在Microsoft Excel中&#xff0c;选择单元格范围并自动将每个单元格转换…

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…

每日一题——判断是不是平衡二叉树

题目 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是一棵空树…

华为OD机试真题 Java 实现【通过软盘拷贝文件】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

C++的对象与类的含义

C是一门面向对象的编程语言&#xff0c;理解C需要掌握类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;这两个概念。 C 中的类&#xff08;Class&#xff09;可以看做C语言中结构体&#xff08;Struct&#xff09;的升级版。结构体是一种构造类型&#x…

SQL 盲注

问题描述&#xff1a; 解决方案&#xff1a; 通过建立过滤器方法 添加拦截器&#xff1a; web.xml 文件配置拦截器 <filter><filter-name>sqlFilter</filter-name><filter-class>com.fh.filter.SqlFilter</filter-class></filter> pack…

【链表篇】速刷牛客TOP101 高效刷题指南

文章目录 1、BM1 反转链表2、BM2 链表内指定区间反转3、BM3 链表中的节点每k个一组翻转4、BM4 合并两个排序的链表5、BM5 合并k个已排序的链表6、BM6 判断链表中是否有环7、BM7 链表中环的入口结点8、BM8 链表中倒数最后k个结点9、BM9 删除链表的倒数第n个节点10、BM10 两个链表…

Redis中的有序集合及其底层跳表

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…

派森 #P122. 峰值查找

描述 给定一个长度为n的列表nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 &#xff08;1&#xff09;峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于&#xff1b; &…

ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定

参数传递的本质: 将上层函数变量复制一份, 传给下层函数. 过程调用标准AAPC(Arm Architecture Procedure Call) 有了标准, 才能够进行C调用汇编或者汇编调用C ARM32调用约定 参数是不同位数传参情况, 额外的参数被caller进行入栈, callee进行出栈 寄存器传参 寄存器返回 汇编…

交叉编译相关知识

1、目标板与主机之间的连接&#xff1a; 目标板和主机之间通常可以使用串口、以太网接口、USB接口以及JTAG接口等连接方式。 (1)、串行通信&#xff1a; 串行通信接口常用的有9针串口&#xff08; DB9 &#xff09;和25针串口&#xff08;DB25&#xff09;&#xff0c;通信距…

IDEA创建Mybatis格式XML文件

设置位置&#xff1a;File | Settings | Editor | File and Code Templates 选择Files&#xff0c;点击号 Name中输入xml模板名&#xff08;名称自行决定&#xff09;&#xff0c;后缀名extension输入xml&#xff08;固定&#xff09; 内容处输入Mybatis的xml文件模板内容&…

数据结构 - 线性表的定义和基本操作

一、定义 线性表是具有相同特性的数据元素的一个有限序列。 线性表&#xff1a; 由n(n≥0)个数据元素&#xff08;结点&#xff09;组成的有限序列。线性表中数据元素是一对一的关系&#xff0c;每个结点最多有一个直接前驱&#xff0c;和一个直接后继 二、线性表的基本操作 …

【AI绘画--七夕篇】:七夕特别教程,使用SDXL绘制你的心上人(Stable Diffusion)(封神榜—妲己)

目录 前言0、介绍0-0、结果展示0-1、Stable Diffusion0-2、sdxl介绍 一、云端部署Stable Diffusion1-1、云端平台的优势 二、平台介绍三、注册账号并且开始炼制3-1、购买算力并创建工作空间3-2、启动工作空间3-3、应用市场一键安装3-4、使用Stable-Diffusion作图 四、有女朋友的…

cuda gdb调试

如果cudaDeviceEnablePeerAccess函数不支持或不起作用&#xff0c;您仍然可以尝试其他方法来实现GPU之间的数据交换和通信。以下是一些替代方法&#xff1a; 通过主机内存进行数据传输&#xff1a; 如果GPU之间的数据交换不是非常频繁&#xff0c;您可以将数据从一个GPU复制到…

【c语言】五子棋(EasyX图形库+背景音乐)

大家好&#xff0c;有没有觉得写了好多c语言代码&#xff0c;面对的都是黑框框控制台&#xff0c;当我们学习了基础的c语言知识&#xff0c;和EasyX图形库后&#xff0c;终于可以和黑框框saygoodbye,今天要分享给大家的是小游戏五子棋&#xff0c;跟着小张一起学习吧 EasyX图形…

(四)Doceke安装MySQL镜像+Docker启动MySQL容器

Doceke安装MySQL镜像/Docker启动MySQL容器 一、doceke安装MySQL镜像 切换到root用户&#xff0c;su root 。 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行…