jQuery當(dāng)鼠標(biāo)懸停時(shí)放大圖片的效果實(shí)例
這個(gè)效果最初源于小敏同志的一個(gè)想法,剛開始做的時(shí)候只能實(shí)現(xiàn)彈出的圖片是固定的,不能隨鼠標(biāo)移動(dòng),最后加以改善,終于實(shí)現(xiàn)了比較理想的效果。今天就把制作該效果的經(jīng)驗(yàn)與大家一同分享。先看看最終效果演示:
HTML結(jié)構(gòu)部分:
先編寫一個(gè)無序列表的結(jié)構(gòu),a標(biāo)簽中的img標(biāo)簽用來存放小圖片,a標(biāo)簽添加一個(gè)rel屬性,用來存放大圖片的路徑。
<UL id=gallery sizcache="6" sizset="7">
<LI sizcache="6" sizset="7"><A class="smallimage" href="http://www.dbjr.com.cn" rel=images/001_big.jpg><IMG alt="" src="images/001_small.jpg"></A>
<LI sizcache="6" sizset="8"><A class="smallimage" href="http://www.dbjr.com.cn" rel=images/002_big.jpg><IMG alt="" src="images/002_small.jpg"></A>
<LI sizcache="6" sizset="9"><A class="smallimage" href="http://www.dbjr.com.cn" rel=images/003_big.jpg><IMG alt="" src="images/003_small.jpg"></A>
</LI></UL>
CSS樣式表部分:
bigimage是用jQuery創(chuàng)建的一個(gè)p標(biāo)簽的id,用來存放大圖片,設(shè)置其樣式為絕對(duì)定位,并先隱藏。給a標(biāo)簽添加一個(gè)黑色的背景,是為了給圖片變暗的效果做鋪墊。就這樣,一個(gè)簡單的相冊(cè)效果就做好了。
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; /*添加一個(gè)黑色的背景為圖片變暗的效果做鋪墊*/ display:block; width:200px; height:200px; }
#bigimage { position:absolute; display:none; /*大圖片的父標(biāo)簽設(shè)置相對(duì)定位并將顯示樣式設(shè)置為隱藏*/ }
#bigimage img { width:400px; height:400px; padding:5px; background:#fff; border:1px solid #e3e3e3; }
jQuery代碼部分:
先聲明2個(gè)變量x,y用來存放大圖片離鼠標(biāo)的距離。在body中追加一個(gè)id為bigimage的p標(biāo)簽,用來存放大圖片,大圖片的路徑就包含在了a標(biāo)簽的rel屬性中。當(dāng)鼠標(biāo)在小圖片懸停的時(shí)候,將獲取到的鼠標(biāo)在瀏覽器中的坐標(biāo)賦值給大圖片絕對(duì)定位的坐標(biāo),并以淡入的效果顯示。之后,再給小圖片綁定一個(gè)mousemove事件,也就是當(dāng)鼠標(biāo)移動(dòng)的時(shí)候,大圖片就會(huì)跟著鼠標(biāo)移動(dòng)了。看以下的代碼:
<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){ //綁定一個(gè)鼠標(biāo)懸停時(shí)事件
//新建一個(gè)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)算并賦值給大圖片絕對(duì)定位的坐標(biāo),然后以fadeIn的效果顯示
$("#bigimage").css({top:(e.pageY - y ) + 'px',left:(e.pageX + x ) + 'px'}).fadeIn('fast');
},function(){ //鼠標(biāo)離開后
//將變暗的圖片復(fù)原
$(this).find('img').stop().fadeTo('slow',1);
//移除新增的p標(biāo)簽
$("#bigimage").remove();
});
$("a.smallimage").mousemove(function(e){ //綁定一個(gè)鼠標(biāo)移動(dòng)的事件
//將鼠標(biāo)的坐標(biāo)和聲明的x,y做運(yùn)算并賦值給大圖片絕對(duì)定位的坐標(biāo),這樣大圖片就能跟隨圖片而移動(dòng)了
$("#bigimage").css({top:(e.pageY -y ) + 'px',left:(e.pageX + x ) + 'px'});
});
});
//]]>
</script>
到這一步,效果已經(jīng)差不多了,但是正如藍(lán)秋楓同志提到的,效果還并不完美。如果彈出的大圖片超過了瀏覽器的寬度就會(huì)出現(xiàn)滾動(dòng)條,這對(duì)于用戶體驗(yàn)來說的確很不好。趁周末有時(shí)間我又在原來的基礎(chǔ)上進(jìn)行了修改。
先分析下思路,默認(rèn)情況下,彈出的大圖片的位置始終是在當(dāng)前鼠標(biāo)指針的右側(cè),如果當(dāng)前鼠標(biāo)指針離瀏覽器右側(cè)邊界的寬度小于彈出的大圖片的寬度時(shí),就會(huì)出現(xiàn)圖片溢出瀏覽器的現(xiàn)象。那么只要寫一個(gè)語句判斷當(dāng)前鼠標(biāo)指針離瀏覽器右側(cè)的邊界的寬度是否小于大圖片的寬度,然后再根據(jù)這個(gè)判斷來顯示。
有了上面的思路就好辦了,為了使代碼更簡潔,提高復(fù)用性,我新增了一個(gè)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)
{
//重新計(jì)算變量x的值
x = imageWidth + 22;
//此時(shí)大圖片的位置應(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>
解決了圖片溢出瀏覽器的問題,這個(gè)效果還算不錯(cuò)了。如果你喜歡這個(gè)效果,你可以下載源文件。
- 基于jQuery仿淘寶產(chǎn)品圖片放大鏡特效
- 基于jQuery仿淘寶產(chǎn)品圖片放大鏡代碼分享
- jQuery實(shí)現(xiàn)類似淘寶網(wǎng)圖片放大效果的方法
- 基于Jquery插件開發(fā)之圖片放大鏡效果(仿淘寶)
- 用JQuery模仿淘寶的圖片放大鏡顯示效果
- jQuery實(shí)現(xiàn)等比例縮放大圖片讓大圖片自適應(yīng)頁面布局
- 基于jquery實(shí)現(xiàn)一張圖片點(diǎn)擊鼠標(biāo)放大再點(diǎn)縮小
- jQuery插件zoom實(shí)現(xiàn)圖片全屏放大彈出層特效
- jquery實(shí)現(xiàn)淘寶商品圖片局部放大
相關(guān)文章
web前端開發(fā)JQuery常用實(shí)例代碼片段(50個(gè))
本文給大家展示50個(gè)jquery代碼片段,這些代碼能夠給你的javascript項(xiàng)目提供幫助,需要的朋友快來學(xué)習(xí)一下吧2015-08-08jquery下操作HTML控件的實(shí)現(xiàn)代碼
jquery 的操作HTML控件,需要的朋友可以參考下。2010-01-01jQuery晃動(dòng)層特效實(shí)現(xiàn)方法
這篇文章主要介紹了jQuery晃動(dòng)層特效實(shí)現(xiàn)方法,實(shí)例分析了animate方法與css樣式的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03JQuery form表單提交前驗(yàn)證單選框是否選中、刪除記錄時(shí)驗(yàn)證經(jīng)驗(yàn)總結(jié)(整理)
這篇文章主要介紹了JQuery form表單提交前驗(yàn)證單選框是否選中、刪除記錄時(shí)驗(yàn)證經(jīng)驗(yàn)總結(jié),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06jquery 獲取自定義屬性(attr和prop)的實(shí)現(xiàn)代碼
jquery中用attr()方法來獲取和設(shè)置元素屬性,attr是attribute(屬性)的縮寫,在jQuery DOM操作中會(huì)經(jīng)常用到attr(),attr()有4個(gè)表達(dá)式2012-06-06jQuery中Nicescroll滾動(dòng)條插件的用法
本篇文章主要介紹了jQuery中Nicescroll滾動(dòng)條插件的用法,Nicescroll滾動(dòng)條插件是一個(gè)非常強(qiáng)大的基于jQuery的滾動(dòng)條插件,有需要的可以了解下。2016-11-11