详解CSS pointer-events属性的使用

这篇文章主要介绍了css pointer-events属性的使用,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

在前端的开发中,我们都是直接与用户接触,应该尽量让用户感到操作畅快愉悦,获得类似native的感觉。其中动画是最常用的方法。

这里的需求是,弹层的设计,这个弹层希望可以像 native 上的弹层一样,点击按钮出现,点击遮罩或按钮时关闭,并且出现和关闭时有动画效果(fade,slide等)。

详解CSS pointer-events属性的使用

问题

在关闭弹层时,以fadeOut动画效果为例,我这里是利用opacity从1 -> 0的过程模拟逐渐消失的动画过程,container是弹层组件最外层容器:

立即学习“前端免费学习笔记(深入)”;

.container {    position: fixed;    left: 0;    top: 0;    width: 100%;    height: 100%;    z-index: 9999;    animation: .5s fadeOut forwards;}@keyframes fadeOut {    0% {        opacity: 1;    }    100% {        opacity: 0;    }}

问题是opacity为0只是container内的元素透明不可见的,container仍然存在于dom节点中。当我们给弹层的蒙层mask绑定关闭事件时,由于container的z-index非常大,点击事件都会触发在mask上。

transitionend和animationend事件

为了解决上述问题,同时让用户体验更好,我们可以通过监听transitionend和animationend事件等动画效果执行完再将container节点隐藏(display:none)。这样就不会出现mask拦截点击事件的问题了。

简介

采用CSS技术生成的动画效果,我们可以在JS中捕获动画或变换的结束事件:transitionend和animationend事件标准的浏览器事件。transitionend 事件会在 CSS transition 结束后触发。

animationend 事件会在一个 CSS 动画完成时触发(不包括完成前就已终止的情况,例如元素变得不可见或者动画从元素中移除)。

代码示例:

/* * 在container元素上监听transitionend事件 * 然后指定一个函数, 例如 showMessage() */function showMessage() {    console.log('Transition 已完成');}var element = document.getElementById("container");element.addEventListener("transitionend", showMessage, false);

浏览器兼容性

以transitionend事件为例,animationend事件相似。

详解CSS pointer-events属性的使用 

可以看出,在WebKit浏览器里仍然需要使用webkit前缀,所以我们需要根据各种浏览器分别检测事件。

缺点

我的需求是,这个弹层组件可能会频繁调用,即用户关闭弹层后,会再次打开。

使用这种方案,通过监听动画结束事件,在display:none和display:block之间切换,但是这会增加浏览器渲染(重绘和重排)成本,且要考虑浏览器兼容性,需要根据各种浏览器分别检测事件。

pointer-events CSS 属性

有没有更优雅更简单的解决呢?下面介绍我们的主角:pointer-events。

需要注意的是,这个pointer-events不同于Pointer Events(用于处理来自设备(包括鼠标,笔,触摸屏等)的硬件指针输入的事件和相关接口)。

简介

The ‘pointer-events’ property specifies under what circumstances a given graphics element can be the target element for a pointer event. It affects the circumstances under which the following are processed:

user interface events such as mouse clicks

dynamic pseudo-classes (i.e., :hover, :active and :focus; [CSS2], section 5.11)

hyperlinks

简而言之,pointer-events CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target。

规范

Its extension to HTML elements, though present in early drafts of CSS Basic User Interface Module Level 3, has been pushed to its level 4.

它主要针对的是SVG,但已经扩展到其他html元素。

语法

/* 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 */

比如说,pointer-events: visibleFill;

这个只适用于SVG,只有在元素的visibility属性为visible时,且鼠标指针在元素内部时,元素才会成为鼠标事件的目标,fill属性不影响事件处理。

其他只适用于SVG的属性介绍不再赘述,可以参考 这里 。

在这里我们更关注[auto|none]两个属性值。这两个属性值用在其他html元素上也很有意思。

当值为auto时。与pointer-events属性未指定时的表现效果相同,对于SVG内容,该值与visiblePainted效果相同。

当值为none时,元素永远不会成为鼠标事件的target。换而言之,值none表示鼠标事件“穿透”该元素并且指定该元素“下面”的任何东西。

浏览器兼容性

详解CSS pointer-events属性的使用 

