前端例程20220914:带悬停动画登陆页面

2023-11-11

演示

在这里插入图片描述

原理

对登陆框监听鼠标进入(mouseenter)和退出(mouseleave)事件。在鼠标进入时添加一个元素,并设置其扩大的动画;在鼠标退出时设置元素动画,并在动画完成后删除元素。

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <title>带悬停动画登陆页面</title>

    <style>
        * {
            padding: 0;
            margin: 0;
            user-select: none;
            box-sizing: border-box;
        }

        html,
        body {
            height: 100vh;
        }

        /* 全局色表 */
        :root {
            --color-bg: #304050;
            --color-bg-login: #34495D;
            --color-text: #eeeeee;
            --color-span: #907070;
        }

        body {
            display: flex;
            align-items: center;
            justify-content: center;
            background: var(--color-bg);
        }
    </style>

    <!-- 以下是登陆页面的基本样式 -->
    <style>
        .login {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            width: 20rem;
            height: 28rem;
            background: var(--color-bg-login);
            border-radius: 1rem;
            box-shadow: 1rem 1rem 2rem rgba(0, 0, 0, 0.1);
        }

        .login>h1 {
            font-size: 3rem;
            font-weight: normal;
            color: var(--color-text);
            margin: 1rem;
            z-index: 1;
        }

        .login>input {
            width: 12rem;
            height: 2rem;
            outline: none;
            background: transparent;
            border: none;
            border-bottom: 2px solid var(--color-text);
            color: var(--color-text);
            margin: 1rem;
            z-index: 1;
        }

        .login>input::placeholder {
            color: rgba(255, 255, 255, 0.7);
        }

        .login>button {
            width: 10rem;
            height: 2rem;
            background: transparent;
            outline: none;
            border-radius: 1rem;
            border: 2px solid var(--color-text);
            color: var(--color-text);
            margin: 1rem;
            cursor: pointer;
            z-index: 1;
        }

        .login>button:active {
            backdrop-filter: invert(100%);
        }
    </style>

    <!-- 以下是动画部分样式 -->
    <style>
        .login {
            position: relative;
            overflow: hidden;
        }

        /* 下面使用span元素作为动画载体 */
        span {
            position: absolute;
            border-radius: 50%;
            background-color: var(--color-span);
            transform: translate(-50%, -50%);
        }

        /* 鼠标进入login时的动画 */
        @keyframes mouseenter {
            0% {
                width: 0;
                height: 0;
            }

            100% {
                width: 80rem;
                height: 80rem;
            }
        }

        /* 鼠标离开login时的动画 */
        @keyframes mouseleave {
            0% {
                width: 80rem;
                height: 80rem;
            }

            100% {
                width: 0;
                height: 0;
            }
        }
    </style>
</head>

<body>
    <div class="login" id="login">
        <h1>Login</h1>
        <input type="text" placeholder="Username">
        <input type="text" placeholder="Password">
        <button>Log In</button>
    </div>

    <script>
        const login = document.querySelector("#login");
        let span;
        const animetime = 0.3; // 单边动画持续时间

        // 鼠标从外部进入登陆框时动画
        login.addEventListener("mouseenter", (e) => {
            if (span) {
                return;
            }
            // 当前没有span元素则新建并赋值绑定
            span = document.createElement("span");
            span.style.top = `${e.offsetY}px`;
            span.style.left = `${e.offsetX}px`;
            span.style.animation = `mouseenter ${animetime}s ease-in forwards`;
            login.appendChild(span);
        });

        // 鼠标从登陆框退出时动画
        login.addEventListener("mouseleave", (e) => {
            if (!span) {
                return;
            }
            // 当前有span元素才需要退出操作
            span.style.top = `${e.offsetY}px`;
            span.style.left = `${e.offsetX}px`;
            span.style.animation = `mouseleave ${animetime}s ease-out forwards`;
            // 动画结束后移除span元素
            setTimeout(() => {
                span.remove();
                span = undefined;
            }, animetime * 1000);
        });
    </script>
</body>

</html>

补充说明

这个示例是参考自下面链接的的:
https://www.bilibili.com/video/BV1Bg411f7o5/
上面代码在一定情况下是会存在视觉上的问题的,主要存在当于鼠标快速滑动,在一个动画未完成就触发了另一个动画时就可以观察到相关现象。不过我觉得作为真实使用来说这种情况触发的概率一般,可以不管它。如果追求完美的话可以参考原视频。

当然原视频中的处理方案我觉得也一般,要更加完美的话可以使用 requestAnimationFrame 来处理。

更多例程

更多例程可以参考下面代码仓库:
https://github.com/NaisuXu/front-end-web-examples

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端例程20220914:带悬停动画登陆页面 的相关文章

  • ARM Cortex-A7时钟树综合实战分析

    ARM Cortex A7时钟树综合实战分析 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 吾爱 IC 高端技术交流社区 知识星球目前已经拥有1040 位星球成员 目前数字 IC 领域最大的高端技
  • 判断玩家是否在敌人的可视范围的方法Physics.OverlapSphere

    Physics OverlapSphere Vector 3 position float radius 该方法判断以一个点为中心 半径为radius的球中的碰撞体集合 所以返回值可以用 var 如var colliders Physics
  • spring mvc 控制器返回 HTML 页面

    之前的页面都是 jsp的 后面需要改为html 如下代码 之前的Log 是 jsp 后面改为 html Log html 页面单独运行正常 但是在控制器跳转是出错 如下 RequestMapping value login out publ
  • HCIPR&S222-V2.5一些总结

    1 IP Precedence取值中 代表immediate的是2 2 VRRP中路由器已经为Master设备 不会被更高优先级的Backup设备抢占 如果出现故障的情况会被Backup设备抢占 故障恢复后重新抢占为Master设备 默认为

