CSS Transition 仅在第二次点击时生效的解决方案

css transition 仅在第二次点击时生效的解决方案

本文旨在解决 CSS transition 在首次点击时无效,需要第二次点击才能生效的问题。通过分析问题代码,我们发现事件监听器被错误地放置在点击事件处理函数内部,导致监听器在第一次点击后才被绑定。本文将提供修改后的代码示例,确保 transition 效果在第一次点击时即可正常触发,并深入探讨事件监听器的正确使用方法。

问题分析

原始代码的问题在于,transitionEffect 函数内部绑定了 click 事件监听器。这意味着,只有在第一次点击 #last 按钮后,才会开始监听后续的点击事件。因此,transition 效果只能在第二次点击时生效。

function transitionEffect() {  const button = document.querySelector("#last");  button.addEventListener("click", function() {    var layers = document.querySelectorAll(".bottom-layer");    for (const layer of layers) {      setTimeout(switchVisible, 900);      layer.classList.toggle("active");    }  });}

解决方案

正确的做法是将事件监听器放在 transitionEffect 函数之外,确保在页面加载时就已绑定。同时,transitionEffect 函数本身应该只负责执行 transition 效果相关的操作。

以下是修改后的代码:

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

function transitionEffect() {  var layers = document.querySelectorAll(".bottom-layer");  for (const layer of layers) {    setTimeout(switchVisible, 900);    layer.classList.toggle("active");  }}// 在页面加载后绑定事件监听器document.addEventListener("DOMContentLoaded", function() {  const button = document.querySelector("#last");  button.addEventListener("click", transitionEffect);});

代码解释:

transitionEffect 函数现在只负责切换 .bottom-layer 元素的 active 类,以及调用 switchVisible 函数。document.addEventListener(“DOMContentLoaded”, function() { … }); 确保在页面完全加载后才执行其中的代码,避免在 DOM 元素尚未加载完成时尝试绑定事件监听器。在 DOMContentLoaded 事件处理函数内部,我们获取 #last 按钮的引用,并使用 addEventListener 方法将 transitionEffect 函数绑定到按钮的 click 事件上。

完整示例代码

  CSS Transition Example      #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;    }      

First Page

Next Page

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); });

注意事项:

确保 CSS transition 属性设置正确,包括 transition-property、transition-duration、transition-timing-function 和 transition-delay。避免在 JavaScript 中直接操作元素的 style 属性,尽量通过添加或移除 CSS 类来触发 transition 效果。使用 DOMContentLoaded 事件确保在 DOM 元素加载完成后再绑定事件监听器。

总结

正确地绑定事件监听器是确保 JavaScript 代码按预期执行的关键。通过将事件监听器放在 transitionEffect 函数之外,并在 DOMContentLoaded 事件触发后绑定,我们可以确保 CSS transition 效果在第一次点击时即可生效。 记住,理解事件循环和 DOM 加载时机对于编写高效、可靠的 JavaScript 代码至关重要。

以上就是CSS Transition 仅在第二次点击时生效的解决方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1525152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 17:25:59
下一篇 2025年12月20日 17:26:10

