巧用 pointer-events 只给伪元素加点击事件

2017-12-06  本文已影响845人  McDu

给元素加上 pointer-events:none; 的 CSS 属性即可禁止鼠标点击, 值得注意的是, 只能禁止鼠标事件, 键盘事件等不能禁止.

一. 需求描述:

  1. 有一个输入框, 输入内容按回车键之后输入的内容即时显示在页面上;
  2. 当没有输入过内容时, 显示 nothing~ 提示语;
  3. 按回车后, 输入框的内容清空;
  4. 页面上显示的每一项内容可以通过一个删除按钮删除.

二. 决定使用 CSS3 的伪类和伪元素

  1. 提示语使用 :empty, 当父元素里面没有内容时, 会自动应用这个样式:
.wrapper {
    margin: 100px;
}

ul:empty::after {
    content: 'nothing~';
}

<div class="wrapper">
    <input type="text" id='input'>
    <ul id='ul'></ul> 
</div>

注意: ul 不能有空格, 空格也算是子元素.
  1. 利用 JavaScript 的 onkeydown 事件判断回车事件, 将输入框里的内容追加到 ul 中, 给每一项 li 添加 ::after 伪元素, 设计它的样式为一个按钮的样子:

#ul {
    display: flex;
    flex-direction: column;
    width: 200px;
    padding: 2px;
    list-style: none;
    text-decoration: none;
}

#ul>li {
    margin: 5px 0;
    pointer-events: none;
}

#ul>li::after {
    pointer-events: auto;
    content: '×';
    float: right;
    width: 15px;
    height: 15px;
    margin: 0 -20px;
    padding: 2px 4px;
    text-align: center;
    line-height: 15px;
    color: #505739;
    background-color: #eae0c2;
    background: linear-gradient(to bottom, #eae0c2 5%, #ccc2a6 100%);
    border-radius: 5px;
    box-shadow: 0px 0px 2px -1px #1c1b18;
    text-shadow: 0px 1px 0px #ffffff;
    cursor: pointer;
}

#ul>li:hover::after {
    background-color: #ccc2a6;
    background: linear-gradient(to bottom, #ccc2a6 5%, #eae0c2 100%);
}

<script>
let oInput = document.getElementById('input');

let oUl = document.getElementById('ul');

oInput.onkeydown = function (e) {
    let value = oInput.value;
    if (e.keyCode === 13) {
        oUl.innerHTML += `<li>${value}</li>`;
        oInput.value = '';
    }
}

oUl.onclick = function (e) {
    if (e.target.nodeName === 'LI') {
        oUl.removeChild(e.target);
    }
}
</script>
  1. 注意 pointer-events 的使用
    本来, 未使用 pointer-events 之前, 当点击 li 这一项任何位置都会通过 removeChild(e.target) 移除这一项, 我只是想在点击设计的按钮时删除这一项, 将 li 应用 pointer-events: none; 禁止响应鼠标的点击事件, li::after 应用 pointer-events: auto; 解除禁止响应, 便可以在只点击伪元素的时候删除 li .
上一篇下一篇

猜你喜欢

热点阅读