首页 前端知识 CSS 显示隐藏动画(动画失效问题)

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

2024-04-21 10:04:02 前端知识 前端哥 752 761 我要收藏

就像这个动画一样的效果,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>
转载请注明出处或者链接地址:https://www.qianduange.cn//article/5569.html
标签
评论
发布的文章

CSS(8)空间转换 动画

2024-04-29 12:04:29

CSS介绍(4)--背景属性

2024-04-29 12:04:26

Web学习记录---CSS(1)

2024-04-29 12:04:17

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!