jQuery探測(cè)位置的提示彈窗(toolTip box)詳細(xì)解析
這里我用jQuery做了個(gè)提示彈窗的js,并做了個(gè)小demo,簡(jiǎn)單總結(jié)下:
方位
根據(jù)當(dāng)前鼠標(biāo)所處的位置不同,箭頭所指向的方向也不同:
左上方(left-top)(缺省)、左下方(left-bottom)、右上方(right-top)、右下方(right-bottom)、上左方(top-left)、上右方(top-right)、下左方(bottom-left)、下右方(bottom-right)
優(yōu)先級(jí)
以上各種情況優(yōu)先級(jí)依次降低
探測(cè)思路
探測(cè)基本思路是:
首先,也是前提條件,判斷容器的高或?qū)捠欠袷菑棿皩?duì)應(yīng)的高或?qū)挼膬杀叮允莾杀?,因?yàn)榕R界點(diǎn)是目標(biāo)容器的各個(gè)邊的中點(diǎn)
/*
* 先判斷目標(biāo)容器的高度或者寬度是否是容器對(duì)應(yīng)高度或?qū)挾扰c箭頭尺寸之和的兩倍,否則,報(bào)錯(cuò)。之所以是2倍,因?yàn)榕R界點(diǎn)是目標(biāo)容器的各個(gè)邊的中點(diǎn)。
*/
接下來(lái),可以依據(jù)優(yōu)先級(jí)去逐個(gè)判斷:
/*
* 思路是,先檢測(cè)左側(cè),再檢測(cè)右側(cè),左右都放不下,則檢測(cè)頂部,都排除,再考慮底部。檢測(cè)左右側(cè)時(shí),先考慮頂部能否放下;檢測(cè)上下時(shí),先考慮據(jù)左右側(cè)那邊的距離大。
* 1.檢測(cè)左側(cè)時(shí),判斷上下距離能否放下箭頭偏移量,有一個(gè)不能放下(例如top),則為['top', 'left'],右側(cè)一樣
* 2.檢測(cè)上下時(shí),判斷左右距離能否放下箭頭偏移量(缺省為上,即top),有一側(cè)不能放下,即為鼠標(biāo)偏向的一側(cè)(若left<right,則left),則為['top', 'left'],此時(shí)箭頭偏移量為0,隨鼠標(biāo)移動(dòng),鼠標(biāo)left增大,則增大,最大至偏移量。
* 缺省是左側(cè),頂部。
*/
具體情況判斷:
•根據(jù)優(yōu)先級(jí),先判斷鼠標(biāo)右側(cè)能否放下彈窗:
◦能放下,則去判斷能否再放進(jìn)個(gè)箭頭
■若能放下
■則判斷頂部是否能放下個(gè)箭頭,包括箭頭的偏移量,若能
■判斷頂部能放下箭頭包括偏移量并且不會(huì)超過(guò)目標(biāo)容器高度,則為left-top
■否則如果頂部大于彈窗高度,并底部可放下箭頭包括其偏移量,則為left-bottom
■否則,判斷底部能放下箭頭和彈窗,則為top-left
■否則,基于我們的前提條件,是bottom-left
■若不能放下,判斷底部能不能放下彈窗和箭頭
■能,則為top-left
■否則,為bottom-left
◦不能放下,則left考慮完,換right,同樣的思路
八種情況彈窗的情況和位置
舉例top-left
case 'top-left' :
// top 加上 箭頭尺寸
this.conObj.css('top', top + tarTop);
// 判斷l(xiāng)eft距離
if ( left < arrOffset ) {
// 緊貼左邊
this.conObj.css('left', tarLeft);
} else if (right < (conWidth - arrOffset)) { // 如果right,撐不下自身在右邊的距離(conWidth - arrOffset),則left值減小,箭頭跟隨鼠標(biāo),使自己右邊與容器對(duì)齊
// 正常顯示的left, 減去右側(cè)還需要的寬度((conWidth - arrOffset) - right ), left - arrOffset - ((conWidth - arrOffset) - right ),得出tarWidth - conWidth
// 換種思路,緊貼右邊,即左邊距離為,目標(biāo)容器寬度減去自身寬度
this.conObj.css('left', tarWidth - conWidth + tarLeft);
} else { // 正常顯示的left
this.conObj.css('left', left - arrOffset + tarLeft);
}
break;
八種情況下箭頭的情況和位置
同樣以top-left為例
case 'top-left' :
this.arrowObj.prependTo(this.conObj);
// 如果con緊貼右邊,此時(shí),箭頭隨鼠標(biāo)移動(dòng)
if (conLeft === 0 && (conWidth > (right + arrOffset))) {
this.arrowObj.css('left', conWidth - right - arrowPos);
} else {
this.arrowObj.css('left', arrowPos);
}
break;
最后說(shuō)下在寫(xiě)代碼時(shí)候的些許感悟:
寫(xiě)的代碼,在重構(gòu)了N遍,寫(xiě)完N行注釋后,忽然想到,其實(shí)不論是寫(xiě)代碼,還是生活,我們都是有個(gè)既定的或者約定俗成的前提或者說(shuō)規(guī)范的。而一旦這個(gè)規(guī)范被打破,往往前功盡棄,即使不是,往往也很受傷。實(shí)例小至代碼、大至社會(huì),無(wú)一例外
- Jquery實(shí)現(xiàn)自定義彈窗示例
- jquery ui dialog實(shí)現(xiàn)彈窗特效的思路及代碼
- 小巧強(qiáng)大的jquery layer彈窗彈層插件
- jquery制作彈窗提示窗口代碼分享
- 運(yùn)用JQuery的toggle實(shí)現(xiàn)網(wǎng)頁(yè)加載完成自動(dòng)彈窗
- 一款基于jQuery的圖片場(chǎng)景標(biāo)注提示彈窗特效
- jQuery實(shí)現(xiàn)彈窗居中效果類(lèi)似alert()
- jquery彈窗插件colorbox綁定動(dòng)態(tài)生成元素的方法
- jquery模擬alert的彈窗插件
- 簡(jiǎn)單實(shí)現(xiàn)jQuery彈窗效果
相關(guān)文章
jQuery實(shí)現(xiàn)菜單式圖片滑動(dòng)切換
這篇文章主要介紹了jQuery實(shí)現(xiàn)菜單式圖片滑動(dòng)切換效果,主要是依托于jQuery Lightbox插件來(lái)實(shí)現(xiàn),非常炫酷,這里推薦給小伙伴們2015-03-03jQuery實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼功能
今天給大家分享一個(gè)基于jquery實(shí)現(xiàn)的簡(jiǎn)單驗(yàn)證碼功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06jQuery getJSON()+.ashx 實(shí)現(xiàn)分頁(yè)(改進(jìn)版)
參考了上一篇Asp .net +jquery +.ashx 文件實(shí)現(xiàn)分頁(yè)并作了改進(jìn):ashx返回json數(shù)據(jù),減少傳輸數(shù)據(jù)量,html頁(yè)面樣式控制也比較靈活,感興趣的朋友可以參考下哈2013-03-03jQuery的Ajax接收java返回?cái)?shù)據(jù)方法
今天小編就為大家分享一篇jQuery的Ajax接收java返回?cái)?shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08jQuery彈出窗口簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了jQuery彈出窗口的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03jQuery實(shí)現(xiàn)百葉窗焦點(diǎn)圖動(dòng)畫(huà)效果代碼分享(附源碼下載)
這篇文章主要介紹了jQuery實(shí)現(xiàn)百葉窗焦點(diǎn)圖動(dòng)畫(huà)效果代碼分享(附源碼下載)的相關(guān)資料,需要的朋友可以參考下2016-03-03jquery 點(diǎn)擊元素后,滾動(dòng)條滾動(dòng)至該元素位置的方法
下面小編就為大家?guī)?lái)一篇jquery 點(diǎn)擊元素后,滾動(dòng)條滾動(dòng)至該元素位置的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08