jQuery實(shí)現(xiàn)百度圖片移入移出內(nèi)容提示框上下左右移動(dòng)的效果
閑來(lái)無(wú)聊,看到百度圖片hover的時(shí)候提示框的效果,遂想試一試自己能否實(shí)現(xiàn)。
百度圖片hover的效果:

需求:
1. 當(dāng)鼠標(biāo)從圖片上部移入的時(shí)候,提示框從上部移到正常位置。從上部移出的時(shí)候,提示框從正常位置移到上部。
2. 當(dāng)鼠標(biāo)從圖片左部移入的時(shí)候,提示框從左部移到正常位置。從左部移出的時(shí)候,提示框從正常位置移到左部
3. 當(dāng)鼠標(biāo)從圖片右部移入的時(shí)候,提示框從右部移到正常位置。從右部移出的時(shí)候,提示框從正常位置移到右部
4. 當(dāng)鼠標(biāo)從圖片下部移入的時(shí)候,提示框從下部移到正常位置。從下部移出的時(shí)候,提示框從正常位置移到下部
先上實(shí)現(xiàn)的效果圖:

實(shí)現(xiàn)原理:
1. 把圖片看做一個(gè)矩形,把這個(gè)矩形,按對(duì)角線分成四份,每一份對(duì)應(yīng)上下左右的部分。
2. 獲取鼠標(biāo)移入div之后的坐標(biāo),獲取該div離瀏覽器頂部和左部的距離,就能知道在該div中,鼠標(biāo)移入的坐標(biāo)。
3. 以div左上角為原點(diǎn),水平和豎直方向做坐標(biāo)軸。
4. 算出移入的點(diǎn)與x軸的夾角 β 和 θ。再與 α 角做比較,最后判斷是在哪個(gè)范圍內(nèi)的。
如圖:

