以前我們?nèi)绻獙?shí)現(xiàn)放大圖片效果必須寫段很長的js代碼,下面我來介紹利用jQuery的鼠標(biāo)懸停時放大圖片的效果制作方法,代碼比以前少了N倍哦。
<!DOCTYPE html> <html> <head> <meta charset="gb2312" /> <title>基于jQuery的鼠標(biāo)懸停時放大圖片的效果制作</title> <style> * { margin:0; padding:0; } img { vertical-align:bottom; border:none; } body { background:#f0f0f0; height:800px; font-family:Arial;} ul { list-style:none; } h1{ font-size:20px; width:680px; margin:3% auto 5px; color:#202020; } h6{ width:680px; margin:0 auto 20px; font-size:12px; font-weight:normal; color:#333; } h6 a { color:#09c; } ul#gallery { width:660px; margin:0 auto 10px; padding-left:20px; border:1px solid #d3d3d3; background:#fff; overflow:hidden; } ul#gallery li { width:200px; height:200px; float:left; margin:20px 20px 20px 0; display:inline; } ul#gallery li a.smallimage { background:#333; display:block; width:200px; height:200px; } #bigimage { position:absolute; display:none; } #bigimage img { width:400px; height:400px; padding:5px; background:#fff; border:1px solid #e3e3e3; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script> //<![CDATA[ $(function(){ var x = 22; var y = 20; $("a.smallimage").hover(function(e){ $("body").append('<p id="bigimage"><img src="'+ this.rel + '" alt="" /></p>'); $(this).find('img').stop().fadeTo('slow',0.5); widthJudge(e); $("#bigimage").fadeIn('fast'); },function(){ $(this).find('img').stop().fadeTo('slow',1); $("#bigimage").remove(); }); $("a.smallimage").mousemove(function(e){ widthJudge(e); }); function widthJudge(e){ var marginRight = document.documentElement.clientWidth - e.pageX; var imageWidth = $("#bigimage").width(); if(marginRight < imageWidth) { x = imageWidth + 22; $("#bigimage").css({top:(e.pageY - y ) + 'px',left:(e.pageX - x ) + 'px'}); }else{ x = 22; $("#bigimage").css({top:(e.pageY - y ) + 'px',left:(e.pageX + x ) + 'px'}); }; } }); //]]> </script> </head> <body> <h1>基于jQuery的鼠標(biāo)懸停時放大圖片的效果演示</h1> <ul id="gallery"> <li><a href="/" class="smallimage" rel="images/001_big.jpg"><img src="images/001_small.jpg" alt="" /></a></li> <li><a href="/" class="smallimage" rel="images/002_big.jpg"><img src="images/002_small.jpg" alt="" /></a></li> <li><a href="/" class="smallimage" rel="images/003_big.jpg"><img src="images/003_small.jpg" alt="" /></a></li> </ul> </body> </html> |
下面我來給大家一步不解析這個實(shí)例
HTML結(jié)構(gòu)部分:
先編寫一個無序列表的結(jié)構(gòu),a標(biāo)簽中的img標(biāo)簽用來存放小圖片,a標(biāo)簽添加一個rel屬性,用來存放大圖片的路徑。
代碼如下 |
|
<UL id=gallery> <LI><A class=smallimage href=/site/eycmscn/upfile/201603/1631171611520.jpg><IMG alt="" src="images/001_small.jpg"></A></LI> <LI><A class=smallimage href=/site/eycmscn/upfile/201603/1631171613119.jpg><IMG alt="" src="images/002_small.jpg"></A></LI> <LI><A class=smallimage href=/site/eycmscn/upfile/201603/1631171614335.jpg><IMG alt="" src="images/003_small.jpg"></A></LI> </UL> |
CSS樣式表部分:
bigimage是用jQuery創(chuàng)建的一個p標(biāo)簽的id,用來存放大圖片,設(shè)置其樣式為絕對定位,并先隱藏。給a標(biāo)簽添加一個黑色的背景,是為了給圖片變暗的效果做鋪墊。就這樣,一個簡單的相冊效果就做好了
代碼如下 |
|
ul#gallery { list-style:none; width:660px; margin:0 auto 10px; padding-left:20px; border:1px solid #d3d3d3; background:#fff; overflow:hidden; } ul#gallery li { width:200px; height:200px; float:left; margin:20px 20px 20px 0; } ul#gallery li a.smallimage { background:#333; /*添加一個黑色的背景為圖片變暗的效果做鋪墊*/ display:block; width:200px; height:200px; } #bigimage { position:absolute; display:none; /*大圖片的父標(biāo)簽設(shè)置相對定位并將顯示樣式設(shè)置為隱藏*/ } #bigimage img { width:400px; height:400px; padding:5px; background:#fff; border:1px solid #e3e3e3; } |
jQuery代碼部分:
先聲明2個變量x,y用來存放大圖片離鼠標(biāo)的距離。在body中追加一個id為bigimage的p標(biāo)簽,用來存放大圖片,大圖片的路徑就包含在了a標(biāo)簽的rel屬性中。當(dāng)鼠標(biāo)在小圖片懸停的時候,將獲取到的鼠標(biāo)在瀏覽器中的坐標(biāo)賦值給大圖片絕對定位的坐標(biāo),并以淡入的效果顯示。之后,再給小圖片綁定一個mousemove事件,也就是當(dāng)鼠標(biāo)移動的時候,大圖片就會跟著鼠標(biāo)移動了??匆韵碌拇a:
代碼如下 |
|
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ $(function(){ var x = 22; var y = 20; $("a.smallimage").hover(function(e){ //綁定一個鼠標(biāo)懸停時事件 //新建一個p標(biāo)簽來存放大圖片,this.rel就是獲取到a標(biāo)簽的大圖片的路徑,然后追加到body中 $("body").append("<p id="bigimage"><img src="" this.rel "" alt="" /></p>"); //改變小圖片的透明度為0.5,結(jié)合上面的CSS,看起來就象是圖片變暗了 $(this).find("img").stop().fadeTo("slow",0.5); //將鼠標(biāo)的坐標(biāo)和聲明的x,y做運(yùn)算并賦值給大圖片絕對定位的坐標(biāo),然后以fadeIn的效果顯示 $("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}).fadeIn("fast"); },function(){ <A href="http://www.sorcerylinux.org/">best australian pokies</A> //鼠標(biāo)離開后 //將變暗的圖片復(fù)原 $(this).find("img").stop().fadeTo("slow",1); //移除新增的p標(biāo)簽 $("#bigimage").remove(); }); $("a.smallimage").mousemove(function(e){ //綁定一個鼠標(biāo)移動的事件 //將鼠標(biāo)的坐標(biāo)和聲明的x,y做運(yùn)算并賦值給大圖片絕對定位的坐標(biāo),這樣大圖片就能跟隨圖片而移動了 $("#bigimage").css({top:(e.pageY -y ) "px",left:(e.pageX x ) "px"}); }); }); //]]> </script> |
到這一步,效果已經(jīng)差不多了,但是正如藍(lán)秋楓同志提到的,效果還并不完美。如果彈出的大圖片超過了瀏覽器的寬度就會出現(xiàn)滾動條,這對于用戶體驗(yàn)來說的確很不好。趁周末有時間我又在原來的基礎(chǔ)上進(jìn)行了修改。
先分析下思路,默認(rèn)情況下,彈出的大圖片的位置始終是在當(dāng)前鼠標(biāo)指針的右側(cè),如果當(dāng)前鼠標(biāo)指針離瀏覽器右側(cè)邊界的寬度小于彈出的大圖片的寬度時,就會出現(xiàn)圖片溢出瀏覽器的現(xiàn)象。那么只要寫一個語句判斷當(dāng)前鼠標(biāo)指針離瀏覽器右側(cè)的邊界的寬度是否小于大圖片的寬度,然后再根據(jù)這個判斷來顯示。
有了上面的思路就好辦了,為了使代碼更簡潔,提高復(fù)用性,我新增了一個widthJudge函數(shù)用于判斷寬度
代碼如下 |
|
function widthJudge(e){ //頁面的總寬度減去鼠標(biāo)當(dāng)前的X坐標(biāo)得到右側(cè)邊界的寬度 var marginRight = document.documentElement.clientWidth - e.pageX;
//獲取彈出的大圖片的寬度 var imageWidth = $("#bigimage").width(); //如果右側(cè)邊界的寬度小于彈出的大圖片的寬度 if(marginRight < imageWidth) { //重新計算變量x的值 x = imageWidth 22; //此時大圖片的位置應(yīng)該是當(dāng)前鼠標(biāo)指針的寬度減去新的x的值 $("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX - x ) "px"}); }else{ //否則 //仍將x定義為22,這一步千萬不能省略,因?yàn)橹皒的值已經(jīng)改變 x = 22; //如果右側(cè)的寬度值夠顯示大圖片,將仍然按照原來的位置顯示 $("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}); }; } |
最后再結(jié)合上面的代碼,完整的jQuery代碼部分如下:
代碼如下 |
|
<script type="text/javascript"> //<![CDATA[ $(function(){ var x = 22; var y = 20; $("a.smallimage").hover(function(e){ $("body").append("<p id="bigimage"><img src="" this.rel "" alt="" /></p>"); $(this).find("img").stop().fadeTo("slow",0.5); widthJudge(e); //調(diào)用寬度判斷函數(shù) $("#bigimage").fadeIn("fast"); },function(){ $(this).find("img").stop().fadeTo("slow",1); $("#bigimage").remove(); }); $("a.smallimage").mousemove(function(e){ widthJudge(e); //調(diào)用寬度判斷函數(shù) }); function widthJudge(e){ var marginRight = document.documentElement.clientWidth - e.pageX; var imageWidth = $("#bigimage").width(); if(marginRight < imageWidth) { x = imageWidth 22; $("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX - x ) "px"}); }else{ x = 22; $("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}); }; } }); //]]> </script> |
解決了圖片溢出瀏覽器的問題,這個效果還算不錯了。如果你喜歡這個效果