css实现画面转场以及边框线条动画

news2024/10/5 13:50:25

效果预览
在这里插入图片描述
在实现转场效果之前,需要先了解cssclip-path属性,该属性就是实现转场的核心属性,clip-path属性可以使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。也就是说裁切的大小不会超过实际的大小,超出的隐藏,实际大小内的显示。
clip-path的属性有下面几个:

属性说明
inset()四个参数,上右下左, 定义一个 inset 矩形。
circle( )定义一个圆形, 语法:circle(x轴(大小) at x轴坐标 y轴坐标); at后为剪切的位置,第一个参数左右,第二个参数上下
ellipse();定义一个椭圆(使用两个半径和一个圆心位置)。语法:ellipse(x轴偏移 y轴偏移 at x轴坐标 y轴坐标)
polygon();定义一个多边形(使用一个 SVG 填充规则和一组顶点)。四个参数,上右下左,每个位置的第一个参数代表左右偏移,第二个参数代表上下偏移
path();定义一个任意形状(使用一个可选的 SVG 填充规则和一个 SVG 路径定义)。

详细说明请看文档:https://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path

这里以circle()属性做演示,circle可以定义一个圆形(使用一个半径和一个圆心位置),第一个参数为半径也就是大小,第二个参数为圆心位置,也就是x、y轴的坐标。
在这里插入图片描述
了解了这个之后就可以开始写转场动画了,先定义原始的展示元素vue.svg,当鼠标移入vue.svg元素时显示转场后的动画vite.svg,并且转场后的动画(vite.svg)要覆盖原动画(vue.svg)。

<div class="fillAnimation" @mouseenter="touch">
     <img src="../assets/vue.svg" style="width:200px;" alt="">
        
     <!-- 转场后的动画 -->
     <div :class="touchStatus ? 'touch clipPathAnimation' : 'clipPathAnimation'">
          <img src="../assets/vite.svg" style="width:200px;" alt="">
     </div>
</div>

