给元素加上 pointer-events:none;
的 CSS 属性即可禁止鼠标点击, 值得注意的是, 只能禁止鼠标事件, 键盘事件等不能禁止.
一. 需求描述:
- 有一个输入框, 输入内容按回车键之后输入的内容即时显示在页面上;
- 当没有输入过内容时, 显示
nothing~
提示语; - 按回车后, 输入框的内容清空;
- 页面上显示的每一项内容可以通过一个删除按钮删除.
二. 决定使用 CSS3 的伪类和伪元素
- 提示语使用
:empty
, 当父元素里面没有内容时, 会自动应用这个样式:
.wrapper {
margin: 100px;
}
ul:empty::after {
content: 'nothing~';
}
<div class="wrapper">
<input type="text" id='input'>
<ul id='ul'></ul>
</div>
注意:
ul
不能有空格, 空格也算是子元素.
- 利用 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>
-
注意
pointer-events
的使用
本来, 未使用pointer-events
之前, 当点击li
这一项任何位置都会通过removeChild(e.target)
移除这一项, 我只是想在点击设计的按钮时删除这一项, 将li
应用pointer-events: none;
禁止响应鼠标的点击事件,li::after
应用pointer-events: auto;
解除禁止响应, 便可以在只点击伪元素的时候删除li
.