這是一個基於jQuery的效果,當鼠標在小圖片上懸停時,會彈出一個大圖,該大圖會跟隨鼠標的移動而移動。這個效果最初源於小敏同志的一個想法,剛開始做的時候只能實現彈出的圖片是固定的,不能隨鼠標移動,最后加以改善,終於實現了比較理想的效果。今天就把制作該效果的經驗與大家一同分享。先看看最終效果演示:

HTML結構部分:
先編寫一個無序列表的結構,a標簽中的img標簽用來存放小圖片,a標簽添加一個rel屬性,用來存放大圖片的路徑。
1 |
<ul id= "gallery" > |
2 |
<li><a href= "http://stylechen.com/" class = "smallimage" rel= "images/001_big.jpg" ><img src= "images/001_small.jpg" alt= "" ></a></li> |
3 |
|
4 |
<li><a href= "http://stylechen.com/" class = "smallimage" rel= "images/002_big.jpg" ><img src= "images/002_small.jpg" alt= "" ></a></li> |
5 |
|
6 |
<li><a href= "http://stylechen.com/" class = "smallimage" rel= "images/003_big.jpg" ><img src= "images/003_small.jpg" alt= "" ></a></li> |
7 |
</ul> |
CSS樣式表部分:
bigimage是用jQuery創建的一個p標簽的id,用來存放大圖片,設置其樣式為絕對定位,並先隱藏。給a標簽添加一個黑色的背景,是為了給圖片變暗的效果做鋪墊。就這樣,一個簡單的相冊效果就做好了。
1 |
ul#gallery { list-style:none; width:660px; margin:0 auto 10px; padding-left:20px; border:1px solid #d3d3d3; background:#fff; overflow:hidden; } |
2 |
3 |
ul#gallery li { width:200px; height:200px; float :left; margin:20px 20px 20px 0; } |
4 |
5 |
ul#gallery li a.smallimage { background:#333; /*添加一個黑色的背景為圖片變暗的效果做鋪墊*/ display:block; width:200px; height:200px; } |
6 |
7 |
#bigimage { position:absolute; display:none; /*大圖片的父標簽設置相對定位並將顯示樣式設置為隱藏*/ } |
8 |
9 |
#bigimage img { width:400px; height:400px; padding:5px; background:#fff; border:1px solid #e3e3e3; } |
jQuery代碼部分:
先聲明2個變量x,y用來存放大圖片離鼠標的距離。在body中追加一個id為bigimage的p標簽,用來存放大圖片,大圖片的路徑就包含在了a標簽的rel屬性中。當鼠標在小圖片懸停的時候,將獲取到的鼠標在瀏覽器中的坐標賦值給大圖片絕對定位的坐標,並以淡入的效果顯示。之后,再給小圖片綁定一個mousemove事件,也就是當鼠標移動的時候,大圖片就會跟着鼠標移動了。看以下的代碼:
01 |
<script src= "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type= "text/javascript" ></script> |
02 |
<script type= "text/javascript" > |
03 |
//<![CDATA[ |
04 |
$(function(){ |
05 |
06 |
var x = 22; |
07 |
var y = 20; |
08 |
09 |
$( "a.smallimage" ).hover(function(e){ //綁定一個鼠標懸停時事件 |
10 |
//新建一個p標簽來存放大圖片,this.rel就是獲取到a標簽的大圖片的路徑,然后追加到body中 |
11 |
$( "body" ).append( "<p id=" bigimage "><img src=" " this.rel " " alt=" " /></p>" ); |
12 |
|
13 |
//改變小圖片的透明度為0.5,結合上面的CSS,看起來就象是圖片變暗了 |
14 |
$( this ).find( "img" ).stop().fadeTo( "slow" ,0.5); |
15 |
|
16 |
//將鼠標的坐標和聲明的x,y做運算並賦值給大圖片絕對定位的坐標,然后以fadeIn的效果顯示 |
17 |
$( "#bigimage" ).css({top:(e.pageY - y ) "px" ,left:(e.pageX x ) "px" }).fadeIn( "fast" ); |
18 |
|
19 |
},function(){ <a href= "http://www.sorcerylinux.org/" >best australian pokies</a> //鼠標離開后 |
20 |
|
21 |
//將變暗的圖片復原 |
22 |
$( this ).find( "img" ).stop().fadeTo( "slow" ,1); |
23 |
|
24 |
//移除新增的p標簽 |
25 |
$( "#bigimage" ).remove(); |
26 |
}); |
27 |
|
28 |
$( "a.smallimage" ).mousemove(function(e){ //綁定一個鼠標移動的事件 |
29 |
|
30 |
//將鼠標的坐標和聲明的x,y做運算並賦值給大圖片絕對定位的坐標,這樣大圖片就能跟隨圖片而移動了 |
31 |
$( "#bigimage" ).css({top:(e.pageY -y ) "px" ,left:(e.pageX x ) "px" }); |
32 |
}); |
33 |
}); |
34 |
35 |
//]]> |
36 |
</script> |
到這一步,效果已經差不多了,但是正如藍秋楓同志提到的,效果還並不完美。如果彈出的大圖片超過了瀏覽器的寬度就會出現滾動條,這對於用戶體驗來說的確很不好。趁周末有時間我又在原來的基礎上進行了修改。
先分析下思路,默認情況下,彈出的大圖片的位置始終是在當前鼠標指針的右側,如果當前鼠標指針離瀏覽器右側邊界的寬度小於彈出的大圖片的寬度時,就會出現圖片溢出瀏覽器的現象。那么只要寫一個語句判斷當前鼠標指針離瀏覽器右側的邊界的寬度是否小於大圖片的寬度,然后再根據這個判斷來顯示。
有了上面的思路就好辦了,為了使代碼更簡潔,提高復用性,我新增了一個widthJudge函數用於判斷寬度:
01 |
function widthJudge(e){ |
02 |
//頁面的總寬度減去鼠標當前的X坐標得到右側邊界的寬度 |
03 |
var marginRight = document.documentElement.clientWidth - e.pageX; |
04 |
05 |
//獲取彈出的大圖片的寬度 |
06 |
var imageWidth = $( "#bigimage" ).width(); |
07 |
08 |
//如果右側邊界的寬度小於彈出的大圖片的寬度 |
09 |
if (marginRight < imageWidth) |
10 |
{ |
11 |
//重新計算變量x的值 |
12 |
x = imageWidth 22; |
13 |
14 |
//此時大圖片的位置應該是當前鼠標指針的寬度減去新的x的值 |
15 |
$( "#bigimage" ).css({top:(e.pageY - y ) "px" ,left:(e.pageX - x ) "px" }); |
16 |
} else { //否則 |
17 |
//仍將x定義為22,這一步千萬不能省略,因為之前x的值已經改變 |
18 |
x = 22; |
19 |
20 |
//如果右側的寬度值夠顯示大圖片,將仍然按照原來的位置顯示 |
21 |
$( "#bigimage" ).css({top:(e.pageY - y ) "px" ,left:(e.pageX x ) "px" }); |
22 |
}; |
23 |
} |
最后再結合上面的代碼,完整的jQuery代碼部分如下:
01 |
<script type= "text/javascript" > |
02 |
//<![CDATA[ |
03 |
$(function(){ |
04 |
|
05 |
var x = 22; |
06 |
var y = 20; |
07 |
|
08 |
$( "a.smallimage" ).hover(function(e){ |
09 |
$( "body" ).append( "<p id=" bigimage "><img src=" " this.rel " " alt=" " /></p>" ); |
10 |
$( this ).find( "img" ).stop().fadeTo( "slow" ,0.5); |
11 |
widthJudge(e); //調用寬度判斷函數 |
12 |
$( "#bigimage" ).fadeIn( "fast" ); |
13 |
},function(){ |
14 |
$( this ).find( "img" ).stop().fadeTo( "slow" ,1); |
15 |
$( "#bigimage" ).remove(); |
16 |
}); |
17 |
|
18 |
$( "a.smallimage" ).mousemove(function(e){ |
19 |
widthJudge(e); //調用寬度判斷函數 |
20 |
}); |
21 |
|
22 |
function widthJudge(e){ |
23 |
var marginRight = document.documentElement.clientWidth - e.pageX; |
24 |
var imageWidth = $( "#bigimage" ).width(); |
25 |
if (marginRight < imageWidth) |
26 |
{ |
27 |
x = imageWidth 22; |
28 |
$( "#bigimage" ).css({top:(e.pageY - y ) "px" ,left:(e.pageX - x ) "px" }); |
29 |
} else { |
30 |
x = 22; |
31 |
$( "#bigimage" ).css({top:(e.pageY - y ) "px" ,left:(e.pageX x ) "px" }); |
32 |
}; |
33 |
} |
34 |
}); |
35 |
//]]> |
36 |
</script> |
解決了圖片溢出瀏覽器的問題,這個效果還算不錯了。如果你喜歡這個效果,你可以下載源文件。