最新要闻
- 每日快报!首款车明年量产!小米汽车最新专利公布:手表控制车有戏
- 天天热文:A卡游戏画面鲜艳 N卡灰蒙蒙?可能是这里设置错了
- 焦点播报:北美杀入前十后《流浪地球2》官宣:2月9日在中国香港及澳门上映
- 焦点简讯:三体人为什么那么害怕地球人的加速器?中科院科普
- 中国航天科技喊话《流浪地球2》:太空天梯、地球车站、空间驿站有望实现
- 每日看点!男子打赏女主播1.8万后起诉欲要回!最终被驳回诉求
- 焦点速递!男子寄5万元笔记本被摔坏索赔遭拒:屏幕、键盘都烂了 维修要2万
- 动视暴雪点赞《最后生还者》:索尼令人敬畏 我们被收购是应该的
- 天天热头条丨官网12.4万元帕纳梅拉遭抢购 保时捷:情况属实 已与首单用户达成协议
- 当前观察:索尼PS5现货全开放!黄牛惨了:带大量机器退货遭拒
- 刘慈欣:30年前拍不成《流浪地球2》 投资人不会信的
- 观热点:SSD性能领先35倍 机械硬盘命悬一线:没啥理由买
- 【全球速看料】流浪小狐狸投奔看守所1年胖成球:今年要帮它减肥
- 不止砍掉UFS 4.0:三星Galaxy S23标准版遭全方位缩水
- 800W功耗!RTX 4090 Ti四插槽"核弹"真的有 但不一定能生出来
- 全球微速讯:《最后生还者》剧集第3集与游戏对比 还原度高
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【天天时快讯】记录--手把手教学,实现一个优雅的图片预览
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
在我们开发项目中,经常会遇到预览图片的需求。也就是点击图片,会全屏显示该图片。需求很简单,但是如何让实现更优雅就需要花点心思了。
(资料图片)
最终效果图
基础版本
实现方式
- 点击图片,创建蒙层,克隆图片
- 将图片添加定位属性,并添加到蒙层中
- 将蒙层添加到body中
观察下图发现,虽然实现了需求,但是动画很生硬,我们作为前端开发工程师,得对得起工程师
的身份,需要有工匠精神,接下来将介绍如何实现优雅的图片预览效果。
效果图
代码
基础版本 <script> const pic1 = document.querySelector(".pic1"); pic1.addEventListener("click", function () { // 创建蒙层 const mask = document.createElement("div") mask.classList.add("mask"); const pic1Clone = pic1.cloneNode(); pic1Clone.classList.add("previewImg"); // 将图片和蒙层添加到页面中 mask.appendChild(pic1Clone) document.body.appendChild(mask) mask.addEventListener("click", function () { document.body.removeChild(this) }) }) </script>
打开动画
实现方式
- 点击图片
- 克隆原图,计算原图当前距离窗口的top与left的距离(用于确定克隆图片的初始位置)
- 计算克隆图片的初始位置以及其相关属性
- 创建蒙层,并添加相关的定位,背景色属性
- 使用
setTimeout
是为了触发transition
,产生移动效果。 - 并且在
setTimeout
最开始将原图进行隐藏,产生是原图移动到屏幕中心的效果。使用visibility
属性,避免引起页面布局变化。
- 为蒙层添加点击事件
- 点击蒙层后,删除蒙层元素,实现关闭预览功能
效果图
代码
添加预览动画 <script> const pic = document.querySelector(".pic"); pic.addEventListener("click", function () { // 1,克隆元素 const pic2 = pic.cloneNode(); // 2,计算原图距离窗口left,top的距离 picToTop = pic.getBoundingClientRect().x; picToLeft = pic.getBoundingClientRect().y; // 3,设置克隆图片初始位置 pic2.style.position = "absolute"; pic2.style.left = `${picToLeft}px`; pic2.style.top = `${picToTop}px`; // 4,创建蒙层 const mask = document.createElement("div") mask.classList.add("mask"); // 5,将元素添加到body中 mask.appendChild(pic2) document.body.appendChild(mask) // 6,使用setTimeout是为了触发`transition`,产生动画 setTimeout(() => { // 7,隐藏原图片 pic.style.visibility = "hidden"; // 8,设置预览图片展示宽度以及位置 pic2.style.width = "80%"; pic2.style.left = "50%"; pic2.style.top = `200px`; pic2.classList.add("previewImg"); }, 0); // 9,点击蒙层关闭预览 mask.addEventListener("click", function () { this.remove() }) }) </script>
关闭动画
上一个步骤中,实现了点击图片,图片流畅显示的动画。但是关闭的时候很突然,这次将实现关闭的流畅动画。
实现方式
- 点击图片的时候获取原图的
宽度
,以及距离窗口left
,top
的距离 - 点击蒙层的时候将克隆图片的位置移动到原图的位置(根据前面获取的原图位置)
- 当克隆图片回到原图的位置时,需要将原图进行显示。使用
visibility
属性。 - 使用
setTimeout
的原因是触发transition
,产生动画效果。 - 使用300毫秒是因为
transition
设置的是300毫秒的过渡时间,为了能在克隆图片会到原图位置的时候,再显示原图,并删除蒙层。
效果图
代码
查看下个步骤
滚动时取消预览
实现方式
在点击图片的时候,存储当前页面滚动的距离:
lastPositon
监听滚动事件,当滚动的距离减去
lastPositon
的值,大于100px
的时候,触发蒙层的点击事件蒙层收到点击动作后,会执行取消预览的一系列动作。
完整代码
滚动时取消预览 <script> // 16,滚动超过100px。就取消预览 window.onscroll = (e) => { if (Math.abs(window.pageYOffset - lastPositon) > 100) { document.querySelector(".mask")?.click(); } } // 14,预览图片前页面滚动距离初始值 let lastPositon = 0; const pic = document.querySelector(".pic"); pic.addEventListener("click", function () { // 15,计算预览图片前页面滚动距离 lastPositon = window.pageYOffset; // 1,克隆元素 const pic2 = pic.cloneNode(); // 2,计算原图距离窗口left,top的距离 picToTop = pic.getBoundingClientRect().x; picToLeft = pic.getBoundingClientRect().y; // 11,计算原图宽度 picWidth = pic.width; // 3,设置克隆图片初始位置 pic2.style.position = "absolute"; pic2.style.left = `${picToLeft}px`; pic2.style.top = `${picToTop}px`; // 4,创建蒙层 const mask = document.createElement("div") mask.classList.add("mask"); // 5,将元素添加到body中 mask.appendChild(pic2) document.body.appendChild(mask) // 6,使用setTimeout是为了触发`transition`,产生动画 setTimeout(() => { // 7,隐藏原图片 pic.style.visibility = "hidden"; // 8,设置预览图片展示宽度以及位置 pic2.style.position = "absolute"; pic2.style.transition = "all .3s"; pic2.style.transform = "translateX(-50%)"; pic2.style.width = "80%"; pic2.style.left = "50%"; pic2.style.top = `200px`; }, 0); // 9,点击蒙层关闭预览 mask.addEventListener("click", function () { // 10,预览图回到原图位置 pic2.style.width = `${picWidth}px`; pic2.style.left = `${picToLeft}px`; pic2.style.top = `${picToTop}px`; pic2.style.transform = ""; // 12,显示原图 setTimeout(() => { pic.style.visibility = "visible"; // 13,删除蒙层以及预览图 this.remove() }, 300); }) }) </script>
本文转载于:
https://juejin.cn/post/7155789252075356190
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词: 初始位置
【天天时快讯】记录--手把手教学,实现一个优雅的图片预览
每日快报!首款车明年量产!小米汽车最新专利公布:手表控制车有戏
天天热文:A卡游戏画面鲜艳 N卡灰蒙蒙?可能是这里设置错了
焦点播报:北美杀入前十后《流浪地球2》官宣:2月9日在中国香港及澳门上映
焦点简讯:三体人为什么那么害怕地球人的加速器?中科院科普
中国航天科技喊话《流浪地球2》:太空天梯、地球车站、空间驿站有望实现
全球报道:网易二面:CPU狂飙900%,该怎么处理?
每日看点!男子打赏女主播1.8万后起诉欲要回!最终被驳回诉求
焦点速递!男子寄5万元笔记本被摔坏索赔遭拒:屏幕、键盘都烂了 维修要2万
动视暴雪点赞《最后生还者》:索尼令人敬畏 我们被收购是应该的
天天热头条丨官网12.4万元帕纳梅拉遭抢购 保时捷:情况属实 已与首单用户达成协议
当前观察:索尼PS5现货全开放!黄牛惨了:带大量机器退货遭拒
环球资讯:Redis数据结构实战演练,看看微博、微信、购物车、抽奖小程序是如何使用的?
全球聚焦:【促进开发】上海道宁与DHTMLX为您提供易于使用且功能丰富的JavaScript组件
APITable:免费开源的多维表格与可视化数据库,上线1天斩获GitHub星标1000+
今日精选:HTTP笔记1--网络模型
环球速讯:selenium + python自动化测试环境搭建
刘慈欣:30年前拍不成《流浪地球2》 投资人不会信的
观热点:SSD性能领先35倍 机械硬盘命悬一线:没啥理由买
【全球速看料】流浪小狐狸投奔看守所1年胖成球:今年要帮它减肥
不止砍掉UFS 4.0:三星Galaxy S23标准版遭全方位缩水
c++代码实现中时间复杂度的不断优化
聚焦:一步一步实现若依框架--2.4数据权限 data_scope
800W功耗!RTX 4090 Ti四插槽"核弹"真的有 但不一定能生出来
全球微速讯:《最后生还者》剧集第3集与游戏对比 还原度高
实时焦点:摩托骑手广东高速上恶意损坏其他车辆 官方回应:一刀切禁摩很好?
天天观察:云萌 V2.6.3.0 win10,win11 Windows永久激活工具
热推荐:基于Spring Cache实现Caffeine、jimDB多级缓存实战
portswigger 靶场之 XSS 篇 (下)
全球最新:【算法训练营day32】LeetCode122. 买卖股票的最佳时机II LeetCode55. 跳跃游戏 LeetCode45. 跳跃游戏II
部署Kubernetes Cluster
每日短讯:12.4万买新帕纳梅拉!近600名国内网友保时捷官网疯抢:成功下单后被取消
【全球时快讯】奔驰获全球首家L3级自动驾驶认证:开车不用看路 出事故奔驰负责
【快播报】优酷回应1元会员被扣24元争议:活动规则已告知 扣钱没毛病
当前热文:水墨风场景惊艳!《仙剑奇侠传7》DLC《人间如梦》官宣2月发售
彻底扑灭一台特斯拉Model S有多难 消防员实测:用了22.7吨水
天天快消息!Android 软键盘丝滑切换(一)
天天看点:视频发布失败原因不好找?火山引擎数智平台这款产品能帮忙
速看:OpenYurt v1.2 新版本深度解读(一): 聚焦边云网络优化
【环球播资讯】小鹏股价暴跌、交付量惨淡 何小鹏专访回应:未来会这么做
全球动态:全球首个!婴幼儿视功能损伤手机智能筛查系统面世
撸猫手感 绿联iPhone 12-14系列液态硅胶保护壳9.9元起
天天快看点丨海淘不香了!日版Xbox主机涨价将近260元
天天速递!全国首烧?疑似红旗E-HS9充电时起火 现场黑烟弥漫
瑾娘为什么要杀华裳?瑾娘为什么假扮巽芳?
爱在旅途大结局是什么?爱在旅途剧情介绍
法国属于西欧还是北欧?南欧包括哪些国家?
荷兰为什么被称为水之国?荷兰水之国的资料简介
长宽高的英文缩写分别是什么?长宽高怎么算平方?
oppor7手机版本低怎么升级?oppo r7手机参数
复工第一天:请马上卸载这个恶心的软件!!!
全球看热讯:python-paramiko操作的封装
无法定位序数是什么意思?无法定位序数怎么解决?
打印机驱动在电脑哪里找?如何卸载打印机驱动?
无线适配器或访问点有问题是什么意思?无线适配器或访问点有问题怎么处理?
魅族手机怎么样?魅族手机锁屏密码忘了怎么解开?
环球速讯:工信部明天起优化调整微波频率 为5G/6G预留频谱资源
【独家】美国下手真狠!沃尔沃在美被罚8.7亿元 史上最大
快消息!APP竟比线下贵一倍还多 有电影院劝说观众退订淘票票
【世界快播报】提车1周 一特斯拉高速上行驶时方向盘脱落:维修还被收费
每日速读!全球最大游戏展E3辉煌不在:微软索尼任天堂“御三家”将集体缺席
波司登云原生微服务治理探索
今日热门!元宵节将至!元宵夜将出现年度最小满月
世界实时:侄子出演叔叔 MJ传记片年内开拍
【速看料】女子抱娃人肉占车位 还移走路障为自家车开路 结局引人舒适
世界讯息:西安阿房宫站将更名西安西站:原西站不够西
天天观热点:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元大促
焦点要闻:读Java8函数式编程笔记06_Lambda表达式编写并发程序
【全球新要闻】全网影视免费看,最新电影、电视剧免广告免VIP观看,只要你能搜到的,统统都能看,《狂飙》、《三体》追剧神器,时刻掌握最新剧集,无需安装,使用简单,
被苹果踢出供应链两年了 欧菲光仍未缓过劲:2022巨亏40多亿
精选!疯狂玩梗!强盛集团孙红雷直播被买鱼刷屏
焦点短讯!A卡很难追 游戏开发者越来越喜欢DLSS:理由离谱 弥补D加密损失
环球即时看!2023春节档爆发:复苏满座与极端的粉黑大战
每日消息!关于桌面上一万多个图标
刘慈欣:30年前拍不成《流浪地球2》 投资人不信中国有太空电梯
世界快看:老外幸福感暴降:英国近半年轻人担心收入永远不够养家
别贪速度快!SSD选什么接口更适合你?
《敢死队2》观后感
环球快报:VUEX 使用学习六 : modules
国产奋起!26557款软件力挺飞腾CPU
最新资讯:三大航空公司2022年合计预亏逾1000亿元!三大因素、东航最惨
环球观察:三亚凤凰机场出现滚滚浓烟?机场回应:暂无影响
快消息!这次过年 网吧终于活过来了!和以前完全不一样
河南矿山回应3名员工各领500万奖金:有人销售额超3亿
【环球报资讯】每个前端程序员都应该知道的10个Chrome扩展
刘慈欣:电影《流浪地球2》是原创而非小说改编 全方位超越第一部
今日聚焦!广东一男子打球6天后发现头顶卡对手2颗牙:网友神评论
焦点热议:索尼真有你的:背后给微软捅刀子
Acw 170.加成序列
精彩看点:React组件的使用
【全球独家】理想L5车型首次公布:不是SUV 价格坚守20万以上
每日热讯!最新显卡天梯榜公布:前十NVIDIA占五席!RTX 4090断层第一
全球新动态:杭州岳庙秦桧像被砸烂9次 游客仍不解气:专家称泄愤不应暴力
世界资讯:腾讯游戏春节7天吸金超4.5亿:《王者荣耀》独占一半 稳坐第一
世界信息:一加平板来了:Star Orbit金属打造 CNC一体机身
佳能2022年营收破4万亿日元 相机收入暴增 完全不惧手机蚕食
画面有点上头!男子扛铁板狂砸秦桧雕像:《满江红》带火景区热度
赚了!科学家在南极发现罕见大陨石:7.7公斤
全球消息!【Python】爬虫实战-基于代理池的高并发爬虫
焦点快看:rust写一个im聊天服务