前端的小伙伴们,我想大多数都是颜值控吧,看到一个漂亮或新奇的效果,都想搞明白是怎么实现的吧。但是前端发展的实在太快,各种框架和组件五花八门,由于项目业务时间的问题,我们都习惯了使用各种框架和组件去实现,以至于离开这些东西,我们有可能连个最基础的动效都不清楚怎么实现,这就是我想写这个系列文章的原因,放低心态,从最基础的原生代码开始复习实践。
本系列文章小编将和大家一起从最基础的原生代码实践,做一些小的项目,从练习中实践中复习和掌握前端的一些基础知识,只有熟练了才能理解前端的本质,学习前端新的知识和框架时就能更快的掌握。文章会用到 ES6、css3的特性来实现目前比较流行交互和特效效果。
本篇文章,如下视频所示,界面有5个方格拖放区域,我们可以在这些区域里拖拽图片,当鼠标拖动图片时,图片周围有白色的粗边框,在拖动的目标方格会出现白色的虚线边框,结束拖动时,图片将会放置在目标方格内。
在练习前,我们先复习下和拖拽相关的几个API事件,在某个元素被拖动时,会按照顺序触发以下事件:
以上三个事件,都是针对被拖动元素的,并不会改变元素的外观,如果你想改变外观需要自己定义。除了这些事件,当你把元素拖动到一个有效的放置目标上时,会依次触发以下事件:
复习完基础知识后,我们来开始实践吧,我们依次创建三个文件 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端体验),如果想获取源码,请公众号回复 “a1” 获取本项目源码。
注:本文属于原创文章,版权属于「前端达人」公众号及 qianduandaren.com 所有,未经授权,谢绝一切形式的转载