美文网首页
巧用 pointer-events 只给伪元素加点击事件

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

作者: McDu | 来源:发表于2017-12-06 10:49 被阅读845次

    给元素加上 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 .

    相关文章

      网友评论

          本文标题:巧用 pointer-events 只给伪元素加点击事件

          本文链接:https://www.haomeiwen.com/subject/qlawbxtx.html