2016.5.3 updata v1.1
添加了页码显示;
添加了鼠标滚轮控制上下切换图片的功能;
添加了esc退出看图模式的功能。(但实际使用中需要按两次esc,第一次esc是退出全屏模式,第二次按esc才是退出看图模式。)
时隔一年,有点感慨啊。
昨天在虚拟机里360安全浏览器查看网页上的一些问题,偶然发现,在有多张大图的页面中,360安全浏览器会询问是否开启看图模式。开了一下试了试,发现它是新开了个窗口并全屏置顶,在里面查看图片,在看图体验上确实好很多:
今天闲来无事,于是闭门造车(因为我今天做的时候没去再看360的),做了一个类似的效果出来,并且用在了本站上。本站的效果如下:
我做的这个没有做成全屏,也没有新开窗口,只是在页面上建立了一个遮罩层。没有360的特色化功能,右侧列表也没那么好看。不过更简洁一些,只有浏览和切换图片的功能。点击大图是下一张,但大图没有做做点击左侧、右侧跳到上一张/下一张图片的功能(百度图片的方法是在图片上做两个左右的div)。现在设置的是页面最少有3张图片才会启用看图模式,启用后在页面右侧会有个悬浮按钮,点击即可进入看图模式。每次打开不会恢复到上一次看到的图片,如果想要记住位置的话把代码中第二个“litImgIndex=0;”删掉即可。
除了右侧缩略图列表是固定宽度的,其他地方都可以适应页面变化。原本右侧缩略图列表的高度是固定的,但现在改成了自适应高度,手机上也能正常使用了。
本站使用中的代码贴在下边。需要在其他地方使用的话也很容易。下面代码的第25行,将需要的图片保存到了变量里。如果你拿去使用,把获取图片的代码改成符合你网站的就行。
最后,将函数“viweImgMode()”在window.onload()或$(document).ready()中调用即可。
<!--看图模式--> <script src="http://cdn.bootcss.com/screenfull.js/2.0.0/screenfull.min.js"></script> <style type="text/css"> #viewImgModeRight ul{margin: 0;padding: 0;} #viewImgModeRight ul li{list-style: none;} #viewImgModeButton{width:25px;height:118px;text-align:center;font-size:14px;font-family:微软雅黑;position: fixed;z-index: 9999;background:#444;color:#fff;cursor: pointer;right:0;top:30%;border-radius: 4px;border:1px solid #000; } #viewImgModeWrap{position: fixed;z-index: 99999;top: 0;left: 0;width: 100%;height: 100%;background: #161616;} #viewImgModeRight{float: right;width: 160px;text-align: center;margin-top: 30px;} #viewImgModeLeft{float: right;height:100%;position: relative;text-align: center;} #yema{height: 30px;min-width: 40px; background:#0F0F0F;color: #fff;font-size:14px;padding: 0 20px;position: absolute;bottom: 2%;left: 50%;margin-left: -40px;z-index: 999;line-height: 30px;border-radius:4px;} #bigImg{max-width: 95%;max-height: 95%;position: absolute;} #preImg,#nextImg{width: 150px;height: 60px;cursor: pointer;border-radius: 8px;opacity: .6;} #preImg{background:url(/f/pre_next_bg.png) center 15px no-repeat #000;} #nextImg{background:url(/f/pre_next_bg.png) center -65px no-repeat #000;} #imgList{position: relative;top: 0;left: 0;transition:.2s all linear;} .imgList_li{max-width: 130px;background: #111;margin: 14px auto;padding: 0px 0;} .imgList_li_img{max-width: 130px;max-height: 130px;cursor: pointer;vertical-align:middle;opacity: .7;} #exitViewImgMode{width: 150px;height: 40px;background: #000;text-align: center;line-height: 44px;font-size:14px;font-family:微软雅黑;color: #fff;cursor: pointer;letter-spacing: 1px;margin-top: 6px;} #imgListWrap{position: relative;height: 600px;overflow: hidden;margin: 6px 0;top: 0;background: #000;padding: 0px 0;border-bottom:10px solid #000;} .opacity10{opacity: 1;box-shadow:0px 0px 11px #51ADF5;} </style> <script type="text/javascript"> function viweImgMode (){ //获取所有图片 var postImg=document.getElementsByClassName("post_t")[0].getElementsByTagName("img"); var bodyYuanCssText=document.getElementsByTagName('body')[0].style.cssText; var litImgIndex=0; //如果存在图片 if (postImg.length>2) { //创建看图模式的按钮 var viewImgModeButton=document.createElement("div"); viewImgModeButton.id="viewImgModeButton"; viewImgModeButton.innerHTML="进入看图模式"; document.body.appendChild(viewImgModeButton); //创建图片对象 function imgObj (src,width,height) { this.src=src; this.width=width; this.height=height; } //创建所有图片的对象 var allImg=new Array(); for (var i = 0; i < postImg.length; i++) { allImg[i]=new imgObj(postImg[i].getAttribute("src"),postImg[i].offsetWidth,postImg[i].offsetHeight); }; //点击看图模式按钮时创建布局 document.getElementById("viewImgModeButton").onclick=function (){ if (!screenfull.isFullscreen){screenfull.request();} //如果看图模式的元素已经存在 则显示。有很多在创建时定义过的元素,此时会提示找不到(但是表现上没有发现异常),所以我还是重新获取了一遍。实际上,如果在下面的if中省略var来声明变量的话应该可以直接用。也可以考虑在这个if外定义变量。 if (!!document.getElementById("viewImgModeWrap")) { _scrollTop=document.documentElement.scrollTop|| document.body.scrollTop; document.getElementById("viewImgModeWrap").style.display="block"; document.getElementsByTagName('body')[0].style.cssText =bodyYuanCssText+"max-height:"+window.innerHeight+"px;overflow: hidden;"; document.getElementById("bigImg").setAttribute("src", allImg[0].src); litImgIndex=0; for (var iiii = 0; iiii< document.getElementsByClassName("imgList_li_img").length; iiii++) { document.getElementsByClassName("imgList_li_img")[iiii].className="imgList_li_img"; }; document.getElementsByClassName("imgList_li_img")[0].className+=" opacity10"; document.getElementById("viewImgModeLeft").style.width=(document.body.clientWidth)-(document.getElementById("viewImgModeRight").offsetWidth)+"px"; document.getElementById("imgList").style.top="0px"; setCenter(); //考虑到窗口大小可能已经改变,需要重新设置右侧的高度 document.getElementById("imgListWrap").style.height=(document.body.clientHeight-250)+"px"; } //否则 创建元素 else if (!document.getElementById("viewImgModeWrap")){ //创建wrap var viewImgModeWrap=document.createElement("div"); viewImgModeWrap.id="viewImgModeWrap"; viewImgModeWrap.setAttribute("onselectstart","return false"); viewImgModeWrap.innerHTML="<div id=\"viewImgModeRight\"> <ul style=\"width: 150px;\"> <li id=\"preImg\" title=\"查看上一张图片\"></li> <div id=\"imgListWrap\"> <ul id=\"imgList\"> </ul> </div> <li id=\"nextImg\" title=\"查看下一张图片\"></li> <li id=\"exitViewImgMode\">退出看图模式</li> </ul></div><div id=\"viewImgModeLeft\"> <img id=\"bigImg\" src=\"\" alt=\"\" title=\"点击切换到下一张图片\"> <div id='yema'></div> </div>"; document.body.appendChild(viewImgModeWrap); //存储并设置卷去的高度 _scrollTop=document.documentElement.scrollTop|| document.body.scrollTop; document.getElementsByTagName('body')[0].style.cssText =bodyYuanCssText+"max-height:"+window.innerHeight+"px;overflow: hidden;"; document.getElementById("imgListWrap").style.height=(document.getElementById("viewImgModeLeft").offsetHeight-240)+"px"; //向右侧输出内容 function creatRightLi(){ var imgList_li=document.createElement("li"); imgList_li.className="imgList_li"; imgList_li.innerHTML="<img src='' class='imgList_li_img'>"; document.getElementById("imgList").appendChild(imgList_li); } //创建右侧的li和img for (var ii = 0; ii < postImg.length; ii++) { creatRightLi(); }; //设置右侧的高度 document.getElementById("imgListWrap").style.height=(document.body.clientHeight-250)+"px"; var rightImg=document.getElementsByClassName("imgList_li_img"); var rightLi=document.getElementsByClassName("imgList_li"); //获取右侧缩略图的li,会存储每个li的高度以供图片向上滚动时使用。原本存储的是缩略图的高度,但是如果图片高度是97.5px,js取值的时候会是98,这种情况下会导致误差。所以改成了li //存储每个缩略图高度的数组 litLiHeight=new Array(); //设置各个li里面img的属性 for (var j = 0; j < rightImg.length; j++) { //设置缩略图的路径 rightImg[j].setAttribute("src", allImg[j].src); //存储缩略图li的高度 litLiHeight[j]=rightLi[j].offsetHeight; rightImg[j].index=j; rightImg[j].onclick=function () { bigImg.setAttribute("src", allImg[this.index].src); setCenter(); for (var iii = 0; iii< rightImg.length; iii++) { rightImg[iii].className="imgList_li_img"; }; this.className+=" opacity10"; litImgIndex=this.index; } }; var bigImg=document.getElementById("bigImg"); //设置左侧区域的宽度 var leftWrap=document.getElementById("viewImgModeLeft"); leftWrap.style.width=(document.body.clientWidth)-(document.getElementById("viewImgModeRight").offsetWidth)+"px"; //设置大图 bigImg.setAttribute("src", allImg[0].src); rightImg[0].className+=" opacity10"; function setCenter () { document.getElementById("bigImg").style.marginTop=-(document.getElementById("bigImg").offsetHeight*0.5)+"px"; document.getElementById("bigImg").style.top="50%"; document.getElementById("bigImg").style.marginLeft=-(document.getElementById("bigImg").offsetWidth*0.5)+"px"; document.getElementById("bigImg").style.left="50%"; }; setCenter(); var preImg=document.getElementById("preImg"); var nextImg=document.getElementById("nextImg"); function topreImg(){ litImgtop=null; var litImgtop2=null; if (litImgIndex>0) { litImgIndex--; bigImg.setAttribute("src", allImg[litImgIndex].src); setCenter(); for (var iii = 0; iii< rightImg.length; iii++) { rightImg[iii].className="imgList_li_img"; }; rightImg[litImgIndex].className+=" opacity10"; //如果已经是第一张图片了,则不改变top值 if (litImgIndex==0) {document.getElementById("imgList").style.top="0px";return false;}; for (var iiiii = 0; iiiii < litImgIndex; iiiii++) { litImgtop+=(litLiHeight[iiiii]+14);//加上margin值和padding值,如果有。我这里margin-top是14 document.getElementById("imgList").style.top="-"+(litImgtop)+"px"; }; }else{ //alert("当前已经是第一张图片了。"); return false; }; } function tonextImg() { litImgtop=null; var litImgtop2=null; if (litImgIndex<rightImg.length-1) { litImgIndex++; bigImg.setAttribute("src", allImg[litImgIndex].src); setCenter(); for (var iii = 0; iii< rightImg.length; iii++) { rightImg[iii].className="imgList_li_img"; }; rightImg[litImgIndex].className+=" opacity10"; for (var iiiii = 0; iiiii < litImgIndex; iiiii++) { litImgtop+=(litLiHeight[iiiii]+14);//加上margin值和padding值,如果有。 document.getElementById("imgList").style.top="-"+(litImgtop)+"px"; }; }else{ //alert("当前已经是最后一张图片了。"); return false; }; } //设置页码显示 function setNo (){ document.getElementById("yema").innerHTML=(litImgIndex+1)+" / "+rightImg.length; } setNo (); //先执行一次 显示出来 //上一张图片 preImg.onclick=function () {topreImg();setNo ();} //下一张图片 nextImg.onclick=function () {tonextImg();setNo ();}; // bigImg.onclick=function () {window.open(this.src)}; bigImg.onclick=function () {tonextImg();setNo ();}; //区别浏览器来添加鼠标滚轮事件 function addEvent(obj,xEvent,fn) { if(obj.attachEvent){ obj.attachEvent('on'+xEvent,fn); }else{ obj.addEventListener(xEvent,fn,false); } } var fullDiv=document.getElementById("viewImgModeWrap"); addEvent(fullDiv,'mousewheel',onMouseWheel); addEvent(fullDiv,'DOMMouseScroll',onMouseWheel); //当鼠标滚动时执行 function onMouseWheel(ev) { var ev = ev || window.event; var down = true; // 定义一个标志,当滚轮向下滚时,执行一些操作 down = ev.wheelDelta?ev.wheelDelta<0:ev.detail>0; if(ev.preventDefault){ //FF 和 Chrome ev.preventDefault();// 阻止默认事件 } if(down){ tonextImg(); setNo (); }else{ topreImg(); setNo (); } } //当窗口改变时,重新计算左侧的宽度以及重设居中 window.onresize=function () { leftWrap.style.width=(document.body.clientWidth)-(document.getElementById("viewImgModeRight").offsetWidth)+"px"; //重新设置右侧高度 document.getElementById("imgListWrap").style.height=(document.getElementById("viewImgModeLeft").offsetHeight-240)+"px"; setCenter(); } //退出看图模式 function quitViewImgMode () { if (screenfull.isFullscreen){screenfull.exit();} document.getElementById("viewImgModeWrap").style.display="none"; document.getElementsByTagName('body')[0].style.cssText=bodyYuanCssText; if(navigator.userAgent.indexOf('AppleWebKit') > -1){//如果是chrome内核,则 document.body.scrollTop =_scrollTop; }else{//否则 document.documentElement.scrollTop=_scrollTop; } } // 按下Esc 键时 document.onkeydown=function(event){ var e = event || window.event || arguments.callee.caller.arguments[0]; if(e && e.keyCode==27){ quitViewImgMode(); } }; //当点击退出按钮时 document.getElementById("exitViewImgMode").onclick=function () {quitViewImgMode()}; }; } }; } </script> <!--看图模式end-->
为本站制作了看图模式
-
Google Chrome 59GNU/Linux x64 -
Google Chrome 59GNU/Linux x64 厉害了,我的哥,今天周五,刚好试试!
成功了,除了那两个链接失效了,我已经修改了,其他没有问题。