說(shuō)明:
1) β,θ是移入的點(diǎn)與x軸的夾角,求這兩個(gè)角與 α 的關(guān)系,才能知道到底是在哪個(gè)區(qū)域
2)已知條件:x,y,x0,y0。分別代表圖片寬和高,移入的x,y坐標(biāo)。
3)不管是鼠標(biāo)從哪個(gè)區(qū)域移入或移出,只要求到移入的點(diǎn)與 x 軸的夾角的大小關(guān)系,就能正確判斷。
夾角判斷所在區(qū)域:
當(dāng) 0 < β ≤ α,移入的點(diǎn)在 1 和 4 區(qū)域,
當(dāng) α < β ≤ 90,移入的點(diǎn)在 2 和 3 區(qū)域,
當(dāng) 0 < θ ≤ α,移入的點(diǎn)在 1 和 2 區(qū)域,
當(dāng) α < θ ≤ 90,移入的點(diǎn)在 3 和 4 區(qū)域,
那么,要判斷在 1 區(qū)域里面的話,滿(mǎn)足的條件就必須為:0 < β ≤ α,0 < θ ≤ α 以此類(lèi)推。。。
原理搞清楚了,就可以上代碼了。
1. html
<div class="box"> <img src="upimg/comm.png"/> <div class="innerBox"> <div class="inner"></div> </div> </div>
說(shuō)明:box是裝圖片的一個(gè)列表,innerBox是裝提示框的盒子,inner是提示框的內(nèi)容,inner也要設(shè)置絕對(duì)定位是因?yàn)橹挥羞@樣才能設(shè)置top和left值。實(shí)際上就相當(dāng)于給人錯(cuò)覺(jué)提示框innerBox在移動(dòng),實(shí)際上是提示框里的內(nèi)容inner在移動(dòng)。
2. css
*{
padding:0;
margin: 0;
}
.box{
width: 300px;
height: 300px;
background: skyblue;
float: left;
position: relative;
overflow: hidden;
margin:10px 10px 0 0;
}
.innerBox{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 40px;
}
img{
width: 100%;
}
.inner{
position: absolute;
top:40px;
left: 0;
width: 100%;
height: 40px;
background: red;
}
3. js
$('.box').hover(function(e){
getIn($(this),e)
},function(e){
getOut($(this),e)
})
//獲取在第幾區(qū)域
function getdirection(obj,e){
var bleft=obj.offset().left;//距離左部的大小
var btop=obj.offset().top;//距離頂部的大小
var li_w=obj.width();//每個(gè)圖片的寬度
var li_h=obj.height();//每個(gè)圖片的高度
var evt=e||window.event;
var x=evt.pageX-bleft;//鼠標(biāo)在該圖片中的x坐標(biāo)
var y=evt.pageY-btop;//鼠標(biāo)在該圖片中的y坐標(biāo)
x=Math.abs(x);//這里是防止移出的時(shí)候,x的值為負(fù)(bleft的值大于pageX)
y=Math.abs(y);//與上同理
if(x>li_w){
x=li_w-(x-li_w);//這里是防止在第四部分移出的時(shí)候,pageX的值大于圖片的長(zhǎng)度,所以需要用到長(zhǎng)度減去多余的部分就是在第四區(qū)域的對(duì)稱(chēng)位置
}
var Alltan=Math.atan(li_h/li_w);//這是α
var leftTan=Math.atan(y/x);//這是β
var rightTan=Math.atan(y/(li_w-x));//這是θ
if(0<=leftTan&&leftTan<=Alltan&&0<=rightTan&&rightTan<=Alltan){
console.log("在第一部分")
return 1;
}else if(Alltan<=leftTan&&leftTan<=Math.asin(1)&&0<=rightTan&&rightTan<=Alltan){
console.log("在第二部分");
return 2;
}else if(Alltan<=leftTan&&leftTan<=Math.asin(1)&&Alltan<=rightTan&&rightTan<=Math.asin(1)){
console.log("在第三部分");
return 3;
}else if(0<=leftTan&&leftTan<=Alltan&&Alltan<=rightTan&&rightTan<=Math.asin(1)){
console.log("在第四部分");
return 4;
}
}
//移入
function getIn(obj,e){
var statu=getdirection(obj,e);
var li_w=obj.width();
var that=obj.find('.inner');
var child_h=that.height();
if(statu===1){
that.css({
"left":0,
"top":-child_h
}).stop().animate({
"top":0
},200)
}else if(statu===2){
that.css({
"left":-li_w,
"top":0
}).stop().animate({
"left":0
},200)
}else if(statu===3){
that.stop().animate({
"top":0
},200)
}else if(statu===4){
that.css({
"left":li_w,
"top":0
}).stop().animate({
"left":0
},200)
}
}
//移出
function getOut(obj,e){
var statu=getdirection(obj,e);
var li_w=obj.width();
var that=obj.find('.inner');
var child_h=that.height();
if(statu===1){
that.stop().animate({
"top":-child_h
},200,function(){
$(this).css({
"left":0,
"top":child_h
})
})
}else if(statu===2){
that.stop().animate({
"left":-li_w
},200,function(){
$(this).css({
"left":0,
"top":child_h
})
})
}else if(statu===3){
that.stop().animate({
"top":child_h
},200)
}else if(statu===4){
that.stop().animate({
"left":li_w
},200,function(){
$(this).css({
"left":0,
"top":child_h
})
})
}
}
說(shuō)明:Math.asin(1) 表示 90度的反正弦值,由于tan90不存在,所以換成sin90了。
總結(jié):對(duì)比自己做的和百度的圖片效果,發(fā)現(xiàn)百度的動(dòng)畫(huà)給人明顯的要舒服點(diǎn),估計(jì)是因?yàn)橐瞥龅臅r(shí)候,我直接設(shè)置css,導(dǎo)致動(dòng)畫(huà)不連貫原因,還有個(gè)就是stop()導(dǎo)致動(dòng)畫(huà)直接結(jié)束,所以還有可以修改的地方。這里只介紹一個(gè)思路
以上所述是小編給大家介紹的jQuery實(shí)現(xiàn)百度圖片移入移出內(nèi)容提示框上下左右移動(dòng)的效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
addEventListener—jQuery的事件監(jiān)聽(tīng)方法
在Javascript中,事件監(jiān)聽(tīng)是非常重要的,通過(guò)事件監(jiān)聽(tīng),我們可以在用戶(hù)執(zhí)行某些操作時(shí)觸發(fā)相應(yīng)的處理程序。最初,Javascript監(jiān)聽(tīng)事件的方式是addEvent。addEvent()比較麻煩,所以jQuery為我們提供了一個(gè)更為便捷的事件監(jiān)聽(tīng)方法:addEventListener。2023-06-06
jQuery學(xué)習(xí)筆記(1)--用jQuery實(shí)現(xiàn)異步通信(用json傳值)具體思路
這是一個(gè)簡(jiǎn)單的POST 請(qǐng)求功能以取代復(fù)雜 $.ajax,請(qǐng)求成功時(shí)可調(diào)用回調(diào)函數(shù),感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-04-04
JQuery使用屬性addClass、removeClass和toggleClass實(shí)現(xiàn)增加和刪除類(lèi)操作示例
這篇文章主要介紹了JQuery使用屬性addClass、removeClass和toggleClass實(shí)現(xiàn)增加和刪除類(lèi)操作,涉及jquery事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)使用技巧,需要的朋友可以參考下2019-11-11
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR錯(cuò)誤
今天測(cè)試偶然發(fā)現(xiàn)jquery.bgiframe.js在IE9環(huán)境下提示錯(cuò)誤,于是很是好奇,想辦法知道究竟,于是搜索了一下,現(xiàn)在與大家分享希望可以幫助你們2013-01-01
文本框水印提示效果的簡(jiǎn)單實(shí)現(xiàn)代碼
本篇文章主要是對(duì)文本框水印提示效果的簡(jiǎn)單實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
詳解jquery插件jquery.viewport.js學(xué)習(xí)使用方法
本篇文章主要介紹了詳解jquery插件jquery.viewport.js學(xué)習(xí)使用方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
簡(jiǎn)單講解jQuery中的子元素過(guò)濾選擇器
這篇文章主要介紹了jQuery中的子元素過(guò)濾選擇器,列舉了一些操作DOM時(shí)獲取父元素的一些方法,需要的朋友可以參考下2016-04-04
jQuery UI實(shí)現(xiàn)動(dòng)畫(huà)效果代碼分享
這篇文章給大家總結(jié)了jQuery UI實(shí)現(xiàn)動(dòng)畫(huà)效果的實(shí)例代碼,有需要的朋友們可以參考測(cè)試下。2018-08-08

