Firefox 3.6 中 HTML 的指针事件

pointer-events CSS 属性作为 SVG 的一部分已经存在很长时间,它可以通过控制鼠标事件是否发送到鼠标正下方元素或传递到它下面的元素来进行控制。在 Firefox 3.6 中,我们扩展了该属性,使其也可以应用于普通的 HTML 内容。

对于 SVG,您可以将 pointer-events 属性设置为多个值之一,但是对于 HTML,您只能将它设置为两个值之一:autonone

.foo {
  pointer-events: none;
}

pointer-events 设置为 none 时,指针事件将通过目标元素传递,并发送到它下面的元素。

.foo {
  pointer-events: auto;
}

pointer-events 设置为 auto 时,指针事件将正常处理。也就是说,元素阻止事件传递到较低元素。

这里有一个来自 Paul Rouget 的现实世界示例。您需要 Firefox 3.6 beta 才能看到它在行动。

点击图片下方的 pointer-events: none 复选框,查看它是否发生变化。

他复制了 twitter.com 首页上的标签列表。(注意:您必须没有登录才能看到标签列表。) 如果你在 Twitter 上查看,你会注意到它在右侧淡出。 这是通过一个透明的淡出图像完成的,该图像位于底层框的顶部。 底部的标签是可点击的链接,但图像会阻止事件发送到淡出下面的链接。

Paul 所做的是展示了如何使用 pointer-events 属性,即使在顶部有淡出效果的情况下,也允许您点击底层的链接。

关于 Christopher Blizzard

一次发布,让网络更美好。

更多 Christopher Blizzard 的文章…


