最新要闻
- 快报:144MB缓存立大功 AMD锐龙7000X3D内存自由:4800都稳赢i9
- 环球观点:AMD RX 7900 XT价格全面雪崩:沦落到RTX 4070 Ti的级别
- 《旷野之息》发售6周年:续作《塞尔达传说:王国之泪》发布新预告
- 当前视点!中国围棋第一人易主!李轩豪超越柯洁 AI立大功
- 环球快讯:vivo推出“手语翻译官”应用:准确率可达80%以上
- 【全球独家】限制儿童支付金额方便了!微信青少年模式升级:一键开启上线
- 三排七座!仰望U8内饰曝光:比亚迪首款百万豪车来了
- 世界热门:刚失败一次后 日本不放弃:新一代运载火箭尝试再度发射
- 热到离谱?首个冲上20℃的北方省会诞生 下周或破30℃
- 欧洲2035年禁售燃油车要黄?德国公然反对!意大利:我也不同意
- 环球精选!登月用!中国新一代载人火箭预计2027年首飞
- 天天即时:《狂飙》“大嫂”高叶上手小米13:女神持机美如画
- 世界微动态丨网友偶遇眼镜王蛇求助 博物杂志:务必远离、打输住院打赢坐牢
- 世界今亮点!Vtuber因直播《霍格沃茨之遗》被骚扰 宣布毕业
- 天天讯息:委员建议研究生招生规模动态扩大:缓解考研难
- 速看:兰博基尼领衔 今年值得期待的7款跑车 买不起还不能看看?
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--手摸手带你撸一个拖拽效果
(资料图)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言
最近看见一个拖拽效果的视频(抖音:艾恩小灰灰),看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然的心理,我把实现效果研究了一遍,并且了解了其实现原理,这里给大家复盘其原理,学到就是赚到
准备
这里我们要用到字体图标,所以我们从iconfont阿里图标库直接引入
- 找到需要的图标,添加进项目
- 找到图标所在的项目,点击查看链接
- 复制地址,或者点击地址复制跳转后地址链接
创建所需要结构
把我们需要结构先写出来
draggable
:让盒子可以进行拖拽style="--color:#e63e31"
--color让盒子背景色根据--color显示(与下方css样式相联系)
双鱼座水平座摩羯座处女座狮子座
编写样式
这里直接采用flex对盒子进行排版布局
background-color: var(--color);
var(--color)是或者自定义属性的颜色
body{ background-color: #000;}.list{ width: 300px; height: 360px; /* padding: 20px 0; */ margin: 100px auto 0; display: flex; flex-direction: column; justify-content: space-around;}.list-item{ width: 100%; display: flex; align-items: center; padding: 0 16px; border-radius: 10px; /* margin-bottom: 20px; */background-color: var(--color);}.constellation{ line-height: 2.5em; font-size: 20px; color: #fff;}.list-item-img{ width: 30px; height: 30px;}.list-item-title{ margin-left: 20px; color: #fff;}// 移动动画class.list-item.moving{background-color: transparent;border: 2px dashed #ccc;}
js编写拖拽效果
首先获取需要用到的元素
// 获取整个listconst list = document.querySelector(".list")// 获取每一个盒子const item = document.querySelectorAll(".list-item")
开始拖动的时候需要加上移动的类,并且设置移动效果
// 开始拖动 list.ondragstart = e => { source_node = e.target recode(item) setTimeout(() => { // 拖拽时样式 e.target.classList.add("moving") }, 0) // 设置拖动效果 e.dataTransfer.effectAllowed = "move" }
拖拽中需要判断是从上往下还是从下往上,根据拖拽元素和放入元素的索引进行比对,从而对拖拽元素进行插入节点操作
注意:在码上掘金从上往下的时候会出现bug,在浏览器不会,我个人觉得应该是是码上掘金的问题
// 拖拽放入有效目标触发 list.ondragenter = e => { e.preventDefault() console.log(e.target.id, list) if (e.target === list || e.target === source_node) { return false } const childer = Array.from(list.children) const sourceIndex = childer.indexOf(source_node) const targetIndex = childer.indexOf(e.target) // console.log(sourceIndex, targetIndex) if (sourceIndex < targetIndex) { // 从下往上拖动 list.insertBefore(source_node, e.target.nextElementSibling) } else { // 从上往下拖动 list.insertBefore(source_node, e.target) } // 动画效果函数 last([e.target, source_node]) }
拖拽结束后把拖拽时的样式移除
// 拖放结束 list.ondragend = e => { e.target.classList.remove("moving") }
解释方法
这里有好多没有用过或者比较少用的方法,这里给大家解释一下
ondragstart
:当用户开始拖动一个元素或文本选择时,会触发dragstart事件ondragover
:当元素或文本选择被拖到有效的拖放目标上时(每几百毫秒一次),就会触发拖放事件ondragenter
:当被拖动的元素或文本选择进入有效的拖放目标时,会触发dragenter事件ondragend
: 当拖放操作结束时(通过释放鼠标按钮或点击escape键)触发dragend事件。e.dataTransfer.effectAllowed
:用于设置拖放时的效果,常用参数有(move,link,copy)getBoundingClientRect
:返回元素对于视口的信息requestAnimationFrame
:重绘动画cancelAnimationFrame
:用于取消requestAnimationFrame调用请求
所有代码
HTML
双鱼座水平座摩羯座处女座狮子座
JS
// 操作dom元素 const list = document.querySelector(".list") const item = document.querySelectorAll(".list-item") // 判断当前元素 let source_node // 开始拖动 list.ondragstart = e => { source_node = e.target recode(item) setTimeout(() => { e.target.classList.add("moving") }, 0) // 设置拖动效果 e.dataTransfer.effectAllowed = "move" } // 拖动在有效目标 list.ondragover = e => { // 防止默认情况下允许删除 e.preventDefault() } // 拖拽放入有效目标触发 list.ondragenter = e => { e.preventDefault() console.log(e.target.id, list) if (e.target === list || e.target === source_node) { return false } const childer = Array.from(list.children) const sourceIndex = childer.indexOf(source_node) const targetIndex = childer.indexOf(e.target) console.log(sourceIndex, targetIndex) if (sourceIndex < targetIndex) { // 从下往上拖动 // console.log(source_node,e.target.nextElementSibling) // if() list.insertBefore(source_node, e.target.nextElementSibling) } else { // 从上往下拖动 console.log(e.target,e.target) if (!e.target==null||source_node==null) { return } list.insertBefore(source_node, e.target) } last([e.target, source_node]) } // 拖放结束 list.ondragend = e => { e.target.classList.remove("moving") } // 重新计算位置 function recode(eleAll) { // getBoundingClientRect 返回元素对于视口信息 for (let i = 0; i < eleAll.length; i++) { const { top, left } = eleAll[i].getBoundingClientRect() eleAll[i]._top = top eleAll[i]._left = left } } // 添加移动动画效果 function last(eleAll) { for (let i = 0; i < eleAll.length; i++) { const dom = eleAll[i] const { top, left } = dom.getBoundingClientRect() if (dom._left) { dom.style.transform = `translate3d(${dom._left-left}px,${dom._top-top}px,0px)` // 重绘动画 let rafId = requestAnimationFrame(function () { dom.style.transition = `transform 0.3s ease-out` dom.style.transform = "none" }) dom.addEventListener("transitionend", () => { dom.style.transition = "none" // 取消requestAnimationFrame调用请求 cancelAnimationFrame(rafId) }) } } }
CSS
body{ background-color: #000;}.list{ width: 300px; height: 360px; /* padding: 20px 0; */ margin: 100px auto 0; display: flex; flex-direction: column; justify-content: space-around;}.list-item{ width: 100%; display: flex; align-items: center; padding: 0 16px; border-radius: 10px; /* margin-bottom: 20px; */background-color: var(--color);}.constellation{ line-height: 2.5em; font-size: 20px; color: #fff;}.list-item-img{ width: 30px; height: 30px;}.list-item-title{ margin-left: 20px; color: #fff;}.list-item.moving{background-color: transparent;border: 2px dashed #ccc;}
本文转载于:
https://juejin.cn/post/7171269067729272868
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
-
天天讯息:VSCode官方的配置同步方案
目录前言VSCodeSettingsSync和SettingsSync插件有什么关系?开启SettingsSync功能Merge还是Replace?同步...
来源: 每日资讯:详细剖析|袋鼠云数栈前端框架Antd 3.x 升级 4.x 的踩坑之路
记录--手摸手带你撸一个拖拽效果
天天讯息:VSCode官方的配置同步方案
快报:144MB缓存立大功 AMD锐龙7000X3D内存自由:4800都稳赢i9
环球观点:AMD RX 7900 XT价格全面雪崩:沦落到RTX 4070 Ti的级别
《旷野之息》发售6周年:续作《塞尔达传说:王国之泪》发布新预告
当前视点!中国围棋第一人易主!李轩豪超越柯洁 AI立大功
环球快讯:vivo推出“手语翻译官”应用:准确率可达80%以上
网络通信——TCP “三次握手“、“四次挥手“ 详解
PHP语言在线代码运行编译工具推荐
今日报丨JavaScript 回调函数属于闭包?
全球快看:ChatGPT开放API,上来就干到最低价,可以人手一个ChatGPT了
全球新动态:Spring事务使用注意事项
【全球独家】限制儿童支付金额方便了!微信青少年模式升级:一键开启上线
三排七座!仰望U8内饰曝光:比亚迪首款百万豪车来了
世界热门:刚失败一次后 日本不放弃:新一代运载火箭尝试再度发射
热到离谱?首个冲上20℃的北方省会诞生 下周或破30℃
欧洲2035年禁售燃油车要黄?德国公然反对!意大利:我也不同意
环球精选!登月用!中国新一代载人火箭预计2027年首飞
天天即时:《狂飙》“大嫂”高叶上手小米13:女神持机美如画
全球观速讯丨火山引擎 DataTester:A/B 实验如何实现人群智能化定向?
环球快资讯丨Redis分布式锁常见坑点分析
世界今日讯!eas里客户端保存,提交里增加校验规则和必填
访问者模式
世界微动态丨网友偶遇眼镜王蛇求助 博物杂志:务必远离、打输住院打赢坐牢
世界今亮点!Vtuber因直播《霍格沃茨之遗》被骚扰 宣布毕业
天天讯息:委员建议研究生招生规模动态扩大:缓解考研难
全球聚焦:收个滴滴Offer:从小伙三面经历,看看需要学点啥?
环球热资讯!Study for Go! Chapter one - Type
环球最新:手写模拟Spring底层原理-Bean的创建与获取
速看:兰博基尼领衔 今年值得期待的7款跑车 买不起还不能看看?
女子试用期被辞退 现场给HR普法:金句频出网友点赞称解气
每日聚焦:靠ChatGPT年入百万!合法还不限学历专业:一般人我不告诉他(doge)
全球新消息丨韩系车日子不好过!起亚狮铂拓界限时优惠:降3万还给大礼包
zip文件结构
头条:与时俱进推动智慧城市建设,智慧管网监测加强城市治理能力
全球视讯!Java项目集成工作流activiti,会签
简单介绍Python中如何给字典设置默认值
播报:LG:三星QD OLED电视更容易烧屏
世界聚焦:掏耳朵怎么就这么爽!
今日视点:不只全面屏!努比亚Z50 Ultra后摄惊艳:黄金镜皇组合
男子月薪3千相亲角“反向相亲”气到大妈 大爷理解:靠颜值吃饭
每日热文:吴京+杰森斯坦森主演!《巨齿鲨2》暑期上映 国内有望同步
环球视点!ffmpeg视频上传及压缩Linux配置篇下
世界快资讯:【Avalonia】【跨平台】关于Prism项目模块化在Linux下路径问题
浙大揭秘吃鱼为什么会变聪明 网友:告诉老默 我想吃鱼了
上海消保委提醒谨慎购买威马汽车:经营异常、消极应对投诉
特斯拉将放弃稀土材料 中国公司无惧:目前没有东西替代
即时:B站两款自研游戏将上线 CEO陈睿:能挣钱的游戏只剩下两种
《生化危机4:重制版》新演示/截图 里昂拯救黑丝碍事梨
焦点日报:配置资源管理Secret和ConfigMap
环球视点!Windows故障转移群集 和 SQLServer AlwaysOn 搭建教程
(数据库系统概论|王珊)第九章关系查询处理和关系优化-第一节:查询处理
全球速递!视频上传及压缩SpringBoot篇上
世界热门:el-input 使用 回车键会刷新页面的问题
全球最强!传音260W快充手机将亮相:10分钟内充满
性能对标奔驰大G 比亚迪“F品牌”首车曝光:够硬够强
世界快消息!传欧盟准备批准微软收购动视-暴雪
当前报道:女司机“神操作”:100来公里高速连撞4次 竟甩锅路太窄
世界视讯!又一大作优化翻车!《卧龙:苍天陨落》RTX 4090依旧闪退
12GB+256GB到手仅2699元!Redmi K60正式开启降价
温州特斯拉事故驾驶员家属发声:记不清车辆失控场景 妻子去世自责
环球时讯:中国航天员遇到外星人怎么办?载人航天总师:积极交流 星际合作
焦点要闻:漫威等好莱坞大片中国市场遇冷:大家不爱看了 不符合国人审美、文化观
550元 富士发布Instax Mini 12拍立得相机 支持APP存照片
环球即时:卷成白菜价!致态TiPlus 7100固态硬盘新史低:1TB仅549元
环球头条:马斯克10万亿美元“改造地球”背景下!特斯拉电机要完全不用稀土:专家回应有可能
读Java性能权威指南(第2版)笔记07_即时编译器上
今头条!天问二号任务已获得国家批准立项:要从小行星2016 HO3采样返回
实现 Vue 折叠面板组件
委员:996制度是导致就业难、生育率低的重大原因
当前播报:电商价格战开打!京东百亿补贴上线:全场包邮 买贵双倍赔
特斯拉未来要狂暴降价:就靠这改变世界?其实都被骗了!
世界快资讯:豆瓣8.9分!韩国拼体格真人秀在欧美爆红
暗黑三国风!《卧龙:苍天陨落》正式上线:298元 GTX 1650就能玩
3.3 数据结构 时间复杂度 和空间复杂度 计算
环球简讯:004. html篇之《标签分类和嵌套》
天天动态:星巴克国内最大对手!瑞幸咖啡财报:年收入首次突破百亿
硬件狗狗3.3新版发布:跑分排行 实时PK
【环球热闻】使用ansible部署服务到k8s
专家:双休制度很难被改变 可以试试“做四休三”
【当前独家】同样是PCIe 5.0 SSD:Intel、AMD跑分竟不一样!差距达30%
世界观焦点:大熊猫为什么近期扎堆回国?美日等国养不起“国宝”了吗?完全是误解
当前速讯:女子称因准点下班试用期第3天被辞退:还被领导一顿痛骂
全球聚焦:R数据分析:做量性研究的必备“家伙什”-furniture包介绍
003. html篇之《表单》
全球即时:Codeforces 1774 G Segment Covering 题解 (观察性质,倍增)
【全球播资讯】Feign踩坑源码分析 -- 请求参数分号变逗号
【全球快播报】火箭弹电子版领取处>>
视讯!完美还原!玩家用虚幻5复刻《狂飙》高启强老家:桌上还有孙子兵法
《龙马精神》4月上映!69岁成龙再跳120米高摩天轮 本人直言小事情
天天快资讯:C++面经(持续更新)
今亮点!实验楼(规则)怪谈
热推荐:电视剧《三体》豆瓣评分上涨 于和伟:《三体》涨分像涨工资
热门看点:《卧龙:苍天陨落》今晚零点正式解锁!乱世三国冒险即将开启
前沿资讯!口感醇正!熊猫精酿好时光皮尔森啤酒好价:2.8元/听
即时:中国科技公司:让老外开眼了
完爆H.265!优酷用上H.266编解码:最便宜手机放视频也丝般顺滑
世界今头条!搭建两台web服务器基于HAProxy实现负载均衡
焦点短讯!路飞-day5——git 多分支开发、git远程仓库、ssh方式连接远程仓库、协同开发、冲突解决、线上分支合并、远程仓库回滚