CSS 显示隐藏动画(动画失效问题)

news/2024/7/7 20:13:27

就像这个动画一样的效果,div 先是隐藏的,点击按钮后显示并且有动画效果,隐藏的时候同样。

  <button class="btn" id="btn">点击</button>
  <div class="box" id="box"></div>

  <script>
    const btn = document.getElementById('btn')
    const box = document.getElementById('box')
    let show = false
    btn.onclick = function () {
      if (show) {
        box.classList.add('fadeout')
        box.classList.remove('fadein')
      } else {
        box.classList.add('fadein')
        box.classList.remove('fadeout')
        
      }
      show = !show;
    }
  </script>

在css中,可以利用 animation 属性和 @keyframes 规则来实现元素显示与隐藏的动画效果,通过 @keyframes 规则,您能够创建动画。

  <style>
    .box {
      width: 50px;
      height: 50px;
      background: red;
      display: none;
    }
    .fadeout {
      animation: fadeout 1s;
    }
    .fadein {
      display: block;
      animation: fadein 1s;
      
    }
	/* 移出动画 */
    @keyframes fadeout {
      0% {
        opacity: 1;
        display: block;
      }
      100% {
        opacity: 0;
        display: block;
      }
    }
    /* 进入动画 */
    @keyframes fadein {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }
  </style>

在 CSS 中,display: none; 和 display: block; 是两种完全不同的属性,它们控制元素的显示方式。display: none; 会使元素不可见且不占据空间,而 display: block; 会使元素以块级元素的方式显示,并占据相应的空间。

因此,你不能直接在 display: none; 和 display: block; 之间应用动画效果,因为这两个属性之间的切换是瞬间完成的,没有中间状态可以应用动画。

这样就引发了一个问题:如果我们要设置类似淡入淡出的效果怎么办?就是让元素在消失/出现的同时产生动画怎么办?不要使用 transition 动画,而是用 animation 动画,并且在进入动画的时候设置元素的显示,然后在出动画帧定义的地方设置元素的显示。

    .fadein {
      /* 注意这行代码 */
      display: block; 
      animation: fadein 1s;
      
    }
	/* 移出动画 */
    @keyframes fadeout {
      0% {
        opacity: 1;
        /* 注意这行代码 */
        display: block;
      }
      100% {
        opacity: 0;
        /* 注意这行代码 */
        display: block;
      }
    }

此时我们已知掌握了动画的基本操作,接下来演示一个基本的弹窗动画。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      background: red;
      display: none;
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate3d(-50%, -50%, 0);
      padding: 12px;
      border-radius: 8px;
    }
    .fadeout {
      animation: fadeout 0.3s;
    }
    .fadein {
      display: block;
      animation: fadein 0.3s;
      
    }

    /* 移出动画 */
    @keyframes fadeout {
      0% {
        opacity: 1;
        display: block;
      }
      100% {
        opacity: 0;
        display: block;
      }
    }
    /* 进入动画 */
    @keyframes fadein {
      0% {
        transform: translate3d(-50%, -50%, 0) scale(0.9);
      }
      50% {
        transform: translate3d(-50%, -50%, 0) scale(1.1);
      }
      100% {
        transform: translate3d(-50%, -50%, 0) scale(1);
      }
    }
  </style>
</head>
<body>
  <button class="btn" id="btn">按钮</button>
  <div class="box" id="box">您确定提交数据吗?</div>

  <script>
    const btn = document.getElementById('btn')
    const box = document.getElementById('box')
    let show = false
    btn.onclick = function () {
      if (show) {
        box.classList.add('fadeout')
        box.classList.remove('fadein')
      } else {
        box.classList.add('fadein')
        box.classList.remove('fadeout')
        
      }
      show = !show;
    }
  </script>
</body>
</html>

http://lihuaxi.xjx100.cn/news/2060879.html

相关文章

Cisco Secure ACS 5.8.0.32 安装 + Crack 教程

Cisco Secure ACS 5.8.0.32 安装 Crack 教程 前言系统环境开始安装 开始破解导入授权文件 前言 在ESXi 6.7 上经历过无数次的安装尝试 测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程. 系统环境 服务器 : Dell R720xd CPU : E5-2620 v2 系统 : ESXi 6.7…

UE4 Niagara 关卡3.1官方案例解析二

自己尝试做做&#xff0c;打乱顺序 1、新建空的niagara system&#xff0c;添加空的发射器。更换渲染器为网格体渲染器并添加网格体。 2、发射器更新里面添加Spawn Rate&#xff0c;发射个粒子看看 效果图&#xff1a; 3、采样静态网格体&#xff0c;网格体粒子出生于静态网格…

电商数据分析13——电商平台退货率分析与降低策略

目录 写在开头1. 退货率分析的重要性1.1 退货现象的影响1.2 退货数据的收集与分析 2. 数据分析揭示的主要退货原因2.1 产品描述不准确2.2 物流配送问题2.3 产品质量问题 3. 基于数据分析的退货率降低策略3.1 优化产品描述和图片3.2 改进物流配送服务3.3 加强质量控制和售后服务…

【飞桨EasyDL】飞桨EasyDL发布的模型转换onnx(附工程代码)

一个愿意伫立在巨人肩膀上的农民...... 一、paddle转onnx转rknn环境搭建 paddle转onnx和onnx转rknn两个环境可以分开搭建&#xff0c;也可以搭建在一起。这里选择分开搭建&#xff0c;先搭建paddle转onnx。 1.1、创建环境 选择python3.8.13包进行创建环境 conda create --nam…

前端导出word文件的多种方式、前端导出excel文件

文章目录 纯前借助word模板端导出word文件 &#xff08;推荐&#xff09;使用模板导出 前端通过模板字符串导出word文件前端导出 excel文件&#xff0c;node-xlsx导出文件&#xff0c;行列合并 纯前借助word模板端导出word文件 &#xff08;推荐&#xff09; 先看效果&#xf…

Strange a+b

解法&#xff1a; #include<iostream> #include<vector> #include<algorithm> using namespace std; #define endl \n bool cmp(string& a, string& b) {if (a.size() ! b.size()) {return a.size() > b.size();}else {for (int i 0; i < a.…

STM32自学☞DMA数据转运以及DMA+AD多通道案例

一、先给大家简单介绍下DMA相关的函数 ①DMA_DeInit(); 恢复缺省配置 ②DMA_Init(); 初始化 ③DMA_StructInit(); 结构初始化 ④DMA_Cmd(); 使能 ⑤DMA_ITConfig(); 中断输出使能 ⑥DMA_SetCurrDataCounter(); 设置当前数据寄存器 ⑦DMA_GetCurrDataCounter(); 获取当前…

threejs显示本地硬盘上的ply文件,通过webapi

由于ply文件是第三方提供的&#xff0c;threejs无法用绝路路径的方式显示ply 所以想通过webapi把ply通过url地址的方式给threejs 1.webapi部分 /// <summary>/// 获取PLY文件/// </summary>/// <returns></returns>[HttpPost(Name "GetPly&qu…