可拖拽的登陸彈窗

練習(xí)制作的一個可拖拽的登陸彈窗

  • 點擊頁面頭部登陸按鈕,彈出登陸彈窗和遮罩,并禁用滾動條镰烧;
  • 點擊彈窗里的關(guān)閉按鈕狂魔,關(guān)閉登陸彈窗和遮罩,并還原滾動條课舍;
  • 彈窗可以在視口區(qū)域任意位置拖動,但是不可移出瀏覽器邊緣;
  • 不管關(guān)閉前彈窗移動到任何位置污秆,每次點擊登錄打開彈窗都在視口上下左右居中顯示;
  • 當(dāng)彈窗居于瀏覽器視口右邊緣或者下邊緣時昧甘,調(diào)整瀏覽器大小時彈窗也不會超出瀏覽器邊緣良拼,會始終貼著右邊緣或者下邊緣;
    <i> 效果圖如下:</i>
初始效果-帶滾動條
點擊登錄-彈窗&遮罩
可拖動-不會拖到瀏覽器視口外
html部分


<header class="header">
<div class="logo"><img src="imgs/logo.png" alt="logo.png"></div>
<button class="login">登陸</button>
</header>


<div id="mask"></div>

<div id="login-pop">
<form class="form">
<h2>登陸彈窗<span class="close">X</span></h2>
<div class="field">
<label for="userName">用戶名:</label>
<input type="text" name="userName" id="userName" placeholder="請輸入用戶名">
</div>
<div class="field">
<label for="password">密碼:</label>
<input type="password" name="password" id="password" placeholder="請輸入密碼">
</div>
<button id="loginbtn">登錄</button>
</form>
</div>

<p>1</p><p>1</p><p>1</p><p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p> <p>1</p>
<p>1</p> <p>1</p> <p>1</p> <p>1</p>

css部分

