|
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
伪元素不属于DOM节点,常规操作下,JS难以对之进行读写操作,需要额外手段。本帖以伪元素独霸鼠标点击操作权限为例,简单探讨一下JS如何通过特殊手段对伪元素的点击操作(方法之一)进行处理。
CSS引入了一个属性,pointer-events,用于设置元素的鼠标指针事件,缺省值为 auto,表示元素具备接受鼠标操作权限,若需要取消此权限,设值为 none 即可,如此,该元素连 cursor: pointer; 都不能令鼠标指针呈手型样式。依此原理,我们给元素设置 pointer-events: none; 之后,鼠标经过和点击等动作在该元素上都不会有响应,然后我们给它的伪元素设置 pointer-events: auto; ,就能将接受鼠标操作的权限赋予了伪元素,效果同等于伪元素可以接受鼠标操作。
其实伪元素默认是能接受鼠标操作的,但它们是代表主元素接受的,不是代表伪元素自己,实践中,可以利用这一特点用伪元素协助偏细偏小的元素提升其接收鼠标操作的范围。而上述的骚操作,令伪元素霸占了鼠标操作,貌似是伪元素能够代表自己接受鼠标操作,还是挺有新意的。但问题来了:两个伪元素,到底是点击了哪一个?
这就需要祭出JS终极大杀器:
window.getComputedStyle(element,[pseudo])
此法,能够获取元素(element)最后渲染的CSS样式,支持获取伪元素(pseudo)的最后CSS渲染样式。pseudo参数可选,省略时表示获取主元素CSS样式,想获取 ::before 或 ::after 伪元素的CSS样式,则加上参数 '::before' 或 '::after'。
然后配套 getPropertyValue(valName),就能拿到元素或伪元素的CSS指定的属性值,比如 left、width 等。
拿到伪元素的相关属性值,是 JS 判断是点击了 ::before 还是 ::after 伪元素的依据。比方说,两个不重合的左右并排伪元素,我们只需要判断 event 鼠标数据xy坐标值中 x 值不超过第二个伪元素的 left 值,就能确定鼠标指针处在第一个伪元素上,反之则处在第二个伪元素之上。
示例代码:
- <style>
- #papa {
- margin: auto;
- width: 600px;
- height: 460px;
- border: 1px solid olive;
- position: relative;
- pointer-events: none;
- cursor: pointer;
- }
- #papa::before, #papa::after {
- position: absolute;
- content: '伪元素1';
- top: 100px;
- left: 100px;
- width: 100px;
- height: 100px;
- border: 1px solid silver;
- pointer-events: auto;
- }
- #papa::after {
- content: '伪元素2';
- left: 220px;
- }
- #clickMsg { position: absolute; top: 20px; left: 20px; }
- </style>
- <div id="papa">
- <div id="clickMsg">点击消息 ...</div>
- </div>
- <script>
- papa.onclick = (e) => {
- let v2 = window.getComputedStyle(papa,'::after').getPropertyValue('left');
- clickMsg.innerText = e.offsetX < v2.replace(/[^\d]/ig,'') ? '点击了伪元素1' : clickMsg.innerText = '点击了伪元素2';
- }
- </script>
复制代码
|
评分
-
| 参与人数 3 | 威望 +130 |
金钱 +260 |
经验 +130 |
收起
理由
|
东篱闲人
| + 30 |
+ 60 |
+ 30 |
很给力! |
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
樵歌
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|