原生js自定義右鍵菜單
本文實(shí)例為大家分享了js自定義右鍵菜單的具體代碼,供大家參考,具體內(nèi)容如下
1、右鍵菜單觸發(fā)的基本過(guò)程
實(shí)現(xiàn)自定義右鍵菜單我們首先需要了解以下內(nèi)容:
瀏覽器默認(rèn)的右鍵菜單觸發(fā)的基本過(guò)程
1)、單擊右鍵,菜單出現(xiàn)
2)、菜單出現(xiàn),鼠標(biāo)箭頭一直在菜單左上角
3)、再換個(gè)位置點(diǎn)擊右鍵,原菜單消失,新菜單出現(xiàn)在指定位置
4)、點(diǎn)擊左鍵,中鍵,菜單消失
以上為大致實(shí)現(xiàn)過(guò)程,不全面,僅供參考
也許文字過(guò)于抽象,我們來(lái)看看代碼吧:
2、HTML結(jié)構(gòu)
<!--start右鍵菜單的結(jié)構(gòu)--> <div id="rightmenu" class="rightmenu"> <ul> <li disabled="disabled"> <a href="#" >返回(B)</a> <span>Alt+向左箭頭</span></li> <li><a href="#" >前進(jìn)(F)</a> <span>Alt+向右箭頭</span></li> <li><a href="#" >重新加載(R)</a> <span>Ctrl+R</span></li> </ul> <ul> <li><a href="#" >另存為(A)...</a> <span>Ctrl+S</span></li> <li><a href="#" >打印(P)..</a> <span>Ctrl+P</span></li> <li><a href="#" >投射(C)...</a> <span>Ctrl+R</span></li> </ul> <ul> <li><a href="#" >查看你個(gè)錘代碼(V)</a> <span>Ctrl+U</span></li> <li><a href="#" >檢查你個(gè)瓜皮(N)</a> <span>Ctrl+Shift+L</span></li> </ul> </div> <!--end右鍵菜單的結(jié)構(gòu)--> <div class="box"></div>
3、CSS樣式
*{ margin: 0; padding: 0; } li{ list-style: none; } .rightmenu{ width: 250px; background: #fff; border: 1px solid #bababa; position: fixed; box-sizing: border-box; display: none; } .rightmenu ul{ border-bottom: 1px solid #e9e9e9; } .rightmenu ul li{ height: 30px; line-height: 30px; color: #000; padding: 0 25px; box-sizing: border-box; margin: 2px 0; cursor: default; } .rightmenu ul li:hover{ background: #ebebeb; } .rightmenu ul li a{ font-size: 12px; color: #000; cursor: default; text-decoration: none; } .rightmenu ul li span{ float: right; font-size: 12px; color: #000; } .box{ width: 100px; height: 100px; background: red; }
.rightmenu設(shè)置display:none是因?yàn)橛益I菜單本身是隱藏了因?yàn)辄c(diǎn)擊了才出現(xiàn),倘若不加這句,菜單會(huì)出現(xiàn)在頁(yè)面的左上角。
3、js實(shí)現(xiàn)過(guò)程
分析:
①:瀏覽器本身就有右鍵菜單,我們也要做右鍵菜單,所以應(yīng)當(dāng)阻止瀏覽器的右鍵,這里可以用到preventDefault(),這個(gè)方法有著阻止默認(rèn)事件的功能,科普一下,什么是默認(rèn)事件:
例如: 點(diǎn)我可以知道這是可以跳轉(zhuǎn)到百度的,所以是有個(gè)跳轉(zhuǎn)時(shí)間的,這個(gè)事件我們沒(méi)有去用js實(shí)現(xiàn),他是默認(rèn)的,所以稱之為默認(rèn)事件,同理,瀏覽器右鍵菜單。
②前面我們說(shuō)了菜單出現(xiàn),鼠標(biāo)箭頭一直在菜單左上角,這是怎么實(shí)現(xiàn)的呢,這涉及到event里面的事件發(fā)生坐標(biāo)了,我們點(diǎn)擊的位置就是我們右鍵點(diǎn)擊事件發(fā)生的位置,可以用坐標(biāo)來(lái)解釋這個(gè)位置,clientX(事件發(fā)生點(diǎn)和可視區(qū)域的位置),offsetX(事件發(fā)生點(diǎn)和父級(jí)元素的位置),pageX(事件發(fā)生點(diǎn)和頁(yè)面的位置),screenX(事件發(fā)生點(diǎn)和屏幕的位置),這里我們用offsetX/Y,因?yàn)槲覀兪窃贐OW中點(diǎn)擊,所以具體原因大家百度一下就直道了,我們還是看代碼吧,代碼里標(biāo)注的很詳細(xì)。
<script> document.addEventListener('DOMContentLoaded',function(){ //獲取 var rightMenu=document.getElementById('rightmenu'); //1.首先將右鍵默認(rèn)行為關(guān)閉 window.oncontextmenu=function(event){ event.preventDefault(); //2.設(shè)置右鍵行為 rightMenu.style.display="none";//重置已經(jīng)block的菜單 rightMenu.style.display="block"; rightMenu.style.left=event.offsetX+'px'; rightMenu.style.top=event.offsetY+'px'; } //3.根據(jù)真實(shí)瀏覽器的右鍵來(lái)看左鍵是可以取消右鍵菜單的 document.onclick=function(event){ rightMenu.style.display="none"; } //4.功能并不完善,需要給每個(gè)li寫B(tài)OM事件,這里暫時(shí)不寫了 //5.仔細(xì)檢查你會(huì)發(fā)現(xiàn)當(dāng)右鍵在自己定義的右鍵菜單上時(shí),會(huì)出現(xiàn)一點(diǎn)小情況,可以自己測(cè)試 }) </script>
以上僅供參考,更多的功能實(shí)現(xiàn)都是差不多的原理,好了,結(jié)束了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
原生JS實(shí)現(xiàn)的自動(dòng)輪播圖功能詳解
這篇文章主要介紹了原生JS實(shí)現(xiàn)的自動(dòng)輪播圖功能,結(jié)合實(shí)例形式詳細(xì)分析了基于原生js實(shí)現(xiàn)輪播圖的原理、操作步驟及操作注意事項(xiàng),需要的朋友可以參考下2018-12-12Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本...2006-09-09JS 拖動(dòng)效果實(shí)現(xiàn)代碼 比較簡(jiǎn)單
JS拖動(dòng)效果,計(jì)算的位移,主要是應(yīng)用了鼠標(biāo)事件與坐標(biāo)控制。2009-11-11javascript 瀏覽器判斷 綁定事件 arguments 轉(zhuǎn)換數(shù)組 數(shù)組遍歷
javascript 瀏覽器 判斷 綁定事件 arguments 轉(zhuǎn)換數(shù)組 數(shù)組遍歷等函數(shù)2009-07-07js中將多個(gè)語(yǔ)句寫成一個(gè)語(yǔ)句的兩種方法小結(jié)
js中將多個(gè)語(yǔ)句寫成一個(gè)語(yǔ)句的兩種方法講述了逗號(hào)運(yùn)算符將多個(gè)語(yǔ)句寫成一個(gè)語(yǔ)句以及花括號(hào)寫成一個(gè)語(yǔ)句的實(shí)現(xiàn)方法,需要的朋友可以參考一下2007-12-12js+css實(shí)現(xiàn)扇形導(dǎo)航效果
這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)扇形導(dǎo)航效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08