首页 > web前端 > js教程 > 正文

CSS Transition 需要点击两次才能生效的解决方案

霞舞
发布: 2025-10-01 12:12:26
原创
639人浏览过

css transition 需要点击两次才能生效的解决方案

本文旨在解决 CSS transition 在特定场景下需要点击两次才能生效的问题。通过分析问题代码,找出事件监听器重复绑定的原因,并提供修改后的代码示例,确保 transition 效果在第一次点击时就能正确触发。文章还将讨论如何避免类似问题的发生,以及如何优化 CSS transition 的性能。

问题分析

问题描述中,CSS transition 效果需要点击按钮两次才能生效,这通常是由于事件监听器绑定方式不正确导致的。在提供的代码中,transitionEffect 函数内部使用了 addEventListener 来绑定点击事件。这意味着每次点击按钮,都会向该按钮添加一个新的点击事件监听器。

第一次点击时,绑定了事件监听器,但 transition 效果并没有立即执行。第二次点击时,之前绑定的事件监听器才开始生效,从而触发了 transition 效果。

解决方案

正确的做法是在页面加载时,只绑定一次事件监听器。修改后的 transitionEffect 函数应该只包含 transition 相关的逻辑,而事件监听器的绑定应该在页面加载完成后执行。

立即学习前端免费学习笔记(深入)”;

以下是修改后的代码示例:

JavaScript:

AiTxt 文案助手
AiTxt 文案助手

AiTxt 利用 Ai 帮助你生成您想要的一切文案,提升你的工作效率。

AiTxt 文案助手 15
查看详情 AiTxt 文案助手
function transitionEffect() {
  var layers = document.querySelectorAll(".bottom-layer");
  for (const layer of layers) {
    setTimeout(switchVisible, 900);
    layer.classList.toggle("active");
  }
}

function switchVisible() {
  if (document.getElementById("main-cont")) {
    if (document.getElementById("main-cont").style.display == "none") {
      document.getElementById("main-cont").style.display = "block";
      document.getElementById("overlay-cont").style.display = "none";
    } else {
      document.getElementById("main-cont").style.display = "none";
      document.getElementById("overlay-cont").style.display = "block";
    }
  }
}

document.addEventListener("DOMContentLoaded", function() {
  const button = document.querySelector("#last");
  button.addEventListener("click", transitionEffect);
});
登录后复制

HTML:

<button id="last"> click</button>
<div id="main-cont">
  <h3>first page</h3>
</div>
<div id="overlay-cont">
  <div class="row">
    <div class="col-md-6 overlay-text" id="overlay-col">
      <h1> next page</h1>
    </div>
    <div class="col-md-6" id="overlay-col">

    </div>
  </div>
</div>
<div class="transition-cont">
  <div class="bottom-layer"></div>
  <div class="bottom-layer bottom-layer--2"></div>
  <div class="bottom-layer bottom-layer--3"></div>
</div>
登录后复制

CSS (与原代码相同):

#overlay-cont {
  display: none;
  z-index: 1;
}

.bottom-layer {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 100%;
  left: 0;
  bottom: auto;
  right: auto;
  background: #48466d;
  transition: all 0.7s cubic-bezier(0.645, 0.045, 0.355, 1);
}

.bottom-layer.active {
  top: -100%;
}

.bottom-layer--2 {
  background: #ecf3a3;
  transition-delay: 0.12s;
}

.bottom-layer--3 {
  background: #95a792;
  transition-delay: 0.4s;
}
登录后复制

代码解释:

  1. document.addEventListener("DOMContentLoaded", function() { ... });: 这段代码确保在整个 HTML 文档加载和解析完成后再执行 JavaScript 代码。 这避免了在 DOM 元素尚未完全加载时尝试访问它们的问题。
  2. const button = document.querySelector("#last");: 这行代码使用 document.querySelector 方法来获取 ID 为 "last" 的按钮元素。 const 关键字表示 button 变量是一个常量,一旦赋值后就不能再被重新赋值。
  3. button.addEventListener("click", transitionEffect);: 这行代码为按钮元素添加一个点击事件监听器。当按钮被点击时,transitionEffect 函数将被调用。 重要的是,这个事件监听器只被添加一次,而不是每次点击按钮时都添加。

避免重复绑定事件监听器

为了避免类似问题的再次发生,需要注意以下几点:

  • 事件监听器只绑定一次: 确保事件监听器只在页面加载时绑定一次,而不是在其他事件处理函数中重复绑定。
  • 使用事件委托: 对于动态添加的元素,可以使用事件委托的方式来绑定事件监听器。将事件监听器绑定到父元素上,然后通过事件冒泡来处理子元素的事件。
  • 移除事件监听器: 在不再需要事件监听器时,及时将其移除,避免内存泄漏。可以使用 removeEventListener 方法来移除事件监听器。

优化 CSS Transition 性能

CSS transition 可以为网页添加动画效果,但过度使用或不当使用可能会影响页面性能。以下是一些优化 CSS transition 性能的建议:

  • 使用 transform 和 opacity: 尽量使用 transform 和 opacity 属性来实现动画效果,因为这些属性的改变不会触发页面的重排(reflow)和重绘(repaint),性能更好。
  • 避免频繁触发 transition: 避免在短时间内频繁触发 transition,例如在 scroll 事件中触发 transition。可以考虑使用 requestAnimationFrame 来优化性能。
  • 使用 will-change 属性: 对于需要频繁改变的元素,可以使用 will-change 属性来提前告知浏览器,以便浏览器进行优化。

总结

通过分析问题代码,我们可以发现 CSS transition 需要点击两次才能生效的原因是事件监听器被重复绑定。通过修改代码,确保事件监听器只绑定一次,可以解决这个问题。同时,我们也需要注意避免重复绑定事件监听器,并优化 CSS transition 的性能,以提高网页的整体性能。

以上就是CSS Transition 需要点击两次才能生效的解决方案的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号