31 条评论

  1. Anton

    这太酷了!它应该是 CSS 1 的一部分!

    2009 年 12 月 1 日 上午 09:20

  2. thorn

    жжоте, чуваки!

    2009 年 12 月 1 日 上午 09:52

  3. Tobi

    这太棒了。我请求这个 css 属性,因为我的项目真的很需要它 :D Paul 你太棒了!!现在我可以做到了!!谢谢! ps: 另一个我热爱 Mozilla 的原因。

    2009 年 12 月 1 日 上午 10:05

  4. Colin

    非常棒的补充。我一直很喜欢 Flash 如何设置 'mouseEnabled = false' 来实现相同的效果。

    我想我们仍然会使用 Javascript 模拟 Flash 中的 'mouseChildren = false'?它会阻止事件传播传递到光标下点击项目的子节点。

    2009 年 12 月 1 日 上午 10:08

  5. Simon Hamp

    太棒了!这是 CSS3 规范的一部分吗?我们会在其他浏览器中看到它被采用吗?

    2009 年 12 月 1 日 上午 10:36

  6. Dethe Elza

    看起来很棒,我希望它能得到广泛的实施。

    2009 年 12 月 1 日 上午 11:14

  7. jason

    也许这是一个不同的讨论,但为什么这是一个样式属性而不是标签属性?

    2009 年 12 月 1 日 上午 11:23

  8. jason

    to self
    这样您就可以添加演示而不会干扰应用程序。

    2009 年 12 月 1 日 上午 11:26

  9. […] 让拖放到网格中的数据自动插入到网格的正确位置是我的下一个任务,用于不断改进的 DataDrop 插件。应该很有趣 :/ 更新 (12-1-09):看来 Mozilla 也注意到了这个问题。 […]

    2009 年 12 月 1 日 上午 11:31

  10. James John Malcolm

    太棒了!

    而且它似乎已经可以在 Chrome 4 中运行 :)

    2009 年 12 月 1 日 上午 11:53

  11. Rik

    对 Web 平台的不错补充..

    FYI,Safari 4(也许是 Chrome)也支持它。还有一个非常简短的规范:http://webkit.org/specs/PointerEventsProperty.html

    现在我想知道 Twitter 要多长时间才能在他们的网站上添加它。

    2009 年 12 月 1 日 下午 12:06

  12. Robert O’Callahan

    Webkit 也支持此功能。

    2009 年 12 月 1 日 下午 12:10

  13. Oliver

    如果我没记错的话,pointer-event 属性在发布的 Safari 中已经支持了一年多了。演示似乎无法正常工作的原因是它没有包含 webkit 等效的 -moz- 渐变内容(因此渐变不可见)

    2009 年 12 月 1 日 下午 13:26

  14. […] Mozilla 宣布将在 Firefox 3.6 中支持 pointer-events。虽然规范显然已经成为 SVG 的一部分有一段时间了,但我今天之前从未真正听说过它。 […]

    2009 年 12 月 1 日 下午 15:10

  15. James John Malcolm

    我假设“pointer-events: none;”不会对链接上的 :focus 事件做任何事情?

    2009 年 12 月 1 日 下午 15:14

  16. thinsoldier

    我更喜欢 foreground:url(‘overlay.png’)

    2009 年 12 月 1 日 下午 16:07

  17. Murray

    这可以作为另一种执行点击劫持攻击的方式吗?

    2009 年 12 月 1 日 下午 16:55

  18. Marco Pivetta

    太棒了!这将真正改变我们编写 CSS 和 Z-Indexes 的方式!

    2009 年 12 月 2 日 上午 00:37

  19. […] hacks.mozilla.org 上的 Firefox 3.6 中的 pointer-events […]

    2009 年 12 月 3 日 上午 07:28

  20. Sam Hasler

    对于任何感兴趣的人,如果您想在当前浏览器中获得相同的效果,则必须让最上面的元素将事件传递到下面的元素。以下是一个示例:http://jsbin.com/uhuto

    2009 年 12 月 5 日 上午 08:20

  21. Sam Hasler

    似乎有比我上面使用的更好的方法来转发鼠标事件,而不是通过图层。见 http://www.vinylfox.com/forwarding-mouse-events-through-layers/

    2009 年 12 月 5 日 上午 09:08

  22. mawrya

    现在,如果我们能为上层和下层元素同时触发事件,那将非常棒。“pointer-events:catch-release;”或类似的东西。

    2009 年 12 月 8 日 下午 18:07

  23. […] 原作者:Christopher Blizzard – 转到原文 […]

    2010 年 6 月 20 日 上午 08:28

  24. David

    @mawrya:实际上,它就是这样做的。事件被两个元素捕获。

    我想知道这意味着浏览器是否会实现 table col 元素的事件处理程序,因为我们现在有了一种方法可以使鼠标事件通过表的其余结构。我一直试图找到一种方法来为表格列制作工具提示…

    2010 年 9 月 30 日 下午 22:05

  25. mawrya

    @David:也许我遗漏了什么,它对我来说似乎不起作用。如果我修改这篇博文的示例,当用户点击具有渐变的 div 时显示一个 alert() 对话框,当用户点击渐变 div 下面的单词时显示一个不同的 alert() 对话框,我可以根据 div 的 css 中设置的“pointer-events:”来显示这两个对话框之一,但我无法做任何事情让两个对话框都显示在用户点击 div 和它下面的单词所共享的像素时。如何实现?据我所知,当接收事件的元素在 DOM 中没有祖先-后代关系时,这是不可能的。我不认为即使在 SVG 元素上使用 pointer-events 也是可能的,在那里它会更加有用。

    2010 年 10 月 4 日 下午 19:31

    1. David

      嗯。你是对的。看起来我一定是将 onclick 处理程序附加到了错误的元素。

      我所知道实现你想要的唯一方法是使用 elementFromPoint()。

      例如,使用一些 jQuery
      $(‘.gradient’)click(function(e){
      var $this = $(this),
      x = e.pageX – $(document).scrollLeft(),
      y = e.pageY – $(document).scrollTop();

      $this.hide();
      var lowerElement = $(document.elementFromPoint(x, y));
      $this.show();
      lowerElement.trigger(e);
      });

      2010 年 10 月 4 日 下午 20:29

  26. 1000 game mobile

    如果我没记错的话,pointer-event 属性在发布的 Safari 中已经支持了一年多了。演示似乎无法正常工作的原因是它没有包含 webkit 等效的 -moz- 渐变内容(因此渐变不可见)
    很好

    2011 年 1 月 4 日 上午 03:34

  27. miukki

    IE7+ 怎么办?

    2011 年 4 月 27 日 上午 06:58

  28. miukki

    那 IE 中 CSS 透明渐变效果怎么样?

    2011 年 4 月 27 日 下午 06:59

  29. […] https://hacks.mozilla.ac.cn/2009/12/pointer-events-for-html-in-firefox-3-6/ […]

    2011 年 12 月 7 日 下午 15:01

  30. […] https://hacks.mozilla.ac.cn/2009/12/pointer-events-for-html-in-firefox-3-6/ […]

    2011 年 12 月 7 日 下午 15:57

本文评论已关闭。