首页 > 其他分享 >【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究

【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究

时间:2024-08-14 09:55:28浏览次数:15  
标签:Hover 进阶 效果 -- radius Blur position border 鼠标

本文,我们将一起探讨探讨,如下所示的一个卡片 Hover 动画,应该如何实现:

这个效果的几个难点:

  1. 鼠标移动的过程中,展示当前卡片边缘的 border 以及发光效果;

效果只出现在鼠标附近?这一块的实现方法就有很多种了,可以计算鼠标附近的范围,在范围内去实现的效果,但是这样成本太高了。

转换一下思维,其实也可以利用遮罩的思想。在一开始就已经实现好了整体效果,也就是渐变色的整个边框以及整体的内发光效果,通过遮罩的思想,让整个遮罩层跟随鼠标进行移动。

  1. 整体的效果需要适配鼠标的移动,跟随鼠标移动,进行效果的切换;

基于上述动图中,到目前为止,纯 CSS 在鼠标移动效果跟随上,是没法解决的,这里需要引入一定量的 Javascript 代码。

基于上述难点(1)(2),下面我们就一起看看如何一步一步实现这个效果。

搭建整个静态效果

首先,我们需要搭建整个静态效果。也就是在没任何 hover 的状态下的效果,如下所示:

由于,每张图背后的虚化图效果,应该是基于图片不同而千图千面,因此,不可能能够用一张背景图 Cover 所有情况。

并且,图片背后的虚化图的效果,需要与实际图片的颜色保持大致一致。

基于上述两点,我们很容易想到使用 filter: blur() 模糊来处理此类情况。

代码也比较简单:

<div></div>
:root {
    --pic: url("https://oss.aiyuzhou8.com/2023/05/08-.jpg");
}
div {
    position: relative;
    margin: auto;
    width: 350px;
    height: 500px;
    border-radius: 30px;
    overflow: hidden;
    
    &::before,
    &::after {
        content: "";
        position: absolute;
        background: var(--pic);
        background-size: cover;
        background-position: center;
        border-radius: 30px;
    }
    
    &::before {
        inset: 0;
        filter: blur(20px);
    }
    
    &::after {
        inset: 50px;
    }
}

这里,我们用元素的一层伪元素实现原图,另外一层伪元素实现虚化后的图片:

这种好处是,背后的虚化图层,可以适配任意的不同图片:

实现渐变色边框

接下来,我们需要实现渐变色的边框效果。

这个需要借助 conic-gradient 实现。

我们需要借助另外一个 div 实现我们的效果:

