You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery转ES6:fadeIn/fadeOut等效方案及透明度过渡问题

用ES6实现类似jQuery fadeIn/fadeOut的透明度过渡效果

嗨,我来帮你搞定这个过渡问题!你之前的代码失败主要有两个原因:一是.screen初始设为display: none,这种状态下元素不会触发CSS过渡;二是初始opacity直接设为1,没有从0到1的变化空间,自然看不到过渡效果。下面给你一套完整的ES6实现方案:

第一步:调整CSS基础样式

首先修改.screen的CSS,让它支持过渡效果:

.screen {
  position: fixed;
  z-index: 9;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  opacity: 0; /* 初始完全透明 */
  visibility: hidden; /* 视觉隐藏,同时保留元素在文档流中(让过渡生效) */
  background: rgba(26, 31, 33, 0.96);
  transition: opacity 300ms ease; /* 定义透明度过渡:时长300ms,缓动曲线ease */
}

为什么用visibility而不是display? 因为display: none会让元素脱离文档流,CSS过渡对这种状态变化无效;visibility: hidden只是隐藏元素的视觉表现,元素仍占据布局空间,能正常触发过渡效果。

第二步:ES6实现fadeIn和fadeOut函数

接下来写两个原生JS函数,对应jQuery的fadeIn和fadeOut:

fadeIn(淡入)

const fadeIn = (element, duration = 300) => {
  // 先让元素可见,再触发透明度变化
  element.style.visibility = 'visible';
  element.style.opacity = '1';
};

fadeOut(淡出)

const fadeOut = (element, duration = 300) => {
  element.style.opacity = '0';
  // 过渡结束后再隐藏元素,避免过渡中途元素还能被点击
  element.addEventListener('transitionend', function handler() {
    element.style.visibility = 'hidden';
    // 移除事件监听,防止重复触发
    element.removeEventListener('transitionend', handler);
  }, { once: true }); // { once: true } 可以让事件自动只触发一次,不用手动移除监听
};

第三步:在你的代码中调用

结合你现有的DOM加载逻辑,这样使用:

(function() {
  document.addEventListener("DOMContentLoaded", function() {
    const screenElement = document.querySelector('.screen');
    
    // 调用fadeIn让.screen淡入
    fadeIn(screenElement);
    
    // 如果需要淡出的话,比如绑定某个按钮点击事件
    // const closeBtn = document.querySelector('.close-btn');
    // closeBtn.addEventListener('click', () => fadeOut(screenElement));
  });
})();

这样调整后,你的.screen元素就能像jQuery的fadeIn/fadeOut那样平滑过渡啦!如果想要调整过渡的缓动效果,直接修改CSS里transition的ease参数就行(比如改成linear线性过渡,或者ease-in-out先慢后快再慢)。

内容的提问来源于stack exchange,提问作者fencepencil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:24:08