js實(shí)現(xiàn)百度登錄框鼠標(biāo)拖拽效果
以百度的登錄窗口為例,學(xué)習(xí)鼠標(biāo)拖拽效果如何實(shí)現(xiàn),拖拽范圍限定以及登錄窗口自動居中。學(xué)會如何制作彈出窗口特效,了解把元素設(shè)置為可拖拽的原理。
知識點(diǎn):
1.掌握對可拖拽對話框的實(shí)現(xiàn)原理
2.了解元素如何觸發(fā)腳本方法以及如何編寫偵聽事件
3. 學(xué)會設(shè)置元素在頁面中居中和全屏
注意區(qū)別:
1.screenX:鼠標(biāo)位置相對于用戶屏幕水平偏移量,而screenY也就是垂直方向的,此時的參照點(diǎn)也就是原點(diǎn)是屏幕的左上角。
2.clientX:跟screenX相比就是將參照點(diǎn)改成了瀏覽器內(nèi)容區(qū)域的左上角,該參照點(diǎn)會隨之滾動條的移動而移動。
3.pageX:參照點(diǎn)也是瀏覽器內(nèi)容區(qū)域的左上角,但它不會隨著滾動條而變動。
鼠標(biāo)事件:
鼠標(biāo)事件1 - 在標(biāo)題欄上按下(要計(jì)算鼠標(biāo)相對拖拽元素的左上角的坐標(biāo),并且標(biāo)記元素為可拖動)
鼠標(biāo)事件2 - 鼠標(biāo)移動時(要檢測元素是否標(biāo)記為可移動,如果是,則更新元素的位置到當(dāng)前鼠標(biāo)的位置【ps:要減去第一步中獲得的偏移】)
鼠標(biāo)事件3 - 鼠標(biāo)松開的時候(標(biāo)記元素為不可拖動即可)
效果:
完整代碼及注釋:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <style type="text/css"> *{ margin: 0; padding: 0; list-style: none; } .main{ width: 600px; height: 320px; margin: 0 auto; margin-top: 80px; margin-left: 400px; } .img{ text-align: center; } .item1{ margin-left: 115px; width: 600px; } .item1 li{ float: left; width: 50px; } .text{ width: 600px; margin-left: 80px; margin-top: 5px; } .text .txt{ width: 450px; height: 30px; } .text .btn{ width: 70px; height: 30px; cursor: pointer; } .item2{ width: 600px; margin-left: 200px; margin-top: 30px; } .item2 li{ float: left; margin-left: 10px; } .link{ text-align: right; line-height: 30px; padding-right: 40px; } .logmove{ width: 380px; height: auto; background: #fff; } .Box{ width: 380px; height: auto; position: absolute; left: 100px; top: 100px; border: 1px solid #d5d5d5; z-index: 9000; background: #fff; display: none; } .title{ height: 48px; line-height: 48px; color: #535353; background: #f5f5f5; padding: 0px 20px; font-size: 16px; border-bottom: 1px solid #efefef; cursor: move; user-select: none; } .title .closebtn{ display: block; width: 16px; height: 16px; position: absolute; top: 15px; right: 20px; background: url("img/close_def.png") no-repeat; cursor: pointer; } .title .closebtn:hover{ background: url("img/close_hov.png"); } .content{ padding: 15px 20px; } .Input{ padding-top: 15px; } .txt1,.txt2,.Input{ height: 40px; line-height: 40px; text-align: right; } .username,.password{ width: 100%; height: 40px; margin: 0px; padding: 0px; border: 1px solid #c1c1c1; text-indent: 25px; outline: none; } .username{ background: url("img/input_username.png") no-repeat 2px; } .password{ background: url("img/input_password.png") no-repeat 2px; } .submit{ width: 100%; height: 50px; background: #3b7ae3; border: none; font-size: 16px; color: #fff; outline: none; text-decoration: none; display: block; text-align: center; line-height: 50px; } .submit:hover{ background: #3f81b0; } .mask{ width: 100%; height: 100%; background: #000; position: absolute; top: 0; left: 0; z-index: 8000; opacity: 0.4; filter: Alpha(opacity=40); display: none; } </style> <script type="text/javascript"> window.onload=function(){ //獲取元素對象 function g(id){ return document.getElementById(id); } //自動居中 - 登錄浮層 ( el = Element) function autoCenter(el){ var bodyW = document.documentElement.clientWidth;//網(wǎng)頁可視區(qū)域 var bodyH = document.documentElement.clientHeight; var elW = el.offsetWidth;//登錄框的寬度 var elH = el.offsetHeight; el.style.left = (bodyW - elW) / 2 + 'px';//實(shí)現(xiàn)居中 el.style.top = (bodyH - elH) / 2 + 'px'; } //自動全屏 - 遮罩 function fillToBody(el){ el.style.width = document.documentElement.clientWidth + 'px'; el.style.height = document.documentElement.clientHeight + 'px'; } var mouseOffsetX = 0;//鼠標(biāo)偏移量 var mouseOffsetY = 0; var isDraging = false; //鼠標(biāo)事件1 - 在標(biāo)題欄上按下(要計(jì)算鼠標(biāo)相對拖拽元素的左上角的坐標(biāo),并且標(biāo)記元素為可拖動) g('title').addEventListener('mousedown',function(e){ var e = e||window.event; mouseOffsetX = e.pageX - g('Box').offsetLeft; mouseOffsetY = e.pageY - g('Box').offsetTop; isDraging = true; }) //鼠標(biāo)事件2 - 鼠標(biāo)移動時(要檢測元素是否標(biāo)記為可移動,如果是,則更新元素的位置到當(dāng)前鼠標(biāo)的位置【ps:要減去第一步中獲得的偏移】) document.onmousemove = function(e){ var e = e||window.event; var mouseX = e.pageX;//鼠標(biāo)當(dāng)前位置 var mouseY = e.pageY; var moveX = 0;//浮層元素的新位置 var moveY = 0; if(isDraging === true){ moveX = mouseX - mouseOffsetX; moveY = mouseY - mouseOffsetY; //拖拽范圍限定 moveX > 0 并且 moveX < (頁面最大寬度 - 浮層的寬度) // moveY > 0 并且 moveY < (頁面最大高度 - 浮層的高度) var pageWidth = document.documentElement.clientWidth;//頁面寬度 var pageHeight = document.documentElement.clientHeight; var BoxWidth = g('Box').offsetWidth; var BoxHeight = g('Box').offsetHeight; var maxX = pageWidth - BoxWidth; var maxY = pageHeight - BoxHeight; moveX = Math.max(0,moveX);//實(shí)際上就是獲得moveX的所有正數(shù)值,也就是規(guī)定范圍的下限值 moveX = Math.min(maxX,moveX);//實(shí)際上就是規(guī)定了moveX的上限值 moveY = Math.max(0,moveY); moveY = Math.min(maxY,moveY); /* moveX =Math.min(maxX, Math.max(0,moveX)); moveY =Math.min(maxY, Math.max(0,moveY)); */ g('Box').style.left = moveX + 'px'; g('Box').style.top = moveY + 'px'; } } //鼠標(biāo)事件3 - 鼠標(biāo)松開的時候(標(biāo)記元素為不可拖動即可) document.onmouseup = function(){ isDraging = false; } function showBox(){ g('Box').style.display = 'block'; g('mask').style.display = 'block'; autoCenter(g('Box')); fillToBody(g('mask')); } function hideBox(){ g('Box').style.display = 'none'; g('mask').style.display = 'none'; } g('log').onclick = function(){ showBox(); } g('close').onclick = function(){ hideBox(); } /*窗口改變大小時的處理 1.保持登錄浮層居中 2.保持遮罩的全屏,使之不會出現(xiàn)滾動條 */ window.onresize = function(){ autoCenter(g('Box')); fillToBody(g('mask')); } } </script> <body> <div class="link"><a href="#" id="log">登錄</a></div> <div class="main"> <div class="img"><img src="img/baidu.png" /></div> <div class="item1"> <ul> <li><a href="#">新聞</a></li> <li><a href="#">網(wǎng)頁</a></li> <li><a href="#">貼吧</a></li> <li><a href="#">知道</a></li> <li><a href="#">音樂</a></li> <li><a href="#">圖片</a></li> <li><a href="#">視頻</a></li> <li><a href="#">地圖</a></li> </ul> </div> <div class="text"> <br/> <input type="text" class="txt"> <input type="button" value="百度一下" class="btn"> </div> <div class="item2"> <ul> <li><a href="#">百科</a></li> <li><a href="#">文庫</a></li> <li><a href="#">hao123</a></li> <li><a href="#">更多>></a></li> </ul> </div> </div> <div class="mask" id="mask"></div> <div class="Box" id="Box"> <div class="logmove" id="logmove" onselect="return false"> <div class="title" id="title"> 登錄通行證<a href="#" class="closebtn" id="close"></a> </div> </div> <div class="content"> <div class="Input"> <input class="username" type="text" placeholder="手機(jī)/郵箱/用戶名"> </div> <div class="Input"> <input class="password" type="text" placeholder="密碼"> </div> <div class="txt1"> <a href="#">忘記密碼</a> </div> <div> <a href="#" class="submit">登錄</a> </div> <div class="txt2"> <a href="#">立即注冊</a> </div> </div> </div> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生JS實(shí)現(xiàn)可拖拽登錄框
- Javascript實(shí)現(xiàn)登錄框拖拽效果
- js實(shí)現(xiàn)登錄框鼠標(biāo)拖拽效果
- 百度Popup.js彈出框進(jìn)化版 拖拽小框架發(fā)布 兼容IE6/7/8,Firefox,Chrome
- javascript 網(wǎng)頁編輯框及拖拽圖片的問題
- js實(shí)現(xiàn)彈出框的拖拽效果實(shí)例代碼詳解
- 使用純JS實(shí)現(xiàn)checkbox的框選效果(鼠標(biāo)拖拽多選)
- JavaScript實(shí)現(xiàn)模態(tài)框拖拽效果
- HTML+CSS+JavaScript實(shí)現(xiàn)可拖拽模態(tài)框
- javascript實(shí)現(xiàn)登錄框拖拽
相關(guān)文章
JavaScript捕捉事件和阻止冒泡事件實(shí)例分析
這篇文章主要介紹了JavaScript捕捉事件和阻止冒泡事件,結(jié)合實(shí)例形式分析了冒泡的原理及javascript阻止冒泡的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08JavaScript實(shí)現(xiàn)Tab點(diǎn)擊切換
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)Tab點(diǎn)擊切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07javascript 解決表單仍然提交即使監(jiān)聽處理函數(shù)返回false
解決表單依舊提交即使監(jiān)聽處理函數(shù)返回false2010-03-03gulp-htmlmin壓縮html的gulp插件實(shí)例代碼
這篇文章主要介紹了gulp-htmlmin壓縮html的gulp插件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-06-06JS獲取鼠標(biāo)坐標(biāo)、獲取鼠標(biāo)像素點(diǎn)示例
運(yùn)行代碼之后隨意移動鼠標(biāo)的位置,可適時顯現(xiàn)鼠標(biāo)的坐標(biāo)點(diǎn),不占用系統(tǒng)資源2014-03-03Base64(二進(jìn)制)圖片編碼解析及在各種瀏覽器的兼容性處理
這篇文章主要介紹了Base64(二進(jìn)制)圖片編碼解析及在各種瀏覽器的兼容性處理,需要的朋友可以參考下2017-02-02JavaScript Date對象應(yīng)用實(shí)例分享
這篇文章主要分享了JavaScript Date對象應(yīng)用實(shí)例,獲取日期時間,倒計(jì)時功能實(shí)現(xiàn),限時搶購活動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10微信小程序換膚功能實(shí)現(xiàn)代碼(思路詳解)
這篇文章主要介紹了微信小程序換膚功能實(shí)現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08