首页IT科技图片预览图(记录–手把手教学,实现一个优雅的图片预览)

图片预览图(记录–手把手教学,实现一个优雅的图片预览)

时间2025-06-17 22:49:25分类IT科技浏览8325
导读:这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助...

这里给大家分享我在网上总结出来的一些知识                ,希望对大家有所帮助

打开动画

实现方式

点击图片 克隆原图                       ,计算原图当前距离窗口的top与left的距离(用于确定克隆图片的初始位置) 计算克隆图片的初始位置以及其相关属性 创建蒙层        ,并添加相关的定位            ,背景色属性 使用setTimeout是为了触发transition                       ,产生移动效果               。 并且在setTimeout最开始将原图进行隐藏            ,产生是原图移动到屏幕中心的效果                        。使用visibility属性        ,避免引起页面布局变化        。 为蒙层添加点击事件 点击蒙层后                       ,删除蒙层元素                ,实现关闭预览功能

效果图

代码

<!DOCTYPE html> <html lang="en"> <head> <title>添加预览动画</title> <style> .pic { width: 400px; } .mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.7); transition: all .3s; } .previewImg { position: absolute; transform: translateX(-50%); transition: all .3s; } </style> </head> <body> <img class="pic" src="https://www.cnblogs.com/smileZAZ/archive/2023/01/31/xtjj.jpg" alt=""> <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> </body> </html>

关闭动画

上一个步骤中                       ,实现了点击图片            ,图片流畅显示的动画           。但是关闭的时候很突然        ,这次将实现关闭的流畅动画                        。

实现方式

点击图片的时候获取原图的宽度                       ,以及距离窗口left                ,top的距离 点击蒙层的时候将克隆图片的位置移动到原图的位置(根据前面获取的原图位置) 当克隆图片回到原图的位置时    ,需要将原图进行显示            。使用visibility属性       。 使用setTimeout的原因是触发transition                       ,产生动画效果                        。 使用300毫秒是因为transition设置的是300毫秒的过渡时间                   ,为了能在克隆图片会到原图位置的时候,再显示原图                    ,并删除蒙层                。

效果图

代码

查看下个步骤

滚动时取消预览

实现方式

在点击图片的时候                       ,存储当前页面滚动的距离:lastPositon

监听滚动事件    ,当滚动的距离减去lastPositon的值                ,大于100px的时候                       ,触发蒙层的点击事件

蒙层收到点击动作后        ,会执行取消预览的一系列动作   。

完整代码

<!DOCTYPE html> <html lang="en"> <head> <title>滚动时取消预览</title> <style> body { height: 1000px; } .pic { width: 400px; } .mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.7); transition: all .3s; } </style> </head> <body> <img class="pic" src="https://www.cnblogs.com/smileZAZ/archive/2023/01/31/xtjj.jpg" alt=""> <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> </body> </html>

本文转载于:

https://juejin.cn/post/7155789252075356190

如果对您有所帮助            ,欢迎您点个关注        ,我会定时更新技术文档                       ,大家一起讨论学习                ,一起进步                    。

声明:本站所有文章    ,如无特殊说明或标注                       ,均为本站原创发布。任何个人或组织                   ,在未征得本站同意时,禁止复制                、盗用                       、采集        、发布本站内容到任何网站            、书籍等各类媒体平台                   。如若本站内容侵犯了原著者的合法权益                    ,可联系我们进行处理                        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
小文章哪里可以投稿(小文章如何投网站赚钱吗-写文章收益越来越少?写文章、刷金币双管齐下,业余作者增收之道) 如何增加公司网站的曝光量(掌握SEO优化排名,轻松提升网站曝光度)