随机推荐

  • java jmf视频播放器无法播放视频问题

    初学java 谢了一个参照网上代码写了个java jmf视频播放器 运行调试代码没问题 可是被这个avi视频格式纠结的要死 换了n多个avi格式视频依然不行 经过查阅资料发现现在网上流行的avi格式并不是真正的avi格式 大都是其他格式转化
  • 原生AJAX 的基本使用

    1 准备工作 1 1 安装node js Node js 中文网 1 2 安装express 服务端框架 Express 基于 Node js 平台的 web 应用开发框架 Express 中文文档 Express 中文网 1 2 1 初始
  • MYSQL多表连查

    前言 多表查询 也称为关联查询 指两个或更多个表一起完成查询操作 前提条件 这些一起查询的表之间是有关系的 一对一 一对多 它们之间一定是有关联字段 这个关联字段可能建立了外键 也可能没有建立外键 比如 员工表和部门表 这两个表依靠 部门编
  • 诚邀您参加Go+1.0发布会!与大咖共同探索行业生态!

    你想参与iPhone13抽奖吗 你想和大咖面对面交流吗 你想收获最前沿的行业动态吗 10 月15 日 Go Together Go 1 0发布会暨Go 开发者基金会启动仪式重磅来袭 活动中除七牛云 CEO Go 语言发明人许式伟以及Go 开
  • 传奇私服游戏支付接口申请(已解决)

    传奇游戏是一款经典打怪升级 PK游戏 盛大游戏公司于2001年9月发布 随后出现了众多传奇私服游戏版本 到现在依然受很多人喜爱 经历了多次升级换代 现已转变为游戏体验更加细腻的页游和手游 成为了小成本高收益的热门游戏 受到各游戏服务商和玩家
  • IO流基础总结

    IO流 File 1 File类概述和构造方法 File 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名 而已 它可以是存在的 也可以是不存在的
  • Allegro PCB设计中:结构文件DXF导入、更新、PCB板框更改

    1 将结构工程师输出的DXF文件导入到Allegro PCB设计中 文章来源地址https www yii666 com blog 453846 html action onAll 2 结构文件DXF多次更改导致PCB板框尺寸涉及的修改 1
  • C++STL:vector

    C STL中的vector是一种动态分配的数组 可以在运行时动态增加和删除元素 它也是C 中最常用的容器之一 以下是vector的使用介绍 引入头文件 在使用vector之前 需要添加头文件 include
  • nrm 源管理

    什么是nrm nrm 是一个 npm 源管理器 你可以快速地在 npm源间切换 大家在开发中可能会经常切换 npm 源 我们会使用命令切换 如 npm set registry https registry npm taobao org 或
  • Vue style中的 scoped 属性

    Vue 中存在 scoped 属性 HTML5中也存在一个 scoped 属性 而且 这两者都是针对 css 样式处理的属性 所以很多文章在 解释 Vue scoped 的时候 都会把两者混为一谈 直接进把 HTML5 scoped 的定义
  • Login控件用法,用自己的数据库提供login控件的数据源

    一 在配置web config文件 web config 文件
  • 基于SuperSocket 1.6版本的自定义帧过滤的源码分析(实现MODBUS通信)

    一 SuperSocket 1 6 自定义帧过滤的官方文档地址 http docs supersocket net v1 6 zh CN Implement Your Own Communication Protocol with IReq
  • QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制 也是QT的核心机制 在GUI编程中 我们经常需要在改变一个组件的同时 通知另一个组件做出响应 例如 一开始我们的Find按钮是未激活的 用户输入要查找的内容后 查找按钮就被激活 这就是输入框与
  • 细线表格 border-collapse:collapse;/*细线表格,合并边框*/

  • vue3获取reactive代理的target原数组

    使用toRaw获取 可从vue引入toRaw const t3 reactive age name 3 console log toRaw t3 age 官方示例
  • MySQL-SQL全部锁详解(下)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言
  • R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)

    终于开始攻克并行这一块了 有点小兴奋 来看看网络上R语言并行办法有哪些 赵鹏老师 R与并行计算 做的总结已经很到位 现在并行可以分为 隐式并行 隐式计算对用户隐藏了大部分细节 用户不需要知道具体数据分配方式 算法的实现或者底层的硬件资源分配
  • 关于ISP下载中 编译后自动下载代码不能执行完成的一点问题 补充keil未破解下载超范围问题

    在STC的ISP下载过程中 偶尔发现一点问题 首先在建立工程的时候没有按照自己的芯片选择 而是选择的通用型号 我在ISP中选择芯片型号后 打开串口和工程 没有提示问题 由于习惯 勾选了编译后自动下载工程 在后面的编写过程中 起初是没有问题的
  • sklearn 转换器和预估器

    刚学习sklearn时 没分清转换器的fit 和模型训练的fit 还以为是一个 结果学完了回过头来 才发现这些差异 再此记录一下 一 sklearn 转换器和预估器 转换器 Transformers 定义 转换器是一种可以对数据进行某种转换
  • 前端例程20220914:带悬停动画登陆页面

    演示 原理 对登陆框监听鼠标进入 mouseenter 和退出 mouseleave 事件 在鼠标进入时添加一个元素 并设置其扩大的动画 在鼠标退出时设置元素动画 并在动画完成后删除元素 代码