相关推荐

  • 深入理解JavaScript中基于键合并数组对象的方法

    本文详细阐述了如何在JavaScript中,利用数组的reduce方法高效地将一个包含多种类型对象的数组,根据共享的键(key)进行合并,从而生成结构统一、数据完整的复合对象。教程将通过示例代码,逐步解析合并逻辑,帮助开发者掌握数据聚合与重构的关键技巧。 问题场景:异构数据合并 在数据处理中,我们经…

    2025年12月20日
    000
  • jQuery实现动态汉堡菜单:点击切换显示与隐藏

    本教程详细介绍了如何利用jQuery实现一个动态的汉堡菜单功能。通过绑定点击事件,菜单可以在点击按钮时平滑地切换显示与隐藏状态,确保用户界面简洁高效。文章提供了清晰的HTML结构、核心JavaScript代码及其解析,并强调了初始状态设置和jQuery库引入等关键注意事项。 在现代Web开发中,汉堡…

    2025年12月20日
    000
  • 响应式网页设计:解决浏览器窗口动态调整时横向滚动到纵向滚动的切换问题

    本文旨在解决响应式网页设计中,当浏览器窗口从宽屏模式动态调整到窄屏模式(例如1025px以下)时,网站滚动方向无法正确从横向切换到纵向的问题。我们将深入分析导致此问题的CSS媒体查询和JavaScript事件处理逻辑,并提供一套完整的解决方案,确保网站在不同视口宽度下均能实现流畅且符合预期的滚动行为…

    2025年12月20日
    000
  • JavaScript中的装饰器(Decorators)目前有哪些实用的应用?

    装饰器通过声明式语法为类和方法添加功能,广泛用于性能监控、权限控制、防抖节流及元数据配置,实现代码解耦与复用,在TypeScript和现代框架中已成为提升开发效率的实用工具。 JavaScript中的装饰器虽然仍是实验性特性,需要Babel或TypeScript等工具支持,但已在多个实际场景中展现出…

    2025年12月20日
    000
  • JavaScript中基于不同键路径合并复杂JSON数据

    本教程详细讲解如何在JavaScript中合并一个包含复杂JSON对象的数组。面对键(key)可能存在于顶层或嵌套结构(如confidential.key)中的情况,我们将演示如何利用Array.prototype.reduce方法高效地将具有相同键的所有相关信息合并成一个单一的对象,从而生成结构清…

    2025年12月20日
    000
  • CSS Transition 需要点击两次才能生效的解决方案

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

    2025年12月20日
    000
  • 如何构建一个响应式、自适应的数据表格组件?

    答案:构建响应式数据表格需结合语义化HTML、CSS弹性布局与JavaScript交互优化,通过data-label属性、媒体查询与堆叠布局适配多端,支持可访问性与虚拟滚动等性能优化。 构建一个响应式、自适应的数据表格组件,关键在于让表格在不同屏幕尺寸下都能清晰展示数据,同时保持良好的交互体验。核心…

    2025年12月20日
    000
  • JSON 数据中空字符串的处理策略:避免 Nuxt 渲染错误

    本文旨在解决 Nuxt.%ignore_a_1% 应用在处理包含空字符串的 JSON 数据时可能遇到的渲染错误。我们将探讨两种核心策略:在数据加载阶段进行预处理,通过 JavaScript 过滤掉不符合要求的数据记录;以及在 Nuxt 组件模板中利用条件渲染(v-if)来避免渲染包含空字符串的组件。…

    2025年12月20日
    000
  • 如何实现一个支持撤销重做的状态管理库?

    答案是实现撤销重做状态管理库需维护当前状态、历史栈和未来栈,通过不可变更新与结构共享优化性能,提供setState、undo、redo及canUndo/canRedo等API,控制历史长度并支持节流与合并操作,确保内存安全与高效回溯。 实现一个支持撤销重做的状态管理库,核心在于记录状态的历史快照,并…

    2025年12月20日
    000
  • WordPress Elementor中GTM按钮点击追踪的嵌套元素解决方案

    本文旨在解决Google Tag Manager (GTM) 在WordPress Elementor网站中追踪按钮点击事件时,因元素嵌套导致触发器失效的问题。当点击事件实际发生在按钮的子元素上而非直接带有ID的父元素时,常规的ID匹配触发器会失效。通过利用GTM的“点击 – 所有元素”…

    2025年12月20日
    000
  • JavaScript中合并多个对象或数组到单个数组的技巧

    本教程详细探讨了在JavaScript中将多个独立对象或现有数组合并为一个新数组的多种方法。文章首先澄清了对象与数组的关键区别,随后深入讲解了Array.prototype.push()、ES6扩展运算符(…)以及Array.prototype.concat()的正确使用场景与实践技巧,…

    2025年12月20日
    000
  • 在 Node.js 环境中,Buffer 类是如何用于高效处理二进制数据流的?

    Buffer 是 Node.js 中用于高效操作二进制数据的核心类,适用于 TCP 流、文件 I/O 和网络请求。它在 V8 堆外分配固定大小的内存块,以 8 位字节存储数据,支持通过索引访问,每个字节范围为 0 到 255。创建方式包括 Buffer.from()、Buffer.alloc() 和…

    2025年12月20日
    000
  • Vuetify数据表格中行删除逻辑的正确实现

    本文探讨了在Vuetify数据表格中实现特定行删除时常遇到的一个问题:无论点击哪一行,总是删除表格的最后一行。核心问题在于删除确认逻辑中对数组索引的错误使用。通过存储待删除行的正确索引并在确认删除时直接使用该索引,而非重新查找一个可能已是不同引用的对象,可以有效解决此问题,确保每次都能准确删除目标行…

    2025年12月20日
    000
  • 解决JavaScript中localStorage数字存储的字符串拼接问题

    本教程旨在解决JavaScript点击游戏中,使用localStorage存储分数时遇到的字符串拼接而非数字累加问题。核心在于localStorage默认将所有值存储为字符串类型。文章将详细解释这一现象,并提供将localStorage获取的值显式转换为Number类型的解决方案,确保数值运算的正确…

    2025年12月20日
    000
  • 高效合并JavaScript对象数组:基于键的动态数据整合教程

    本教程详细阐述了如何在JavaScript中根据共享的键(无论其位于顶级还是嵌套结构中)高效合并复杂的对象数组。通过利用Array.prototype.reduce方法,我们能将分散的数据项聚合为结构完整、逻辑关联的单一对象,从而简化数据处理流程,并生成符合业务需求的目标数据结构。 1. 问题描述:…

    2025年12月20日
    000
  • 解决jQuery复选框与模态框交互时视觉状态不更新的问题

    本文详细探讨了在使用jQuery与模态框交互时,复选框视觉状态未能正确更新的常见问题及其解决方案。通过分析this上下文、模态框事件处理和正确的属性操作,提供了使用Bootstrap模态框和jQuery进行有效状态管理的专业教程,确保复选框的视觉和逻辑状态同步。 问题背景与分析 在使用jquery处…

    2025年12月20日
    000
  • 如何理解JavaScript中的单线程模型与并发处理?

    JavaScript是单线程语言,通过事件循环和任务队列实现异步并发。主线程执行同步代码时,异步任务由Web API处理完成后将回调加入队列。事件循环先执行宏任务,再清空微任务队列,确保Promise等微任务优先于下一轮宏任务执行。实际开发中可通过Promise、async/await、Web Wo…

    2025年12月20日
    000
  • 如何设计一个可扩展的前端错误监控与上报系统?

    前端错误监控系统需全面捕获JavaScript、Promise、资源加载及框架异常,结合自定义上报,通过结构化数据(含错误类型、堆栈、上下文等)上报,支持Source Map还原,采用模块化SDK设计,集成插件机制与生命周期钩子,优化上报策略如异步批量发送、本地缓存重发与采样控制,确保性能与数据完整…

    2025年12月20日
    000
  • JavaScript中的国际化(i18n)API有哪些高级用法?

    Intl API 提供高级功能实现精准国际化:1. NumberFormat 支持单位和紧凑格式,如“5 kilograms”“1.2K”;2. RelativeTimeFormat 生成“昨天”“后天”等自然语言时间;3. Collator 按语言习惯排序,支持忽略重音、数值排序;4. ListF…

    2025年12月20日
    000
  • JavaScript动态表格行中获取选中下拉框ID及对应行ID的教程

    本教程详细阐述了如何在JavaScript中高效获取动态添加的表格行中,下拉选择框(select)的选中值及其所属行(tr)的唯一ID。通过使用onchange事件监听、this关键字引用当前元素,并结合closest()方法向上查找父级行ID,本文提供了一套清晰且可复用的解决方案,确保在复杂动态表…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信