原生JS實現可拖拽登入框
阿新 • • 發佈:2021-10-20
本文分享一個用原生實現的可拖拽登入框,效果如下:
實現的程式碼如下:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>原生JS實現可拖拽登入框</title> <style type="text/"> body { /* 背景圖 */ background: url(images/0.png) #fff top center no-repeat; padding: 0px; margin: 0px; font-size: 12px; font-family: "微軟雅黑"; } .link { text-align: right; line-height: 20px; padding-right: 40px; } .ui-dialog { width: 380px; height: auto; display: none; position: absolute; z-index: 9000; top: 0px; left: 0px; border: 1px solid #D5D5D5; background: #fff; } .ui-dialog a { text-decoration: none; } .ui-dialog-title { height: 48px; line-height: 48px; padding: 0px 20px; color: #535353; font-size: 16px; border-bottom: 1px solid #efefef; background: #f5f5f5; cursor: move; user-select: none; } .ui-dialog-closebutton { width: 16px; height: 16px; display: block; position: absolute; top: 12px; right: 20px; /* 關閉登入框的圖示 */ background: url(images/1.png) no-repeat; cursor: pointer; } .ui-dialog-closebutton:hover { /* 關閉登入框滑鼠懸停時的圖示 */ background: url(images/2.png); } .ui-dialog-content { padding: 15px 20px; } .ui-dialog-pt15 { padding-top: 15px; } .ui-dialog-l40 { height: 40px; line-height: 40px; text-align: right; } .ui-dialog-input { width: 100%; height: 40px; margin: 0px; padding: 0px; border: 1px solid #d5d5d5; font-size: 16px; color: #c1c1c1; text-indent: 25px; outline: none; } .ui-dialog-input-username { /* 輸入使用者名稱的圖示 */ background: url(images/4.png) no-repeat 2px; } .ui-dialog-input-password { /* 輸入密碼的圖示 */ background: url(images/3.png) no-repeat 2px; } .ui-dialog-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; } .ui-dialowww.cppcns.comg-submit:hover { background: #3f81b0; OsHEN } .ui-mask { width: 100%; height: 100%; background: #000; position: absolute; top: 0px; height: 0px; z-index: 8000; opacity: 0.4; /*相容低版本的ie*/ filter: Alpha(opacity=40); } </style> </head> <body> <div class="link"> <a href=":showDialog();" >登入</a> </div> <!-- 設定一個背景遮罩層,防止滑鼠選中事件 --> <div class="ui-mask" id="mask" onselectstart="return false"></div> <div class="ui-dialog" id="dialogMove" onselectstart='return false;'> <div class="ui-dialog-title" id="dialogDrag" onselectstart="return false;"> 登入通行證 <a class="ui-dialog-closebutton" hhttp://www.cppcns.comref="script:hideDialog();" ></a> </div> <div class="ui-dialog-content"> <div class="ui-dialog-l40 ui-dialog-pt15"> <input class="ui-dialog-input ui-dialog-input-username" type="input" value="手機/郵箱/使用者名稱" /> </div> <div class="ui-dialog-l40 ui-dialog-pt15"> <input class="ui-dialog-input ui-dialog-input-password" type="input" value="密碼" /> </div> <div class="ui-dialog-l40"> <a href="#" >忘記密碼</a> </div> <div> <a class="ui-dialog-submit" href="#" >登入</a> </div> <div class="ui-dialog-l40"> <a href="#" >立即註冊</a> </div> </div> </div> <script type="text/javascript"> //宣告獲取元素物件方法 function $(id) { return document.getElementById(id); } //宣告自動居中元素方法(el = Element) function autoCenter(el) { //獲得可視區域的寬和高 var bodyW = document.documentElement.clientWidth; var bodyH = document.documentElement.clientHeight; //獲得傳入元素的實際寬和高 var elW = el.offsetWidth; var elH = el.offsetHeight; //設定元素的left為可視區域的寬度減去自身寬度的值除以2,top同理 el.style.left = (bodyW - elW) / 2 + 'px'; el.style.top = (bodyH - elH) / 2 + 'px'; } //自動擴充套件元素到全部顯示區域 function fillToBody(el) { //設定當前元素的寬度和高度為可視區域的寬和高 el.style.width = document.documentElement.clientWidth + 'px'; el.style.height = document.documentElement.clientHeight + 'px'; } //設定滑鼠在X和Y方向的初始值為0 var mouseOffsetX = 0; var mouseOffsetY = 0; //是否可拖拽的標記 var isDraging = false; //滑鼠事件1——計算滑鼠相對拖拽元素的左上角的座標,並且標記元素為可扡動 $('dialogDrag').addEventListener('mousedown',function (e) { //相容IE滑鼠事件機制 var e = e || window.event; //滑鼠的偏移等於當前事件滑鼠按下去的時候X 的座標減去登入浮層相對於頁面左邊的位置 mouseOffsetX = e.pageX - $('dialogMove').offsetLeft; //滑鼠的偏移等於當前事件滑鼠按下去的時候Y的座標減去登入浮層相對於頁面頂邊的位置 mouseOffsetY = e.pageY - $('dialogMove').offsetTop; //設定可拖動標記為true; isDraging = true; }) //滑鼠事件2——滑鼠移動時,檢測元素是否標記為可移動, //如果是,則更新元素的位置,到當前滑鼠的位置(要減去第一步中獲得的偏移) document.onmousemove = function (e) { //相容IE滑鼠事件機制 var e = e || window.event; //獲取滑鼠當前頁面(網頁左上角)的位置,e.pageX與e.pageY與滑鼠按下時值不同 var mouseX = e.pageX; var mouseY = e.pageY; //記錄滑鼠移動事件發生時的x座標和y座標 var moveX = 0; var moveY = 0; //如果當前可以拖動 if (isDraging === true) { //拖動元素的位置等於滑鼠相對於頁面位置減去滑鼠相對於拖動元素左上角的位置 moveX = mouseX - mouseOffsetX; moveY = mouseY - mouseOffsetY; //獲取頁面最大寬度和最大高度(注意clientWidth和offsetWidth的區別) var pageWidth = document.documentElement.clientWidth; var pageHeight = document.documentElement.clientHeight; //浮層物件的寬度和高度 var dialogWidth = $('dialogMove').offsetWidth; var dialogHeight = $('dialogMove').offsetHeight; //計算可拖動的最大值 var maxX = pageWidth - dialogWidth; var maxY = pageHeight - dialogHeight; //做判斷,防止拖拽出允許範圍 moveX = Math.min(maxX,Math.max(0,moveX)); moveY = Math.min(maxY,moveY)); //設定拖動元素的新值 $('dialogMove').style.left = moveX + 'px'; $('dialogMove').style.top = moveY + 'px'; } } //滑鼠事件3——滑鼠鬆開的時候,標記元素為不可扡動 document.onmouseup = function () { isDraging = false; } //展現登入框 function showDialog() { $('dialogMove').style.display = 'block'; $('mask').style.display = 'block'; //登入框居中顯示 autoCenter($('dialogMove')); //設定遮罩層充滿顯示區域 fillToBody($('mask')) } //隱藏登入框 function hideDialog() { $('dialogMove').style.display = 'none'; $('mask').style.display = 'none'; } //當改變視窗大小時的處理函式 window.onresize = function () { //登入框居中顯示 autoCenter($('dialogMove')); //如果登入框顯示就執行遮罩層顯示函式 if ($('dialogMove').style.display === 'block') { fillToBody($('mask')) } } </script> </body> </html>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。