可以看出,pointer-events兼容绝大多数移动端浏览器,且没有前缀要求。

注意的点

当pointer-events值为none时,不一定说明该元素的事件监听事件永远不会被触发。如果他的子元素有明确的设定pointer-events属性,且指定自己能成为鼠标事件的目标,那么触发的过程会通过事件冒泡传到父元素,父元素的事件监听事件就会被触发。

总结

在弹层组件可能会频繁调用的情况下,使用pointer-events方案,即点击遮罩或按钮时关闭时,设置container动画效果和pointer-events:none,弹层出现时,再设置pointer-events:auto。这样只需改变css的属性即可解决问题。

以上所述就是给大家介绍的CSS pointer-events属性使用的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问 CSS视频教程, CSS3视频教程!

相关推荐:

php公益培训视频教程

CSS在线手册

CSS3在线手册

div/css图文教程

css3特效代码大全

以上就是详解CSS pointer-events属性的使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1612376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月24日 02:56:40
下一篇 2025年12月24日 02:56:54

相关推荐

  • 如何利用css的background绘制图形 (附代码)

    本篇文章给大家带来的内容是关于如何利用css的background绘制图形 (附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 相信大家在平时工作中少不了会被要求在某些元添加一些特殊的背景图片,这时候通常就拿起ps就是切切切。不说这种方式麻烦,有ui给你切好的情况已经不错,没…

    2025年12月24日 好文分享
    000
  • css实现酷炫的右侧悬浮菜单栏效果(代码实例)

    本文给大家介绍css如何实现酷炫的右侧悬浮菜单栏效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 默认显示效果: 鼠标悬浮效果:   HTML、JS代码如下: 立即学习“前端免费学习笔记(深入)”; *{margin:0;padding:0;} body{ color:#333…

    2025年12月24日
    000
  • PC端移动端不同屏幕大小下响应式布局

    本文给大家介绍pc端移动端不同屏幕大小下响应式布局,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 先上效果图: PC端效果: 移动端效果: 代码如下: 响应式布局1234 pc.css  样式代码: *{margin:0;padding:0;}ul{width:calc(100%…

    2025年12月24日
    000
  • 带你进一步认识CSS的层叠概念

    本篇文章给大家带来的内容是关于带你进一步认识css的层叠概念,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近在项目的过程中遇到了一个问题,menu-bar希望始终显示在最上面,而在之后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么原因,因此找了一下cs…

    2025年12月24日
    000
  • 如何使用纯CSS制作特效导航条?

    本文给大家介绍如何使用纯css制作特效导航条,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 先上张图,看看效果: 在继续阅读下文之前,你可以先缓一缓。尝试思考一下上面的效果或者动手尝试一下,不借助 JS ,能否巧妙的实现上述效果。 OK,继续。这个效果是我在业务开发的过程中遇到的…

    2025年12月24日 好文分享
    000
  • css实现页面内容不够高footer始终位于页面的最底部效果

    本文给大家介绍css如何实现页面内容不够高footer始终位于页面的最底部效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 相信很多前端工程师在开发页面时会遇到这个情况:当整个页面高度不足以占满显示屏一屏,页脚不是在页面最底部,用户视觉上会有点不好看,想让页脚始终在页面最底部,…

    好文分享 2025年12月24日
    000
  • css如何设置字母的大小写?text-transform属性设置字母的大小写(介绍)

    有的时候我们需要让英文单词或拼音首个字母大写;或者需要让全文中英文单词全大写或小写。那么这样的效果?本篇文章就给大家介绍css设置字母大小写的方法,让大家了解text-transform属性是怎样设置字母的大小写的。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来了解一下…

    2025年12月24日
    000
  • css如何实现首字下沉效果?伪元素+浮动实现效果(代码实例)

    在word文档中有一个首字下沉功能,可以在文章的排版时使用,有时能给文章增色不少。那么css可以实现这样的效果吗?本篇文章就给大家介绍css是如何实现首字下沉效果的,让大家可以了解如何用css的伪元素+浮动实现首字下沉效果。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 在css中…

    2025年12月24日 好文分享
    000
  • css的initial-letter属性实现首字下沉效果(代码实例)

    css如何实现首字下沉效果?本篇文章就给大家介绍css是如何实现首字下沉效果的,让大家了解用initial-letter属性是怎样实现首字下沉效果的。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来了解一下initial-letter属性要怎样实现首字下沉效果吧! ini…

    2025年12月24日 好文分享
    000
  • 如何使用CSS实现眼冒金星的动画效果(附源码)

    本篇文章给大家带来的内容是关于如何使用css实现眼冒金星的动画效果(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果预览 源代码下载 https://github.com/comehope/front-end-daily-challenges 代码解读 定义 dom,容…

    2025年12月24日
    000
  • PC端无论页面有没有完全撑开把footer保持在最底部(不用定位)

    最近在写项目,有的页面没有占到一屏,然后footer也就是底部就靠上了,这样很影响美观,于是在网上找了找,下面是我的成果 解决该问题的最好方法是采用CSS3提供的一种先进布局模型 :flexbox,可以建立具有适应性的布局。 下面我们代码走起来 ……… html{ height: 100…

    好文分享 2025年12月24日
    000
  • css怎样给字体和元素加阴影?text-shadow和box-shadow实现

    本文给大家介绍css怎样给字体和元素加阴影?text-shadow和box-shadow实现。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 1、语法:  对象选择器 {text-shadow:X轴偏移量 Y轴偏移量 阴影模糊半径 阴影颜色}  注:text-shadow可以使用一…

    2025年12月24日
    000
  • css如何设置背景图片的平铺方式?css设置背景图片平铺的方法(图文详解)

    css如何设置背景图片的平铺方式?本文就给大家介绍css是如何设置背景图片平铺的方法,让大家了解在css中设置背景图片水平方法平铺、垂直方向平铺,或者是不平铺的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 当我们使用background-image属性让一张背景图片在页面上…

    2025年12月24日 好文分享
    000
  • css如何实现首行缩进效果

    css实现首行缩进效果的方法:首先创建一个HTML示例文件;然后在body中定义一些文本段落;最后在css中使用text-indent属性来实现首行缩进效果即可。 本文操作环境:Windows7系统、Dell G3电脑、HTML5&&CSS3版。 在css中,我们可以使用text-i…

    2025年12月24日 好文分享
    000
  • css如何自定义checkbox样式?(代码实例)

    css如何自定义checkbox样式?本文给大家介绍css实现修改原生checkbox样式,自定义checkbox样式的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 先看看效果 原理 1.利用CSS3属性 appearance。 该属性(强制)更改(改变)默认(原生)样式。…

    2025年12月24日
    000
  • 前端移动开发之使用rem实现自适应的效果

    本文给大家介绍php的三种常用的加密解密算法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 前言 作为一名前端工程师,我们不仅要会PC端开发,还要会移动端开发,而且现在移动端占据主要流量,所以掌握移动端开发的技能更是必须的。 那么进行移动端的开发,什么是必须,我们想要的效果是什么…

    2025年12月24日 好文分享
    000
  • 实现CSS圆环的5种方法(小结)

    这篇文章主要介绍了实现css圆环的5种方法(小结),有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 想到去年面试实习的时候被问到实习圆环的问题,特意写篇文章总结一下吧!总结了一下大概有5种方法。   1. 两个标签的嵌套: .element1{ width: 200px; heig…

    2025年12月24日
    000
  • 如何使用CSS和Vanilla.js实现一组tooltip提示框(附源码)

    本篇文章给大家带来的内容是关于如何使用css和vanilla.js实现一组tooltip提示框(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果预览 源代码下载 https://github.com/comehope/front-end-daily-challenges…

    2025年12月24日
    000
  • CSS 实现滑动门的实例代码

    滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本。接下来通过本文给大家介绍css 实现滑动门的实例代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 所谓的滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本。即当文字增多时,背景看起来也会变长。 大多数应用于导航…

    2025年12月24日
    000
  • CSS多种方式实现底部对齐的示例代码

    这篇文章主要介绍了css多种方式实现底部对齐的示例代码的相关资料,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 因公司业务要求需要实现如下图中红色区域的效果: 效果说明: 1、红色区域数据需要倒排(即从底部开始数,数字为1、2、3、4、5),并且显示在最底部2、当数据过多时需要显…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信