前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Lightbox

Lightbox

作者头像
Cell
发布于 2022-02-25 09:47:11
发布于 2022-02-25 09:47:11
8090
举报
文章被收录于专栏:Cell的前端专栏Cell的前端专栏

簡介

Lightbox (燈箱),用来放大显示图片覆盖于当前页面之上。其是用 CSS 来定义图片容器,用一幅半透明的 png 图片实现渐变阴暗的效果。

一般的網頁,圖片是使用 img 標籤寫在 HTML 頁面中,圖片點擊并不會放大,想放大看圖片要麼方法整個網頁,要麼複製圖片鏈接新開窗口,操作繁瑣,而使用 Lightbox 的網站可以点击缩略图浮层显示大图,放大後可点击键盘←、→键切换图片,也可以鼠标点击左右箭头切换。按下键盘 Esc 键或者点击关闭按钮可輕鬆關閉圖層,圖片流覽的體驗度是遠遠大於未使用的 Lightbox 的網站。

實現思路

大概思路就在每个图片的点击事件中添加图层与图片副本。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

/** * @author github.com@flymysql */ let container = document.documentElement||document.body; let img,div,src,btnleft,btnright; var imgid=0; let x,y,w,h,tx,ty,tw,th,ww,wh; let closeMove=function(){ if(div==undefined){ return false; } div.style.opacity=0; img.style.height=h+"px"; img.style.width=w+"px"; img.style.left=x+"px"; img.style.top=(y - container.scrollTop)+"px"; // 延迟移除 dom setTimeout(function(){ div.remove(); img.remove(); btnright.remove(); btnleft.remove(); },100); }; let closeFade=function(){ if(div==undefined){ return false; } div.style.opacity=0; img.style.opacity=0; // 延迟移除 dom setTimeout(function(){ div.remove(); img.remove(); btnright.remove(); btnleft.remove(); },100); }; let style=function() { btnleft.style.cssText=` position:fixed; border-radius: 50%;; left:${x - 20}px; top:${y - container.scrollTop + h/2}px; width:50px; height:50px; border: 0px; background-color: rgba(200,200,200,0.8); font-size: 20px; z-index: 999999999; transition:all .3s cubic-bezier(0.165, 0.84, 0.44, 1); `; btnright.style.cssText=` position:fixed; border-radius: 50%; left:${x + w + 20}px; top:${y - container.scrollTop + h/2}px; width:50px; border: 0px; height:50px; font-size: 20px; background-color: rgba(200,200,200,0.8); z-index: 999999999; transition:all .3s cubic-bezier(0.165, 0.84, 0.44, 1); `; btnleft.innerText="<"; btnright.innerText=">"; img.style.cssText=` position:fixed; border-radius: 12px; left:${x}px; top:${y - container.scrollTop}px; width:${w}px; height:${h}px; z-index: 999999999; transition:all .3s cubic-bezier(0.165, 0.84, 0.44, 1); opacity:0; `; } // 监听滚动关闭层 document.addEventListener("scroll",function(){ closeFade(); }); document.querySelectorAll("img").forEach(v=>{ if (v.parentNode.localName!='a') { v.id=imgid; imgid++; v.addEventListener("click",function(e){ // 注册事件 // 记录小图的位置个大小 x=e.target.offsetLeft; y=e.target.offsetTop; w=e.target.offsetWidth; h=e.target.offsetHeight; src=e.target.src; id=e.target.id; // 创建遮罩层 div=document.createElement("div"); div.style.cssText=` position:fixed; left:0; top:0; bottom:0; right:0; background-color: rgba(25,25,25,0.8); z-index:99999999; transition:all .3s cubic-bezier(0.165, 0.84, 0.44, 1); `; document.body.appendChild(div); setTimeout(function(){ div.style.opacity=1; },0); // (此处可以加 loading) // 创建副本 img=new Image(); btnright=document.createElement("button"); btnleft=document.createElement("button"); img.src=src; style(); btnleft.onclick=function(){ if(id===0){ alert("已经是第一张了!"); return; } var left=document.getElementById(id-1); img.src=left.src; x=left.offsetLeft; y=left.offsetTop; w=left.offsetWidth; h=left.offsetHeight; style(); id--; } btnright.onclick=function(){ id++; if(id>=imgid){ alert("已经是最后一张了!"); return; } var right=document.getElementById(id); img.src=right.src; x=right.offsetLeft; y=right.offsetTop; w=right.offsetWidth; h=right.offsetHeight; style(); } img.onload=function(){ document.body.appendChild(img); document.body.appendChild(btnright); document.body.appendChild(btnleft); // 浏览器宽高 wh=window.innerHeight; ww=window.innerWidth; // 目标宽高和坐标 if(w/h<ww/wh){ th=wh-80; tw=w/h*th >> 0; tx=(ww - tw) / 2; ty=40; } else{ tw=ww*0.8; th=h/w*tw >> 0; tx=ww*0.1; ty=(wh-th)/2; } // 延迟写入否则不会有动画 setTimeout(function(){ img.style.opacity=1; img.style.height=th+"px"; img.style.width=tw+"px"; img.style.left=tx+"px"; img.style.top=ty+"px"; btnleft.style.left=(tx-90)+"px"; btnleft.style.top=(ty+th/2)+"px"; btnright.style.left=(tx+tw+40)+"px"; btnright.style.top=(ty+th/2)+"px"; // 点击隐藏 div.onclick=img.onclick=closeMove; },10); }; });//end event } });//end forEach

fancybox

fancybox 是一個完善的 lightbox 插件 jQuery lightbox script for displaying images, videos and more. Touch enabled, responsive and fully customizable.

Quick start

  1. Add latest jQuery and fancyBox files

1 2 3 4

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <link href="/path/to/jquery.fancybox.min.css" rel="stylesheet"> <script src="/path/to/jquery.fancybox.min.js"></script>

  1. Create links

1 2 3 4 5 6 7

<a data-fancybox="gallery" href="big_1.jpg"> <img src="small_1.jpg"> </a> <a data-fancybox="gallery" href="big_2.jpg"> <img src="small_2.jpg"> </a>

  1. Enjoy!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 簡介
  • 實現思路
  • fancybox
    • Quick start
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档