002-DOM事件實例-實現一個能夠拖拽的登錄窗口

前言:這是跟着慕課網一個老師的視頻作的,這幾天在從新的梳理本身,寫完這個例子要系統的學一下jQuery,我司如今用的仍是比較多,畢竟用了它不用考慮IE兼容性,可讓開發更有效率。javascript

1.項目需求及基本的HTMLCSS

相信你們都用過QQ登錄框,它能夠在頁面中任意的拖拽,而後點擊狀態能夠切換各類狀態。
首先作出HTML的結構html

<div class="loginPanel" id="loginPanel">
        <!-- 關閉區域 -->
        <div style="position: relative; z-index: 1;">
            <div class="ui_boxyClose" id="ui_boxyClose"></div>
        </div>
        <!-- QQ圖標以及點擊區域 -->
        <div class="login_logo_webqq"></div>

        <!-- 輸入框區域 -->
        <div class="inputs">
            <div class="sign-input"><span>賬 號:</span><span><input autocomplete="on" name="u" id="u" type="text" style="ime-mode: disabled" class="input01" tabindex="1" value="QQ號碼或Email賬號" onFocus="if (value =='QQ號碼或Email賬號'){value =''}" onBlur="if (value ==''){value='QQ號碼或Email賬號';}" /></span></div>
            <div class="sign-input"><span>密 碼:</span><span><input name="p" id="p" maxlength="16" type="password" class="input01" tabindex="2" /></span></div>
        </div>
        <!-- 底部區域 -->
        <div class="bottomDiv">
            <!-- 登陸按鈕 -->
            <div class="btn" style="float: left"></div>
            <div>
                <div id="loginState" class="login-state-trigger login-state-trigger2 login-state" title="選擇在線狀態">
                    <!-- 狀態圖標 -->
                    <div id="loginStateShow" class="login-state-show online">狀態</div>
                    <!-- 下拉小角標 -->
                    <div class="login-state-down">下</div>
                    <!-- 默認的狀態 -->
                    <div class="login-state-txt" id="login2qq_state_txt">在線</div>
                    <!-- 隱藏的下拉菜單 -->
                    <ul id="loginStatePanel" class="statePanel login-state" style="display: none">
                        <li id="online" class="statePanel_li">
                            <div class="stateSelect_icon online"></div>
                            <div class="stateSelect_text">我在線上</div>
                        </li>
                        <li id="callme" class="statePanel_li">
                            <div class="stateSelect_icon callme"></div>
                            <div class="stateSelect_text">Q我吧</div>
                        </li>
                        <li id="away" class="statePanel_li">
                            <div class="stateSelect_icon away"></div>
                            <div class="stateSelect_text">離開</div>
                        </li>
                        <li id="busy" class="statePanel_li">
                            <div class="stateSelect_icon busy"></div>
                            <div class="stateSelect_text">忙碌</div>
                        </li>
                        <li id="silent" class="statePanel_li">
                            <div class="stateSelect_icon silent"></div>
                            <div class="stateSelect_text">請勿打擾</div>
                        </li>
                        <li id="hidden" class="statePanel_li">
                            <div class="stateSelect_icon hidden"></div>
                            <div class="stateSelect_text">隱身</div>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

2.實現拖拽登陸框

CSS部分省略不寫java

  • 因爲涉及到大量的操做class類名的操做,首先封裝一個能夠兼容IE取class類名的函數,由於IE10之前是不支持document.getElementByClassName()web

/**
     * 
     * @clsName 要找的className的名字
     * @parent 可選參數,傳入父元素就在父元素下找全部的className
     */
    function getByClass(clsName, parent) {
        //若是能夠用getElementsByClassName
        if(document.getElementsByClassName){
            return document.getElementsByClassName(clsName);
        }
        //加入傳入的parent存在就用document.getElementById(parent)取父元素,減小判斷,不然oParent就等於document
        var oParent = parent ? document.getElementById(parent) : document,
            eles = [],  //定義一個空的數組
            elements = oParent.getElementsByTagName('*');   //取全部的標籤
    
        for (var i = 0, l = elements.length; i < l; i++) {
            if (elements[i].className == clsName) {
                eles.push(elements[i]);
            }
        }
        return eles;
    }
  • 在頁面加載完成後執行一個函數數組

    window.onload = drag;
  • 函數drag函數

function drag(){
        //首選取出要點擊而後拖拽的區域
        var oTitle = getByClass('login_logo_webqq', 'loginPanel')[0];
        //而後給這個元素綁定一個鼠標按下時候的時間,鼠標按下時執行函數fnDown()
        oTitle.onmousedown = fnDown;
    }
  • 函數fnDown()ui

function fnDowm(event) {
        //兼容一下IE的事件
        event = event || window.event;
        //取到整個要拖拽的登錄框的id
        var oDrag = document.getElementById('loginPanel'),
            //光標按下時,光標和麪板之間的距離
            //event.clientX是光標按下時,光標距離窗口水平方向的距離
            //event.clientY是光標按下時,光標距離窗口垂直方向的距離
            //oDrag.offsetLeft面板距離窗口的水平距離
            disX = event.clientX - oDrag.offsetLeft,
            disY = event.clientY - oDrag.offsetTop;
        //由於光標是在整個窗口移動,因此爲窗口綁定一個鼠標移動的事件
        document.onmousemove = function(event){
            event = event || window.event;
            fnMove(event,disX,disY);
        }
    }
  • 函數fnMove()
    只須要實現光標按下時,光標移動到某點時,登陸框處的位置剛好等於光標此時減去光標到登錄框邊緣的距離spa

//
    function fnMove(e,posX,posY){
        var oDrag = document.getElementById('loginPanel');
        l = e.clientX - posX,
        t = e.clientY - posY,
        //這是判斷輸入框不越界
        winW = document.documentElement.clientWidth || document.body.clientWidth,
        winH = document.documentElement.clientHeight || document.body.clientHeight,
        maxW = winW - oDrag.offsetWidth - 10,
        maxH = winH - oDrag.offsetHeight;
        if (l < 0) {
            l = 0;
        } else if (l > maxW) {
            l = maxW;
        }
        if (t < 0) {
            t = 10;
        } else if (t > maxH) {
            t = maxH;
        }
        
        //及時更新登陸框的style.left和right信息
        oDrag.style.left = l + 'px';
        oDrag.style.top = t + 'px';
    }

3.實現點擊按鈕關閉輸入框

//獲取到關閉標籤元素code

var oClose = document.getElementById('ui_boxyClose');
    //爲這個元素綁定一個click事件
    oClose.onclick = function () {
        //當點擊這個按鈕時,把這個按鈕的display設置爲none
        document.getElementById('loginPanel').style.display = 'none';
    }
相關文章
相關標籤/搜索