<div></div>
div {
    width: 350px;
    height: 500px;
    border-radius: 30px;
    background: conic-gradient(#03a9f4, #e91e63, #9c27b0, #ff5722, #03a9f4);
}

这样,我们就得到了一个这样的图形:

把它叠加到我们上述的效果之上,让整个图形,稍微比上述虚化背景大一点点即可,如此一来,效果就变成了这样:

仔细看,图片带上了渐变色的边框。

等等,再仔细看!除了渐变色边框之外,当前的效果,居然还自带了内发光(内阴影)效果,真是歪打正着,这不正是我们需要实现的吗:

探究 filter: blur() 的透明效果

这是为何呢?原因在于,设置了 filter: blur() 的元素,会从边缘处向中心处,带有透明衰减的效果。

我们简单来做个实验:

<div></div>
<div></div>
div {
    position: relative;
    width: 200px;
    height: 300px;
    border-radius: 10px;
    border: 1px solid #000;
    background: conic-gradient(#03a9f4, #e91e63, #9c27b0, #ff5722, #03a9f4);
    
    &::before {
        content: "";
        position: absolute;
        inset: 10px;
        border-radius: 10px;
        background: #fff;
        border: 1px solid #000;
    }
}

我们设置了两个一模一样的 div,其中,元素本身设置了一个角向渐变背景。

接着,利用其伪元素,在元素中间相距边界 10px 的地方,设置一个背景为白色的元素。效果如下:

此时此刻,两个元素没有任何不一样。但是接下来,我们给第二个元素的伪元素,添加上一个 filter: blur() 高斯模糊效果:

div:nth-child(2) {
    &::before {
        filter: blur(20px);
    }
}

此时,再看看效果:

在白色元素的边缘处,向内的方向,其实是有逐渐减弱的透明效果。

当然,由于高斯模糊还会产生向外扩散的效果,因此上述 DEMO 示意图看起来不是很清晰,我们可以通过多套一层容器,通过 overflow: hidden 阻止高斯模糊的向外扩散。

我们再调整一下布局:

<div class="g-father">
    <div class="g-child"></div>
</div>
<div class="g-father">
    <div class="g-child"></div>
</div>
.g-father {
    position: relative;
    width: 200px;
    height: 300px;
    border-radius: 10px;
    border: 1px solid #000;
    background: conic-gradient(#03a9f4, #e91e63, #9c27b0, #ff5722, #03a9f4);
    
    .g-child {
        position: absolute;
        inset: 10px;
        border-radius: 10px;
        border: 1px solid #000;
        overflow: hidden;
        
        &::before {
            content: "";
            position: absolute;
            inset: 0;
            background: #fff;
            border-radius: 10px;
            
        }
    }
}

.g-father:nth-child(2) {
    .g-child::before {
        filter: blur(20px);
    }
}

此时,我们再看整个效果,设置了 filter: blur() 的元素,会从边缘处向中心处,带有透明衰减的效果就非常明显了:

完整的 DEMO,你可以戳这里:CodePen Demo -- filter: blur 透明效果示意

鼠标移动事件监听配合 mask,实现整体效果

好,到这里,我们已经成功得到了这么一个效果:

基于上述效果,我们最后要做的,就是最终实现这么个效果:

这里,我们会利用鼠标移动事件监听配合 mask 来实现。

由于我们上述的效果是分层实现的,其中边框和内发光层,其实是这么个背景效果:

我们要做的就是:

  1. 利用 radial-gradient() 实现一个径向渐变 mask 遮罩;
  2. 监听鼠标移动事件,移动 mask 遮罩的中心点;
  3. 可以通过多设置一层,实现 Hover 时背景角向渐变元素才出现,鼠标离开元素区域,背景角向渐变元素消失;

大致代码如下:

<div id="g-container">
    <div id="g-img"></div>
</div>
:root {
    --x: 0;
    --y: 0;
}
#g-container {
    position: relative;
    width: 350px;
    height: 500px;
    border-radius: 30px;
}
#g-img {
    position: absolute;
    inset: 0px;
    border-radius: 30px;
    background: conic-gradient(#03a9f4, #e91e63, #9c27b0, #ff5722, #03a9f4);
    mask: radial-gradient(
        circle at var(--x) var(--y),
        #000,
        #000,
        transparent,
        transparent,
        transparent
    );
}
const container = document.getElementById("g-container");
const img = document.getElementById("g-img");

container.addEventListener("mousemove", (event) => {
    img.style.visibility = 'visible';

    const target = event.target;
    const rect = target.getBoundingClientRect();

    var offsetX = event.clientX - rect.left;
    var offsetY = event.clientY - rect.top;

    var percentX = (Math.min(Math.max(offsetX / rect.width, 0), 1) * 100).toFixed(2);
    var percentY = (Math.min(Math.max(offsetY / rect.height, 0), 1) * 100).toFixed(2);;

    console.log('X: ' + percentX + '%');
    console.log('Y: ' + percentY + '%');

    container.setAttribute('style', `--x: ${percentX}%;--y: ${percentY}%;`);

});

container.addEventListener("mouseout", (event) => {
    img.style.visibility = 'hidden';
});

在图形上方移动鼠标,我们可以得到这么一个效果:

好,将上述的前面两个图层也合并进来,这样,我们就最终完美的实现了我们想要的效果:

完整的代码散落在上方,就不重复贴影响阅读体验了,感兴趣的同学,可以戳这里获取完整 DEMO 效果及源码:

CodePen Demo -- CSS 3D Rotate With Mouse Move DEMO

最后

好了,本文到此结束,希望本文对你有所帮助

标签:Hover,进阶,效果,--,radius,Blur,position,border,鼠标
From: https://www.cnblogs.com/coco1s/p/18358267

相关文章

  • 精读代码,实战进阶&实践Task2
    背景从零入门AI生图原理&实践是Datawhale2024年AI夏令营第四期的学习活动(“AIGC”方向),基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习——适合想入门并实践AIGC文生图、工作流搭建、LoRA微调的学习者参与学习内容提要:从文生图实现方案逐渐进阶,教程......
  • SQL进阶技巧:利用Stack()函数进行列转行及动态列转行方法
    目录0需求描述1数据分析 2 stack()函数应用stack(intn,v_1,v_2,...,v_k)n设为3,将后面6个元素按顺序分为3行2列n设为2,将后面6个元素按顺序分为2行3列n设为3,将后面7个元素按顺序分为3行3列n设为6,将后面6个元素转为为6行1列 3小结0需求描述在hive数仓中......
  • 线段树进阶 Part 1
    线段树是信息学竞赛最常见的数据结构。本篇笔记总结技巧和应用,不介绍基本线段树算法。1.常见技巧1.1信息设计用线段树解决问题,首先得考虑维护哪些信息。若不带修,任何满足结合律且封闭的信息(称为半群)都是可维护的。结合律一般都有,封闭性帮助我们设计信息。例如区间最大子段......
  • MySQL数据分析进阶(十三)高效的索引
    ※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,笔记整理比较粗糙,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!)【中字】SQL进阶教程|史上最易懂SQL教程!10小时零基础成长SQL大师!!https://www.bilibili.com/video/BV1UE41147KC/?spm_id_from=333.1007.0.......
  • C语言问答进阶--4、基本运算符
    赋值运算符A:下面将介绍赋值操作符。它的符号就是 = .A:赋值操作符,就是把一个值赋值给左边的变量。正如以前说的形如a=1之类的表达就是赋值运算符的具体应用。也许有的人在编写代码的时候写过这种代码:#include "iostream.h"int main(){    int x;    1=x;......
  • Scrapy框架进阶攻略:代理设置、请求优化及链家网实战项目全解析
    scrapy框架加代理付费代理IP池middlewares.py#代理IP池classProxyMiddleware(object):proxypool_url='http://127.0.0.1:5555/random'logger=logging.getLogger('middlewares.proxy')asyncdefprocess_request(self,request,spider):......
  • SQL进阶技巧:断点缝合问题【如何按照业务规则对相邻行数据进行合并】
    目录0需求描述1数据准备2数据分析3小结 0需求描述如下图所示,按照定义的规则进行数据变换注意:b中的数值只有0和11数据准备withdataas(select2010 a,0bunionallselect2011 a,1bunionallselect2012 a,0bunionallselect2013 a,1bunionall......
  • 【408DS算法题】009进阶-二维数组的查找
    Index题目实现代码分析题目在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。​进阶要求——时间复杂度:......
  • 面向对象--进阶
    static关键字静态修饰符可以修饰成员变量和方法(一般是工具类)特点:1、被类的所有对象共享(比如oa在线办公人数)2、可以通过类名.的方式调用(推荐使用)3、随着类的加载而加载,优先于对象而存在(对象在调用的时候才创建)工具类的方法添加static修饰构造方法私有化(不允许创建对象......
  • 【408DS算法题】进阶011-20年真题_三元组的最小距离
    Index真题题目分析实现总结真题题目定义三元组(a,b,c)(a,b,c均为正数)的距离D=|a-b|+|b-c|+|c-a|给定3个非空整数集合S1、S2和S3,按升序分别存储在3个数组中。设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c)......