前端的小伙伴们,我想大多数都是颜值控吧,看到一个漂亮或新奇的效果,都想搞明白是怎么实现的吧。但是前端发展的实在太快,各种框架和组件五花八门,由于项目业务时间的问题,我们都习惯了使用各种框架和组件去实现,以至于离开这些东西,我们有可能连个最基础的动效都不清楚怎么实现,这就是我想写这个系列文章的原因,除了这个原因,也是方便小编自己总结和梳理,日后用到时方便查阅。总之练习这些基础的项目并不low,放低姿态,从最基础的原生代码开始复习实践,帮助我们梳理基础知识,日积月累,一定会有不少收获。
本系列文章小编将和大家一起从最基础的原生代码实践,做一些小的项目,从最基础的实践中复习和掌握前端的一些基础知识,只有熟练了才能理解前端的本质,学习前端新的知识和框架时就能更快的上手。本专题文章会用到 ES6、css3的特性来实践目前比主流的交互特效。
本篇文章,如下视频所示,界面有5个方格拖放区域,我们可以在这些区域里拖拽图片,当鼠标拖动图片时,图片周围有灰色的粗边框效果提示用户当前元素可拖动,在可放置图片的目标方格会出现白色的虚线边框并且背景色更改为黑色,提示用户可以在此位置放置被拖动的图片,结束拖动时(松开鼠标时),图片将会放置在目标方格内。
在练习前,我们先复习下和拖拽相关的几个API事件,在某个元素被拖动时,会按照顺序触发以下事件:
以上三个事件,都是针对被拖动元素的,并不会改变被拖动元素的外观,如果你想改变外观需要自己定义。
除了这些事件,当你把元素拖动到一个有效的放置目标上时,会依次触发以下事件:
复习完基础知识后,我们来开始动手实践吧,我们依次创建3个文件 index.html,style.css,script.js,然后在 index.html 文件里引入样式和脚本文件,接下来我们开始编写代码吧!
html代码文件比较简单,我们依次创建5个div方格,并将被拖动的图片元素容器初始化放置在第一个方格内,并在元素上添加可拖动属性 draggable 值为 true,表示此元素可被拖动(可调用拖拽API),示例代码如下:
<divclass="empty">
<divclass="fill"draggable="true"></div>
</div>
<divclass="empty"></div>
<divclass="empty"></div>
<divclass="empty"></div>
<divclass="empty"></div>
接下来,我们来编写相关的CSS样式,代码很简单,这里只是简单说明下:
以上就是我们编写样式代码的思路,相关的CSS代码如下:
*{
box-sizing: border-box;
}
body{
background-color: steelblue;
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
overflow: hidden;
margin: 0;
}
.empty{
height: 150px;
width: 150px;
margin: 10px;
border: solid 3px black;
background-color: white;
}
.fill{
background-image: url("https://source.unsplash.com/random/150x150");
height: 145px;
width: 145px;
cursor: pointer;
}
.hold{
border: solid 5px #ccc;
}
.hovered{
background-color: #333;
border-color: white;
border-style: dashed;
}
@media(max-width: 800px) {
body{
flex-direction: column;
}
}
最后我们来编写脚本代码,在编写前,我们需要提前规划思考下,具体思路如下:
思路就聊到这里,下面给出脚本相关的代码,示例代码如下:
constfill=document.querySelector(".fill");
constempties=document.querySelectorAll(".empty");
fill.addEventListener('dragstart',dragStart);
fill.addEventListener('dragend',dragEnd);
for(constemptyofempties){
empty.addEventListener('dragenter',dragEnter);
empty.addEventListener('dragover',dragOver);
empty.addEventListener('dragleave',dragLeave);
empty.addEventListener('drop',dragDrop);
}
functiondragStart(){
this.className += " hold";
setTimeout(()=>this.className='invisible',0)
}
functiondragEnd(){
this.className='fill'
}
functiondragOver(e){
e.preventDefault();
}
functiondragEnter(e){
e.preventDefault();
this.className += " hovered"
}
functiondragLeave(){
this.className='empty'
}
functiondragDrop(){
this.className="empty"
this.append(fill)
}
好了,今天的项目就到这里结束了,想必大家都熟悉了拖拽相关的事件和如何应用,有了这些基础后,我们就有了写出更复杂拖拽应用的基础。最后大家可以点击阅读原文体验交互效果(在PC端体验),如果想获取本案例源码,请关注「前端达人」公众号,回复 “a01” 获取本项目源码。