/*頭部*/
* {margin:0; padding:0; }
body {font-size:14px; color:#333; position: relative; }
.header {width: 980px; height:50px; margin: 0 auto; background-color: #efefef; border-radius: 0 0 5px 5px; }
.header .logo {float:left; }
.header .logo img {height: 50px; }
.login{float: right; margin: 15px; cursor: pointer; }
/*遮罩*/
#mask{z-index: 9; background-color: #000; opacity:0.3; width: 100%; height: 100%; position: fixed; top: 0; left: 0; display: none; }
/*登陸彈窗*/
#login-pop{z-index: 10; width: 300px; height: 230px; background-color: #fff; position: absolute; text-align: center; display: none; }
#login-pop h2 {height:50px; line-height:50px; text-align:center; font-size:16px; letter-spacing:5px; color:#666; border-bottom:1px solid #ccc; margin:0 0 30px 0; position: relative; cursor: move; }
#login-pop .close{position: absolute; right: 10px; cursor: pointer; }
#login-pop .field{margin-bottom: 20px; }
#login-pop .field label{width: 60px; text-align: right; display: inline-block; }
#login-pop #loginbtn{width: 100px; height: 40px; line-height: 40px; background-color: green; border: none; color: #fff; font-size: 16px; border-radius: 5px; cursor: pointer; }
</code>

  • 彈窗的絕對定位的位置坐標是通過js實現(xiàn)的疾层;
js部分
var 
//獲取登陸彈窗div——loginPop
//獲取彈窗的頭部h2——move
loginPop = document.getElementById("login-pop"),
move = document.getElementsByTagName("h2")[0];
//給move添加鼠標按下事件
move.addEventListener("mousedown",function (e) {
    //獲取事件觸發(fā)時按下點距瀏覽器當(dāng)前窗口的水平坐標(e.clientX)和垂直坐標(e.clientX)
    //以及此時登陸彈窗左邊緣和上邊緣距瀏覽器左邊緣和上邊緣的距離offsetLeft和offsetTop
    //計算得到鼠標按下點距登陸彈窗左邊緣和上邊緣的距離diffX将饺、diffY
    var diffX = e.clientX - loginPop.offsetLeft,
        diffY = e.clientY - loginPop.offsetTop;
    //利用IE獨有的方法setCapture,鼠標按下時捕獲鼠標移出瀏覽器的事件
    //配合下面releaseCapture,鼠標彈起時釋放
    //解決IE在限制彈窗移出瀏覽器失效的bug
    if (typeof loginPop.setCapture != 'undefined') {
        loginPop.setCapture();
    }
    //鼠標在彈窗頭部按下時予弧,給document添加鼠標移動事件
    //從而讓彈窗可以在document范圍內(nèi)移動
    document.addEventListener("mousemove",mousemove); 
    function mousemove(e) {
        //實時獲取鼠標移動事件觸發(fā)時按住點距瀏覽器當(dāng)前窗口的水平坐標(e.clientX)和垂直坐標(e.clientX)
        //根據(jù)上面計算得到的diffX刮吧、diffY
        //計算移動后登陸彈窗位置參數(shù)left、top
        var left = e.clientX - diffX;
        var top = e.clientY - diffY;
        //當(dāng)?shù)顷憦棿耙瞥鰹g覽器左邊緣時left<0掖蛤,
        //當(dāng)彈窗移出瀏覽器右邊緣時left > getInner().width - loginPop.offsetWidth
        //限制彈窗移出瀏覽器左右邊緣
        // 上下邊緣同理
        if (left < 0) {
            left = 0;
        } else if (left > getInner().width - loginPop.offsetWidth) {
            left = getInner().width - loginPop.offsetWidth;
        }               
        if (top < 0) {
            top = 0;
        } else if (top > getInner().height - loginPop.offsetHeight) {
            top = getInner().height - loginPop.offsetHeight;
        }
        loginPop.style.left = left + 'px';
        loginPop.style.top = top + 'px';
    }
    // 給document添加鼠標彈起事件
    // 鼠標彈起時移出鼠標的移動事件和彈起事件自身
    // 鼠標彈起時彈窗停止在當(dāng)前位置
    document.addEventListener("mouseup",mouseup);
    function mouseup() {
        document.removeEventListener("mousemove",mousemove);
        document.removeEventListener("mouseup",mouseup);
        //配合上面的setCapture
        if (typeof loginPop.releaseCapture != 'undefined') {
            loginPop.releaseCapture();
        }
    }
});
// 瀏覽器的window添加窗口大小的監(jiān)聽事件
// 當(dāng)瀏覽器大小變化時杀捻,判斷彈窗當(dāng)前位置是否超出瀏覽器的右邊緣或者下邊緣
// 當(dāng)超出時強制賦值使其定位在瀏覽器邊緣
window.addEventListener("resize",fn);
function fn() {
    if (loginPop.offsetLeft > getInner().width - loginPop.offsetWidth) {
        loginPop.style.left = getInner().width - loginPop.offsetWidth + 'px';
    }
    if (loginPop.offsetTop > getInner().height - loginPop.offsetHeight) {
        loginPop.style.top = getInner().height - loginPop.offsetHeight + 'px';
    }
};  
// 遮罩
// 獲取頭部的登陸按鈕login,彈窗的關(guān)閉按鈕close蚓庭、遮罩div mask
var login = document.getElementsByClassName("login")[0],
    close = document.getElementsByClassName("close")[0],
    mask = document.getElementById("mask");
// 頭部的登陸按鈕添加點擊事件
login.addEventListener("click",function(){ 
    // 設(shè)置彈窗居中
    center(300,230);
    // 顯示遮罩
    mask.style.display = "block";
    // 顯示彈窗 
    loginPop.style.display = "block";
    // 禁用滾動條
    document.documentElement.style.overflow = 'hidden';
});
// 彈窗的關(guān)閉按鈕點擊事件
close.addEventListener("click",function(){ 
    // 隱藏遮罩和登陸彈窗
    mask.style.display = "none"; 
    loginPop.style.display = "none"; 
    // 還原滾動條默認狀態(tài)
    document.documentElement.style.overflow = 'auto';
}); 
// 登陸彈窗居中致讥,兩個參數(shù)分別是彈窗的寬高
function center(width, height) {
    //通過瀏覽器的視口大小減去彈窗大小后除以2確定彈窗的絕對定位位置參數(shù)top、left
    var top = (getInner().height - height) / 2,
        left = (getInner().width - width) / 2;
    loginPop.style.top = top + 'px';
    loginPop.style.left = left + 'px';
}
//跨瀏覽器獲取視口大小
function getInner() {
    //非IE瀏覽器器赞,支持innerWidth垢袱、innerHeight
    if (typeof window.innerWidth != 'undefined') { 
        return {
            width : window.innerWidth,
            height : window.innerHeight
        }
    } else {
        //IE瀏覽器,不支持innerWidth港柜、innerHeight
        //支持documentElement.clientWidth请契、documentElement.clientHeight
        return {
            width : document.documentElement.clientWidth,
            height : document.documentElement.clientHeight
        }
    }
}
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夏醉,隨后出現(xiàn)的幾起案子爽锥,更是在濱河造成了極大的恐慌,老刑警劉巖畔柔,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氯夷,死亡現(xiàn)場離奇詭異,居然都是意外死亡靶擦,警方通過查閱死者的電腦和手機腮考,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玄捕,“玉大人秸仙,你說我怎么就攤上這事∽ぃ” “怎么了寂纪?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赌结。 經(jīng)常有香客問我捞蛋,道長,這世上最難降的妖魔是什么柬姚? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任拟杉,我火速辦了婚禮,結(jié)果婚禮上量承,老公的妹妹穿的比我還像新娘搬设。我一直安慰自己穴店,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布拿穴。 她就那樣靜靜地躺著泣洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪默色。 梳的紋絲不亂的頭發(fā)上球凰,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音腿宰,去河邊找鬼呕诉。 笑死,一個胖子當(dāng)著我的面吹牛吃度,可吹牛的內(nèi)容都是我干的甩挫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼椿每,長吁一口氣:“原來是場噩夢啊……” “哼捶闸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拖刃,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贪绘,沒想到半個月后兑牡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡税灌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年均函,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菱涤。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡苞也,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粘秆,到底是詐尸還是另有隱情如迟,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布攻走,位于F島的核電站殷勘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昔搂。R本人自食惡果不足惜玲销,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摘符。 院中可真熱鬧贤斜,春花似錦策吠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至草讶,卻和暖如春洽糟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堕战。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工坤溃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘱丢。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓薪介,卻偏偏與公主長得像,于是被迫代替她去往敵國和親越驻。 傳聞我的和親對象是個殘疾皇子汁政,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容