// js部分
// 鼠标移入
const touchStatus = ref(false)
const touch = () => touchStatus.value = true
.fillAnimation{
    width: 300px;
    height: 200px;
    border-radius: 10px;
    overflow: hidden;
    position: relative;
    background-color: cadetblue;
    display: flex;
    justify-content: space-around;
    align-items: center;
}
.clipPathAnimation{
    width: 300px;
    height: 200px;
    position: absolute;
    top: 0;
    left: 0;
    display: flex;
    justify-content: space-around;
    align-items: center;
    background-image: linear-gradient(to right, #12c2e9 , #c471ed);
    clip-path: circle(0px at 0 0px);  /*初始的时候大小为0,不显示*/
}
/*鼠标移入触发*/
.touch{
    animation: clipPathAn 2s forwards;  /* forwards 保持动画结束时的效果 */
}
@keyframes clipPathAn {
    from { clip-path: circle(0px at 0 0px);  }
    to { clip-path: circle(200% at 0 200px); }  /* 结束时大小变为200%,超出实际大小的隐藏,所以这里还是显示的原大小,也就是100%,这里变为200%是因为锚点在最左侧,100%只能显示原图的一半,所以要写成200%。 */
}

边框动画

clip-path的另一种实现:边框动画
在这里插入图片描述

clip-path只有裁剪的区域才会显示,利用animation动画,动态修改clip-path的值来实现元素移动的视觉效果。效果示意图:
在这里插入图片描述
实现该效果后,在动画上方添加一个蒙版,将不需要的部分遮住即可实现边框动画。

<div class="borderLine">
     <div class="borderCenter">
         <div class="innerButton">按钮</div>
     </div>
</div>
.borderLine{
    width: 150px;
    height: 70px;
    margin: 30px;
    position: relative;
    border-radius: 6px;
    overflow: hidden;
    /* 内部的盒子-遮住动画不需要的部分 */
    .borderCenter{
       position: absolute;
       top: 2px;
       left: 2px;
       width: calc(100% - 4px - 12px);
       height: calc(100% - 4px - 12px);
       text-align: center;
       border:6px solid white;
       border-radius: 4px;
       background-color: #fff;
       z-index: 10;
        .innerButton{
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: space-around;
            color: #fff;
            border-radius: 4px;
            background-color: #15c0e9;
        }
    }

    &::before,
    &::after
    {
        content: "";
        display: inline-block;
        width: 150px;
        height: 70px;
        position: absolute;
        background-color: #15c0e9;
        animation: insetRound 3s infinite linear;  /* linear 从开始到结束的速度相同的动画 */
    }
    &::after{
        animation: insetRound 3s infinite -1.5s linear;   /* insetRound动画 持续3s 无限循环 提前1.5s(负数提前,正数延迟) 匀速播放 */
    }
}

@keyframes insetRound {
    0%,100%{
        clip-path: inset(0 0 96% 0); /* x轴左上 */
    }
    25%{
        clip-path: inset(0 0 0 98%);  /* x轴左上 */
    }
    50%{
        clip-path: inset(96% 0 0 0);  /* x轴左上 */
    }
    75%{
        clip-path: inset(0 98% 0 0); /* x轴左上 */
    }

}

box-shadow实现:边框动画

类似的边框动画效果,使用box-shadow也可以实现。

.box{
   box-show : 0px 0px 0px 0px #ccc;
}

box-show有5个参数

  • 第一个参数: 控制元素阴影的左右位置
  • 第二个参数: 控制元素阴影的上下位置
  • 第三个参数: 控制元素阴影的模糊程度
  • 第四个参数: 控制元素阴影的大小(放大&缩小)
  • 第五个参数: 设置元素阴影的颜色

在这里插入图片描述
斜角度移动阴影显示的位置,将超出红色边框的部分隐藏即可。

<div class="borderShow">
     <div class="borderShowCenter">按钮</div>
</div>
.borderShow{
    width: 150px;
    height: 70px;
    margin: 30px;
    position: relative;
    border-radius: 6px;
    overflow: hidden;
    border: 1px solid red;
    display: flex;
    justify-content: space-around;
    align-items: center;

    &::before,
    &::after
    {
       content: '';
       position: absolute;
       top: 2px;
       left: 2px;
       width: calc(100% - 4px - 12px);
       height: calc(100% - 4px - 12px);
       text-align: center;
       border:6px solid white;
       border-radius: 4px;
       background-color: #fff;
       animation: showRound 3s infinite linear;
    }

    &::after{
        animation: showRound 3s infinite -1.5s linear; /* insetRound动画 持续3s 无限循环 提前1.5s(负数提前,正数延迟) 匀速播放 */
    }

    /* 内部的盒子 */
    .borderShowCenter{
       position: absolute;
       top: 8px;
       left: 8px;
       width: calc(100% - 4px - 12px);
       height: calc(100% - 4px - 12px);
       text-align: center;
       border-radius: 4px;
       display: flex;
       justify-content: space-around;
       align-items: center;
       color: #fff;
       background-color: #c073ed;
       z-index: 10; /* 覆盖伪元素 */
    }
}
@keyframes showRound {
    /* box-shadow : x轴 y轴 模糊 放大 颜色; */
    0%,100%{
        box-shadow: 0px -66px 0px 0px #c073ed; /* 上 */
    }
    25%{
        box-shadow: 146px 0px 0px 0px #c073ed; /* 右 */
    }
    50%{
        box-shadow: 0px 66px 0px 0px #c073ed; /* 下 */
    }
    75%{
        box-shadow: -146px 0px 0px 0px #c073ed; /* 左 */
    }
}

在这里插入图片描述


案例源码:https://gitee.com/wang_fan_w/css-diary

如果觉得这篇文章对你有帮助,欢迎点赞、收藏、转发哦~

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

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

相关文章

测牛学堂:接口测试基础理论和工具的使用

接口测试流程总结 1 需求分析&#xff0c;看产品经理的需求文档 2 接口文档解析&#xff0c;开发编写的api接口文档 3 设计测试用例 4脚本开发 5 执行及缺陷跟踪 6 生成测试报告 7接口自动化持续集成 测试解析接口文档 接口文档&#xff0c;又称为api文档&#xff0c;是由后…

SpringCloud-高级篇(二)

目录&#xff1a; &#xff08;1&#xff09;限流规格-流控模式 入门案例&#xff1a;直接模式 关联模式&#xff1a; 链路模式&#xff1a; &#xff08;2&#xff09; 流控效果&#xff1a;warm up 排队等待&#xff1a; &#xff08;3&#xff09;热点参数限流&#xff1…

tar和gzip压缩和解压

打包和压缩的区别&#xff1a;打包&#xff1a;将多文件 封装在一起压缩&#xff1a;将多文件 封装在一起 通过特定的算法 将冗余的数据 进行删除tar默认是打包命令&#xff0c;如果想用tar进行压缩 必须加选项1、gzip格式压缩&#xff1a;tar zcvf 压缩包包名 文件1 文件2 文件…

Java集合进阶(三)

文章目录一、Map1. 概述2. 基本功能3. 遍历4. 遍历学生对象5. 集合嵌套6. 统计字符出现次数二、Collections1. 常用方法2. 学生对象排序三、模拟斗地主一、Map 1. 概述 Interface Map<K, V>&#xff1a;K 是键的类型&#xff0c;V 是值的类型。 将键映射到值的对象&…

Redis高频面试题汇总(下)

目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey&#xff1f; 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染&#xff08;或满了…

20230311英语学习

Philosophy of Food: Guidelines for an Authentic Approach to Eating 饮食哲学&#xff1a;值得思考的问题 Whats Philosophical About Food? Philosophy of food finds its basis on the idea that food is a mirror.Eating mirrors the making of a self, that is, the …

vue3.js的介绍

一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架&#xff0c;尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本&#xff0c;在2016年9月30日发布了2.0Ghost in the Shell版本&#xff0c;目前项目由官方负责 vue的核心只关注图层&#xff0…

BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding

参考BERT原文[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (arxiv.org)【(强推)李宏毅2021/2022春机器学习课程】 https://www.bilibili.com/video/BV1Wv411h7kN/?p73&share_sourcecopy_web&vd_source30e93e9c70e…

CNN神经网络——手写体识别

目录 Load The Datesets Defining,Training,Measuring CNN Algorithm Datasets GRAET HONOR TO SHARE MY KNOWLEDGE WITH YOU This paper is going to show how to use keras to relize a CNN model for digits classfication Load The Datesets The datasets files are …

便携式井用自动采样器主要有哪些功能特点?

如图此款井用采样器整机小巧&#xff0c;非常适合狭小领域使用&#xff0c;携带方便&#xff0c;采样精准&#xff0c;可以延伸放到井下进行工作。尤其适合&#xff1a;窨井、下水道、沟渠 等现场条件恶劣的工作场合。可帮助采样人员采取到具有代表性的水样从而进行检测 参数特…

笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据

如果笔记本固态盘数据丢失怎么办&#xff1f;笔记本固态盘怎么恢复数据&#xff1f;下面将为大家详细地介绍一下笔记本固态硬盘数据恢复的三种实用方法&#xff0c;希望对大家有所帮助。一、简单恢复方法笔记本固态硬盘数据删除以后&#xff0c;较为简单直接的恢复方法就是从回…

《C++代码分析》第三回:类成员函数覆盖父类函数的调用(分析this指针的变化)

一、前言 在C的学习中我们知道&#xff0c;子类是可以覆盖父类的方法&#xff0c;这里我们探讨一下子类方法调用父类方法时this指针时如何变化的。 二、示例代码 #include "windows.h" #include "windef.h" #include <iostream> #include <tch…

自学大数据第六天~HDFS命令

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…

蓝桥杯嵌入式(G4系列):定时器输出可调PWM

前言&#xff1a; 蓝桥杯定时器输出PWM的考点在历届真题中的出现次数较多&#xff0c;而且之前关于STM32的学习&#xff0c;我对于使用STM32Cubemx配置PWM的方式确实不是很熟悉&#xff0c;这里简单记录一下自己的学习过程。 STM32Cubemx配置部分&#xff1a; 这里我们是改编真…

yocto编译烧录和脚本解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、初始化构建目录二、imx-setup-release.sh脚本解析三、编译单独编译内核四、烧录总结前言 本篇文章主要讲解如何在下载好源码之后进行编译和yocto的脚本解析…

剑指 Offer II 027. 回文链表

题目链接 剑指 Offer II 027. 回文链表 easy 题目描述 给定一个链表的 头节点 head&#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 示例 1&#xff1a; 输入: head [1,2,3,3,2,1] 输出: true 示例…

多目标遗传算法NSGA-II原理详解及算法实现

在接触学习多目标优化的问题上&#xff0c;经常会被提及到多目标遗传算法NSGA-II&#xff0c;网上也看到了很多人对该算法的总结&#xff0c;但真正讲解明白的以及配套用算法实现的文章很少&#xff0c;这里也对该算法进行一次详解与总结。会有侧重点的阐述&#xff0c;不会针对…

理解并解决【跨域】问题--通过代理或【CROS】

文章目录一.理解跨域问题引起跨域问题的原因浏览器的同源策略二.跨域问题的解决办法解决方法1-------代理&#xff08;前端配置&#xff09;解决方法2-----开启跨域资源共享CORS&#xff08;后端&#xff09;知识小贴士一.理解跨域问题 主要出现在前后端分离项目 引起跨域问题…

磨金石教育摄影技能干货分享|春之旅拍

春天来一次短暂的旅行&#xff0c;你会选择哪里呢&#xff1f;春天的照片又该如何拍呢&#xff1f;看看下面的照片&#xff0c;或许能给你答案。照片的构图很巧妙&#xff0c;画面被分成两部分&#xff0c;一半湖泊&#xff0c;一半绿色树林。分开这些的是一条斜向的公路&#…

合并两个链表(自定义位置合并与有序合并)LeetCode--OJ题详解

图片: csdn 自定义位置合并 问题&#xff1a; 给两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中 下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点 的位置。 比如&#xff1a; 输入&#xff1a;list1 [1…