👉需求:把图片拖到浏览器页面中,浏览器页面背景即变成该图片

👉布局准备:
- 一个h3,写文字“拖拽图片到虚线内”
- 给body加边框,用来显示上传后的图片
- 默认body没有高度,因此边框没有高度,由于document 的默认高度是浏览器的可视高度,因此给html和body的高度都设置为100%,这样,html继承document 的高度,body继承html的高度,都显示可视区的高度,布局代码如下:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body {
height: 100%;
}
body {
border: 5px dashed black;
}
</style>
</head>
<body>
<h3>拖拽图片到虚线内 </h3>
</body>
</html>
👉核心技术:
- dragover鼠标悬停事件、drop鼠标拖放事件、 e.preventDefault()阻止事件默认行为、URL.createObjectURL()将url地址进行解码、e.dataTransfer.files[0]获取被拖拽进来的文件
👉思路:
- 由于需要鼠标拖拽图片到浏览器,因此,需要给body先添加一个dragover鼠标悬停事件,事件内,阻止鼠标拖放的默认行为
- 给body添加鼠标拖放事件,将图片拖进浏览器,这个时候会发现,浏览器会打开一个新的页面,来显示图片;这是因为,浏览器默认有一个拖放行为,即【拖放文件进来时,打开新页面来显示图片】,因此
- 事件内,要先清除浏览器的【拖放文件进来时,打开新页面来显示图片】的默认行为
- 然后,获取到拖放进来的文件;那怎么获取呢?此时,需要用到浏览器的【事件对象】
- 浏览器的【事件对象】存储了一系列事件触发时的信息,比如坐标等等,并保存在
dataTransfer的files文件内,默认是一个伪数组,因此可用e.dataTransfer.files[0]方法,获取拖进来的文件
- 但是,获取到的数据,默认是url地址信息,因此要用
URL.createObjectURL()将url地址进行解码,解码后,就是文件的路径地址
- 将解码后的文件地址,赋值给body的background
👉代码实现:
<script>
document.body.ondragover = function (e) {
e.preventDefault()
}
document.body.ondrop = function (e) {
e.preventDefault()
let url = URL.createObjectURL(e.dataTransfer.files[0])
document.body.style.background = `url(${url}) no-repeat center / cover`
}
</script>