# 介绍

pointer-events是css3的一个属性,指定在什么情况下可以成为鼠标事件的target(包括鼠标的样式)

# 属性值

pointer-events属性有很多值,但是对于浏览器来说,只有auto和none两个值可用,其他的几个是针对SVG的(本身这个属性就来SVG技术)

/* Keyword values */

pointer-events: auto; /* 默认 */

pointer-events: none;

pointer-events: visiblePainted; /* SVG only */

pointer-events: visibleFill;  /* SVG only */

pointer-events: visibleStroke;  /* SVG only */

pointer-events: visible;  /* SVG only */

pointer-events: painted;  /* SVG only */

pointer-events: fill;  /* SVG only */

pointer-events: stroke;  /* SVG only */

pointer-events: all;  /* SVG only */

/* Global values */

pointer-events: inherit;

pointer-events: initial;

pointer-events: unset;

# pointer-events属性值详解

  • auto---效果和没有定义pointer-events属性相同,鼠标不会穿透当前层。在SVG中,该值和visiblePainted效果相同。
  • none--元素永远不会成为鼠标事件的target(目标)。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向后代元素,在这种情况下,鼠标事件将在捕获冒泡阶段触发父元素的事件监听器。实际上默认就可以穿透当前层,因为pointer-events默认为auto

# 浏览器兼容性

Firefox 3.6+和chrome 2.0+ 以及safari 4.0+都支持这个CSS3属性,IE6/7/8/9都不支持,Opera在SVG中支持该属性但是HTML中不支持。

检测浏览器是否支持该属性的JS代码,其实也可以用来检测其他的属性

var supportsPointerEvents = (function(){
  var dummy = document.createElement('_');
  if(!('pointerEvents' in dummy.style)) return false;
  dummy.style.pointerEvents = 'auto';
  dummy.style.pointerEvents = 'x';
  document.body.appendChild(dummy);
  var r = getComputedStyle(dummy).pointerEvents === 'auto';
  document.body.removeChild(dummy);
  return r;
})();

为什么要设置两次pointerEvents的属性呢? document.style.pointerEvents = 'auto'

document.style.pointerEvents = 'x'

解读:明显的是x会把之前赋值的auto覆盖掉,后面用了getComputedStyle这个方法。由于x是个无效的值,所以如果浏览器支持pointer-events这个css属性的话,计算出来的样式应该是auto

使用JS替代实现pointerEvents穿透当前层的效果

function noPointerEvents (element) {
    $(element).bind('click mouseover', function (evt) {
        this.style.display = 'none';
        var x = evt.pageX, y = evt.pageY,
	    under = document.elementFromPoint(x, y);
        this.style.display = '';
        evt.stopPropagation();
        evt.preventDefault();
        $(under).trigger(evt.type);
    });
}

elementFromPoint:返回给定坐标处的所在的元素

使用实例:document.elementFromPoint(100,100)

trigger:触发被选元素指定的事件类型

event.type:返回事件类型

<div class="out" @click="out()">
    <div class="in" @click="in()"></div>
</div>
 
// 穿透点击(点击in的区域触发out)
.in {
    pointer-events: none;
}
 
// 阻止穿透 (点击in的区域不会触发out)
function in () {
    event.stopPropagation();
}

# 资料

非常有用的pointer-events属性 (opens new window)

MDN pointer-events (opens new window)

pointer-events (opens new window)