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

打开图片lightbox触发的scroll lock在history back后仍生效如何解决

问题原因

你当前的实现通过hash锚点跳转打开lightbox,浏览器会自动将带lightbox hash的地址推入历史记录栈。用户点击后退按钮时,仅会触发地址栏hash回退,不会触发绑定在lightbox关闭按钮上的ScrollUnlock函数,因此页面的overflow: hidden属性没有被移除,导致滚动持续锁定。

解决方案

新增hashchange事件监听,当地址栏hash不符合打开的lightbox规则时,自动触发滚动解锁即可,同步可以优化原有滚动操作的DOM选择逻辑,提高代码稳定性。

修改后的完整代码如下:

<html>
<body>
    <div class="desktop">
        <img src="docs/docs_overview_desktop.jpg" width="100%" height="auto" usemap="#desktop">
        <map name="desktop">
            <area shape="rect" coords="2057.143,0,2742.857,960" href="#lightbox_000" onclick="ScrollLock()">
        </map>
    </div>
    <div class="lightbox" id="lightbox_000">
        <img src="docs/docs_000.jpg" usemap="#lightbox_000">
        <map name="lightbox_000">
            <area shape="rect" coords="200,200,500,500" href="#_" onclick="ScrollUnlock()">
        </map>
    </div>
    <script>
        // 页面加载完成后绑定监听
        window.addEventListener('DOMContentLoaded', () => {
          // 初始化时判断当前hash是否对应lightbox,匹配就锁定滚动
          checkLightboxStatus()
          // 监听hash变化,每次hash变化都检查lightbox状态
          window.addEventListener('hashchange', checkLightboxStatus)
        })

        function checkLightboxStatus() {
          const currentHash = window.location.hash
          // 判断当前hash是否对应存在的lightbox元素
          if (currentHash.startsWith('#lightbox_') && document.querySelector(currentHash)) {
            ScrollLock()
          } else {
            ScrollUnlock()
          }
        }

        function ScrollLock()
        {
            document.documentElement.style.overflow = 'hidden';
        }
        function ScrollUnlock()
        {
            document.documentElement.style.overflow = 'visible';
        }
    </script>
</body>
</html>

可选优化

如果你不需要支持通过带hash的链接直接打开对应lightbox,可以将打开lightbox的area标签的href改为javascript:void(0),同时阻止默认跳转行为,打开lightbox的操作就不会被推入历史记录,用户点击后退会直接离开当前页面,也不会出现滚动锁定的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:15:05