js+css实现简单的弹框动画

news2024/11/17 1:51:03

效果图

只是一个简单的演示demo,但是可以后面可以优化样式啥的

在这里插入图片描述

  • 刚开始元素的display为none,然后,为了给元素展示时添加一个动画,首先要添加样式类名show,让它覆盖display:none,变得可见。然后,添加元素放大的动画样式类名
  • 隐藏的时候,也需要有动画,并且动画结束完成之后,元素的display应当恢复成原来的none,也就是变得不可见。因此,需要监听动画完成事件。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>

        /* body占满整个页面 */
        body {
            margin: 0;
            height: 100vh;
        }

        /* 设置box1默认大小,以及设置 display:none,让它一开始就不被看见 */
        .box1 {
            width: 400px;
            height: 200px;
            background-color: #bfa;
            margin: 10px auto;
            display: none;
        }

        /* 定义元素放大的动画 */
        @keyframes scaleup {
            0% {
                transform: scale(0)
            }
            100% {
                transform: scale(1)
            }
        }
        /* 定义元素放大的类 */
        .scaleup {
            animation: scaleup 0.5s;
        }

        /* 元素如果要显示, 必须通过添加该类的方式(约定) */
        .show {
            display: block;
        }

        /* 元素缩小的动画 */
        @keyframes scaledown {
            0% {
                transform: scale(1)
            }
            100% {
                transform: scale(0)
            }
        }
        /* 定义元素缩小的类 */
        .scaledown {
            animation: scaledown 0.5s;
        }

    </style>
    <script>
        window.onload = () => {

            let box1 = document.querySelector('.box1')
            let openBtn = document.querySelector('.open')
            let closeBtn = document.querySelector('.close')
           
            openBtn.onclick = () => {

                if(box1.show) {/* 用于标记box1是否被打开过, 如果之前被打开过的话, 再次点击打开无效 */
                    return 
                }
                box1.show = true /* 标记打开过 */

                box1.classList.add('show')   /* 添加让元素显示的类 */
                box1.classList.add('scaleup')/* 添加元素显示时的动画 */

                let callback  = () => {
                    box1.classList.remove('scaleup') /* 动画完成后, 移除放大动画的类;为什么要移除呢?动画播放结束,这个类也就没用了,并且让下次可以继续指定放大的动画的样式类,来展示动画 */
                    box1.removeEventListener('animationend',callback) /* 动画完成后, 移除监听 */
                }
                box1.addEventListener('animationend', callback) /* 动画完成后, 执行指定的函数 */
            }

            closeBtn.onclick = () => {
                if(!box1.show) {
                    return
                }

                box1.classList.add('scaledown') /* 关闭时, 指定缩小的动画的样式类 */

                /* 缩小动画结束后, 应当要把这个框给隐藏掉, 就是把box1的display恢复成原来的none */
                let callback  = () => {
                    box1.classList.remove('show') /* 把show样式类去掉,就会用到box1类中的display:none了 */
                    box1.classList.remove('scaledown') /* 跟上面的解释一样 */
                    box1.removeEventListener('animationend',callback) /* 动画完成后, 移除监听 */
                    box1.show = false
                }
                box1.addEventListener('animationend', callback) /* 动画完成后, 执行指定的函数 */
            }
        }
    </script>
</head>
<body>
    <div class="container">
        <div class="box1 scaleup"></div>
    </div>
    <hr/>
    <button class="open">open</button>
    <button class="close">close</button>
</body>
</html>

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

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

相关文章

Day951.认知负载 -遗留系统现代化实战

认知负载 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于认知负载的内容。 一、怎样理解认知负载&#xff1f; 作为开发人员&#xff0c;不管是不是工作在遗留系统上&#xff0c;一定面临过来自业务方或项目经理的灵魂拷问&#xff1a; 为什么这个需求这么简单&…

车载网络 - Autosar网络管理 - 跳转状态

四、Autosar网络管理跳转状态 网络模式对应报文状态 Autosar网络管理报文各个状态对应的网络管理报文和应用报文的发送和接收状态。 网络模式 网络管理报文 应用报文 收发类型 发送报文 接收报文 发送报文 接收报文 总线睡眠模式(BSM) No Yes No NA 准备总线睡眠模…

探索Whisper语音识别

问题一&#xff1a;python多版本切换 背景&#xff1a;有了anaconda环境 还有一个c盘的不知道什么东西 我准备下载一个python3.9.9 去官网 然后安装&#xff0c;安装之前一定要把原来的python卸载干净。 3.9.9安装不上&#xff0c;我用3.10 切换的话&#xff0c;就是去环境…

总结828

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;回环诵读之前的文章&#xff0c;背150个单词&#xff0c;背《冰与火之歌》-守夜人誓词 高等数学&…

《Effective C++》读书笔记(二):构造/析构/赋值运算(条款05~条款12)

目录 1. 条款05&#xff1a;了解C默默编写并调用哪些函数 2. 条款06&#xff1a;若不想使用编译器自动生成的函数&#xff0c;就该明确拒绝 3. 条款07&#xff1a;为多态基类virtual析构函数 4.条款08&#xff1a;别让异常逃离析构函数 5.条款09&#xff1a;绝不在构造和析…

Vue CLI 服务

