【问题标题】:Get modal fade in in with display block CSS Javascript使用显示块 CSS Javascript 获取模式淡入
【发布时间】:2021-10-15 21:20:29
【问题描述】:

单击按钮时,我正在努力使模态变为动画。模态框在隐藏时不得占用空间。所以我想在未显示时使用 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">
    <link rel="stylesheet" href="style.css">
    <title>Document</title>
</head>

<body>

    <h2>Animating from <code>display:none</code> to <code>display:block</code></h2>
    <div id="box" class="box"></div>

    <button>TOGGLE VISIBILITY</button>

</body>
<script src="script.js"></script>

</html>


    .box {
        background: goldenrod;
        width: 300px;
        height: 300px;
        margin: 30px auto;
        transition: all 2s linear;
        display: none;
      }
    
      .show {
        display: block;
      }
      
      .visuallyshow {
        opacity: 0;
      }
    
    
    button {
        display: block;
        margin: 0 auto;
      }



let box = document.getElementById('box'),
    btn = document.querySelector('button');

btn.addEventListener('click', function () {

    if (box.classList.contains('show')) {
        box.classList.remove('show');
        setTimeout(function () {
            box.classList.remove('visuallyshow');
        }, 20);
    } else {
        box.classList.add('visuallyshow');
        box.addEventListener('transitionend', function (e) {
            box.classList.add('show');
        }
            // , {
            //     capture: false,
            //     once: true,
            //     passive: false
            // }
        );
    }

}, false);

【问题讨论】:

    标签: javascript css animation modal-dialog fadein


    【解决方案1】:
    .modal {
      display: none;
      opacity: 0;
      transition: opacity: 1s;
    }
    
    .modal.show {
      display: block;
      opacity: 1;
    }
    

    如果你 ...classList.add('show') 到模态框应该可以工作。

    我认为您的方法不起作用的原因是,为了应用过渡,它首先需要一个初始值,然后才能知道要过渡到什么。在上述情况下,您首先需要告诉它不透明度为 0,然后您实际上可以将其“转换”为 1。

    【讨论】:

      【解决方案2】:

      这是你需要做的:

      • 该框最初应具有opacity: 0,.visuallyshow 类应将其更改为 1。
      • setTimeout 中的延迟应该是 2000,而不是 20。2 秒等于 2000 毫秒。
      • 您需要切换添加和删除类的顺序。显示框时,首先需要添加display: block,然后添加opacity: 1。
      • 显示元素时,不应使用transitionend 事件处理程序,而应使用延迟1 毫秒的setTimeout。这将允许浏览器重新呈现布局,因此将能够进行转换。

      let box = document.getElementById('box'),
          btn = document.querySelector('button');
      
      btn.addEventListener('click', function () {
      
          if (box.classList.contains('show')) {
              box.classList.remove('visuallyshow');
              setTimeout(function () {
                  box.classList.remove('show');
              }, 2000);
          } else {
              box.classList.add('show');
              setTimeout(() => {
                  box.classList.add('visuallyshow');
              }, 1);
          }
      
      }, false);
      .box {
        background: goldenrod;
        width: 300px;
        height: 300px;
        margin: 30px auto;
        transition: opacity 2s linear;
        display: none;
        opacity: 0;
      }
      
      .show {
        display: block;
      }
      
      .visuallyshow {
        opacity: 1;
      }
      
      
      button {
        display: block;
        margin: 0 auto;
      }
      <h2>Animating from <code>display:none</code> to <code>display:block</code></h2>
      <div id="box" class="box"></div>
      
      <button>TOGGLE VISIBILITY</button>

      【讨论】:

        【解决方案3】:

        问题是您的 .box 样式表默认没有"opacity: 0;",这就是它无法顺利过渡的原因。除此之外,您的转换速度设置为 2000 毫秒,这非常慢。

        我在这个小提琴链接中提出了一个可行的解决方案: https://jsfiddle.net/32oyu6wf/3/

        我所做的是修改了 .box 样式表,使其具有 "opacity: 0;" 并调整了 javascript 事件监听器以相应地触发类。

        稍微检查一下小提琴,您可以在项目中重复使用相同的方法。

        let box = document.getElementById('box'),
          btn = document.querySelector('button');
        
        btn.addEventListener('click', function() {
          if (box.style.display == "block") {
            box.classList.remove("visuallyshow")
            setTimeout(function() {
              box.style.display = "none"
            }, 210);
        
          } else {
            box.style.display = "block";
            setTimeout(function() {
              box.classList.add("visuallyshow")
            }, 20);
          }
        
        }, false);
        .box {
          background: goldenrod;
          width: 300px;
          height: 300px;
          margin: 30px auto;
          transition: all 0.3s linear;
          display: none;
          opacity: 0;
        }
        
        .visuallyshow {
          opacity: 1;
        }
        
        button {
          display: block;
          margin: 0 auto;
        }
        <h2>Animating from <code>display:none</code> to <code>display:block</code></h2>
        
        
            <button>TOGGLE VISIBILITY</button>
            <div id="box" class="box"></div>

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 2016-10-21
          • 1970-01-01
          • 2017-05-27
          • 2023-01-03
          • 1970-01-01
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          相关资源
          最近更新 更多