place-items tabindex copy
tabIndex
部分
<div id="area" class="area" tabindex="-1"></div>
tabindex
属性是一个全局属性,也就是所有 HTML 标签都可以用的属性,比方说id
,class
属性等。所以,可以在div
上使用。同时,这个属性是一个非常老的属性,没有兼容性问题,放心使用。
tabindex
属性是一个与键盘访问行为息息相关的属性。平常可能感觉不到它的价值,但是一旦我们的鼠标坏掉了或者没电了,我们就只能使用键盘。亦或者在电视机上,或者投影设备上访问我们的网页的时候,我们只能使用遥控器。就算设备都完全正常,对于资深用户而言,键盘访问可以大大提高我们的使用效率。
当一个元素设置tabindex
属性值为-1
的时候,元素会变得focusable
,所谓focusable
指的是元素可以被鼠标或者JS focus
,在 Chrome 浏览器下表现为会有outline
发光效果,IE浏览器下是虚框,同时能够响应focus
事件。默认的focusable
元素有<a>, <area>, <button>, <input>, <object>, <select> 以及 <textarea>
。
tabindex = -1
不能被键盘的tab
键进行focus
。这种鼠标可以focus
,但是键盘却不能focus
的状态,只要tabindex
属性值为负值就可以了。
因此,我们可以设置div
被focus
的样式,当鼠标点击div
时,我们可以改变它的边框,如下:
.area:focus {
border-style: solid;
}
tabindex
属性值是一个整数,它来决定被tab
键focus
的顺序,顺序越小越先被focus
,但是 0
除外,如下div
被focus
的顺序依次是:1,2,3。
<div id="area" class="area" tabindex="1"></div>
<div class="area" tabindex="3"></div>
<div class="area" tabindex="2"></div>
那tabindex="0"
又是怎么回事呢?
元素设置tabindex="-1"
,可以鼠标和JS可以focus
,但键盘不能focus
;
tabindex="0"
和tabindex="-1"
的唯一区别就是键盘也能focus
,但是被focus
的顺序是最后的。或者你可以这么理解,<div>
设置了tabindex="0"
,从键盘访问的角度来讲,相对于<div>
元素变成了<button>
元素。
place-items
垂直居中是一个常用的需求了,我经常使用flex
来完成:
display: flex;
align-items: center;
justify-content: center;
在大佬的文章中使用了一个新的用法:
display: grid;
place-items: center;
place-items
属性是以下属性的简写:align-items
、justify-items
。
:empty::before
当div
元素没有内容时,.area:empty
样式会生效,同时为了显示一段提示内容,使用了伪元素::before
,在content
写入提示内容。
.area:empty::before {
content: '或粘贴图片到这里';
color: gray;
}
copy paste 事件
document.addEventListener('paste', function (event) {
var items = event.clipboardData && event.clipboardData.items
var file = null
if (items && items.length) {
// 检索剪切板items
for (var i = 0; i < items.length; i++) {
if (items[i].type.indexOf('image') !== -1) {
file = items[i].getAsFile()
break
}
}
}
// 此时file就是剪切板中的图片文件
if (file) {
reader.readAsDataURL(file)
}
})
这两个事件都属于ClipboardEvent事件(剪切板事件) ,还有一个cut
剪切事件。
wrap.oncopy = function(event){}
wrap.oncut = function(event){}
wrap.onpaste = function(event) {}
任何软件上的内容,可以被复制粘贴,是因为软件对操作系统复制粘贴操作的实现,软件都会把复制剪切的内容存入操作系统的剪切板上。同样,浏览器也对操作系统的剪切板进行了实现,属于浏览器的自身的实现。
浏览器复制操作的默认行为是触发浏览器的 copy 事件,将 copy 的内容存入操作系统的剪切板中。
那如何干预浏览器的这种默认的复制粘贴操作呢?
可以通过event.preventDefault
阻止事件的默认行为,即当触发这三个事件时,阻止对系统剪切板的数据操作。然后,我们对数据进行加工后,重新写入到剪贴板。
比如,当用户复制我们网站的内容时,可以在数据后面加一个版权的相关信息。
<div id="wrap">这是复制的复制内容</div>
<script>
var wrap = document.getElementById('wrap')
wrap.oncopy = function (event) {
// 通过copy事件监听,阻止将选中内容复制到系统剪切板上
event.preventDefault()
// 获取选中内容对象
const selection = document.getSelection()
// selection对象重构了toSring()方法,获取selection对象的选中内容
var selectContent = selection.toString()
var dealContent =
selectContent +
'转载请联系作者,内容地址:xxxxx'
// 把重写后的内容写入到剪贴板
event.clipboardData.setData('text/plain', dealContent)
}
</script>