用插件panzoom做放到缩小,当鼠标停留在容器上面滚动滚轮时,效果被panzoom劫持,如何处理?

项目中用到了panzooom来做放大、缩小、拖拽等效果,布局如下:

大容器为panzooom容器,里面的东西可以拖拽、放大、缩小等,但是右上角需要放置一个公告栏,固定高度,公告多时会出现滚动条,希望鼠标停留在公告栏上,滚动滑轮时,时公告上下滚动,而不是外面的大容器放大缩小效果,该如何处理呢?

阅读 656
avatarAI BotBETA

要处理在使用 panzoom 插件时,鼠标停留在特定容器(如公告栏)上滚动时不触发 panzoom 的放大缩小效果,而是让滚动仅在该容器内部进行,你可以通过监听鼠标事件并阻止这些事件冒泡到 panzoom 容器来实现。以下是一个基本的解决方案:

HTML 结构示例

假设你的 HTML 结构大致如下:

<div class="panzoom-container">
    <!-- 这里是 panzoom 容器的内容 -->
    <div class="announcement-bar">
        <!-- 公告栏内容,可能有滚动条 -->
        <div class="announcement-content" style="overflow-y: auto; height: 100px;">
            <!-- 公告内容 -->
        </div>
    </div>
</div>

CSS 样式

确保 .announcement-content 有足够的 height 并设置了 overflow-y: auto; 以允许滚动。

JavaScript 处理

你可以使用 JavaScript 监听 .announcement-bar 内部的滚动事件,并阻止这个事件冒泡到 .panzoom-container。但是,由于鼠标滚轮事件通常不直接冒泡,你需要监听 wheel 事件并调用 event.stopPropagation()

document.querySelectorAll('.announcement-bar').forEach(bar => {
    bar.addEventListener('wheel', function(event) {
        event.stopPropagation();
        // 这里可以添加额外的逻辑,如限制滚动方向等
    }, { passive: false }); // 注意:设置 passive 为 false 以允许调用 preventDefault() 或 stopPropagation()
});

// 初始化 panzoom
// 假设你已经有了一个初始化 panzoom 的函数
initializePanzoom('.panzoom-container');

注意事项

  • 使用 { passive: false } 是因为你需要调用 event.stopPropagation()。在大多数现代浏览器中,默认的滚动事件监听器应该是 { passive: true } 以提高性能,因为它告诉浏览器你不需要调用 preventDefault()。但由于你需要控制事件传播,这里使用 { passive: false }
  • 确保 panzoom 插件的初始化不会干扰你阻止事件传播的逻辑。
  • 如果公告栏的滚动条在某些情况下仍然影响 panzoom 容器,可能需要检查其他可能的事件监听器或样式问题。

这个解决方案应该能满足你的需求,即鼠标在公告栏内滚动时,仅滚动公告栏内容,而不触发 panzoom 容器的放大缩小效果。

1 个回答
✓ 已被采纳

1、panZoom改用shift+鼠标滚轮来控制缩放呢?

xxx.addEventListener('wheel', (event) => {
  if (!event.shiftKey) return
  panzoom.zoomWithWheel(event)
})

2、给公告栏试一下css的pointer-events:auto属性

推荐问题
宣传栏