使用命令 在一个 Vue CLI 项目中&#xff0c;vue/cli-service 安装了一个名为 vue-cli-service 的命令。你可以在 npm scripts 中以 vue-cli-service、或者从终端中以 ./node_modules/.bin/vue-cli-service 访问这个命令。 这是你使用默认 preset 的项目的 package.json&…

2023红明谷杯部分WP

0x00 签到 一直点就能得到flag 0x01 Dreamer 拿到题感觉有点儿懵 先下发靶机看一眼 梦想家CMS&#xff0c;好嘛&#xff0c;我直接一手查找官网 直接一手演示中心碰运气 哎嘿嘿&#xff0c;运气不错进去了&#xff0c;突然想起之前有位大佬写的关于Dreamer CMS的代码审…

【Linux网络设置】

目录 一、查看网络接口信息1.1、查看所有活动的网络接口信息1.2、查看指定网络接口信息 二、查看主机名称2.1、hostname命令2.2、永久设置主机名 三、查看路由表条目route命令 四、查看网络连接情况4.1、netstat命令4.2、ss命令 五、测试网络连接ping命令 6、跟踪数据包tracerr…

CorelDRAW2023最新版本配置及新功能介绍

从简单的线框到令人称叹的水平&#xff0c;使用CorelDRAW Graphics Suite 2023开始您的设计之旅&#xff1a;一套完整的专业图形设计应用程序&#xff0c;用于矢量插图、布局、照片编辑等。CorelDRAW平面设计软件通常也被叫做CDR&#xff0c;CDR广泛应用于排版印刷、矢量图形编…

关于电脑出厂时间查询工具的构思

在做一个单位的计算机盘点、管理的时候&#xff0c;很容易遇见需要知道电脑的采购时间&#xff0c;或者出厂时间。这个信息能够帮助管理人员决定电脑是否该按定期报废制度进行报废或更换。 目前为止&#xff0c;作者接触过的各类电脑&#xff0c;没有看到过哪台电脑有专门的一…

windows系统中安装目标检测平台detectron2

更多内容&#xff0c;欢迎访问老五笔记 detectron2是Facebook研发并开源的目标检测平台&#xff0c;包含了大量业内最具代表性的目标检测、图像分割、关键点检测算法等。Detectron2基于新版的Pytorch进行更新&#xff0c;包含了更大的灵活性与扩展性。​ 笔者将在本文中介绍如…

IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路

IS220UCSAH1A利用电子和空穴两种载流子导电的&#xff0c;所以叫做双极型电路 美国的通用电气公司&#xff08;General Electric Company&#xff0c;以下简称 GE&#xff09;想要称霸整个工业互联网&#xff0c;但却失败了。为什么呢&#xff1f; 多年来&#xff0c;GE 一直在…

关于CSDN文章内嵌视频自动播放问题

关于CSDN文章内嵌视频自动播放问题 1. 源由2. 分析3. 反馈4. 沟通5. 总结6. 附录-Firefox配置7. 附录-Microsoft Edge配置 1. 源由 这个问题是4月初发现的&#xff0c;主要现象就是页面上的视频一起自动播放了。 鉴于笔者有不少帖子都是文字、表格、图片、视频结合的。视频是…

机器学习:opencv案例——人脸检测

目录标题 实验数据实验原理实验步骤实验结果 实验数据 lena.jpg face3.jpg video.mp4 实验原理 &#xff08;1&#xff09;图片灰度转换 OpenCV 中有数百种关于在不同色彩空间之间转换的方法。 当前&#xff0c; 在计算机视觉中有三种常用的色彩空间&#xff1a; 灰度、 BG…

redis lpush rpop List消息队列实现

List 队列&#xff1a; 生产者存入消息&#xff1a; LPUSH queue2 msg1 LPUSH queue2 msg2 LPUSH queue2 msg3 消费者消费消息&#xff1a; RPOP queue2 RPOP queue2 RPOP queue2写个死循环消费&#xff1a; while true://没消息阻塞等待,3秒超时返回null,设置0时没消息一直浪…

JavaSE学习进阶day07_02 异常

第三章 异常 3.1 异常概念 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0…

Android---屏幕适配

为什么要适配 由于 Android 系统的开放性&#xff0c;任何用户、开发者、OEM 厂商、运营商都可以对 Android 进行定制&#xff0c;于是导致运行 Android 的设备多种多样&#xff0c;它们有着不同的屏幕尺寸和像素密度。尽管系统可以通过基本的缩放和调整大小功能使界面适应不同…

【LeetCode: 53. 最大子数组和 | 暴力递归=>记忆化搜索=>动态规划 | 分治法 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

抽象类,内部类,匿名类

java学习第十天 抽象类 1.用abstract关键字来修饰一个类时,这个类就叫抽象类 访问修饰符 abstract 类名 { } 2.用abstract关键字来修饰一个方法时,这个方法就是抽象方法访问修饰符abstract返回类型方法名(参数列表);//没有方法体 3.抽象类的价值更多作用是在于设计,是设计者…

ROS学习第十四节——参数服务器控制小乌龟

1.使用命令修改参数服务器 单独使用命令启动小乌龟节点&#xff0c;不是用lanuch文件&#xff0c;不启动键盘控制节点 rosrun turtlesim turtlesim_node 使用命令打印参数服务器参数列表 rosparam list 修改小乌龟节点的背景色 rosparam set /turtlesim/background_b 自定…