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

如何通过SCSS延迟Turbo Frame加载?现有方案存问题

解决Turbo Frame悬停时提前加载的问题

问题根源

你当前的SCSS仅实现了视觉上的延迟显示——鼠标悬停时立刻将#hoverContent设为display:inline-block,只是通过动画让透明度延迟变为1。但Turbo的loading="lazy"会检测元素是否处于可见DOM状态(哪怕视觉透明),因此会立刻发起加载请求,导致误触时产生不必要的网络请求。

解决方案:JS+CSS配合控制加载时机

通过JavaScript监听悬停事件,设置延迟定时器,只有用户悬停满指定时长后,再显示悬浮内容并触发Turbo Frame的加载。

1. 修改HTML(移除初始src)

先移除Turbo Frame的src属性,避免页面加载时或悬停初始阶段触发请求:

<div class="hoverWrapper">
  <span role="button" aria-describedby="id">
    <div class="card card--info">
        cool code block here
    </div>
  </span>
  <div id="hoverContent">
    <turbo-frame id="id" target="_top" role="tooltip" loading="lazy">
      Loading...
    </turbo-frame>
  </div>
</div>

2. 简化SCSS(保留基础样式与过渡)

去掉原有的动画逻辑,改用简单的过渡效果保证显示平滑:

.hoverWrapper {
  display: inline-block;
  position: relative;
}

#hoverContent {
  display: none;
  text-align: center;
  min-width: 15rem;
  top: -20px;
  left: 50%;
  transform: translate(-50%, -100%);
  color: var(--color-dark);
  background-color: var(--color-white);
  font-weight: normal;
  font-size: var(--font-size-s);
  border-radius: var(--border-radius);
  position: absolute;
  z-index: 99999999;
  box-sizing: border-box;
  box-shadow: var(--shadow-back);
  visibility: hidden;
  opacity: 0;
  transition: opacity 0.5s ease;

  i {
    position: absolute;
    top: 100%;
    left: 50%;
    margin-left: -12px;
    width: 24px;
    height: 12px;
    overflow: hidden;

    &::after {
      position: absolute;
      width: 12px;
      height: 12px;
      left: 50%;
      transform: translate(-50%,-50%) rotate(45deg);
      background-color: var(--color-white);
      box-shadow: var(--shadow-back);
    }
  }
}

3. 添加JS控制逻辑

监听鼠标进入/离开事件,通过定时器实现延迟加载,鼠标离开时立即终止:

document.querySelectorAll('.hoverWrapper').forEach(wrapper => {
  let hoverTimer;
  const hoverContent = wrapper.querySelector('#hoverContent');
  const turboFrame = hoverContent.querySelector('turbo-frame');
  const turboSrc = '你的实际请求地址'; // 替换为Turbo Frame的真实src

  wrapper.addEventListener('mouseenter', () => {
    // 设置1.5秒延迟(可根据需求调整)
    hoverTimer = setTimeout(() => {
      // 显示悬浮内容
      hoverContent.style.display = 'inline-block';
      hoverContent.style.visibility = 'visible';
      hoverContent.style.opacity = '1';
      // 触发Turbo Frame加载
      turboFrame.setAttribute('src', turboSrc);
    }, 1500);
  });

  wrapper.addEventListener('mouseleave', () => {
    // 清除定时器,终止加载流程
    clearTimeout(hoverTimer);
    // 隐藏悬浮内容
    hoverContent.style.display = 'none';
    hoverContent.style.visibility = 'hidden';
    hoverContent.style.opacity = '0';
    // 可选:移除src,下次悬停重新触发加载
    turboFrame.removeAttribute('src');
  });
});

原理说明

  • 鼠标进入时启动定时器,只有悬停满指定时长才会执行显示内容和设置Turbo src的操作;
  • 鼠标离开时立即清除定时器,避免未完成的加载请求;
  • 动态设置Turbo Frame的src属性,确保仅在用户真正需要时才发起网络请求,彻底避免误触导致的无效请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:57:02