前言:這是跟着慕課網一個老師的視頻作的,這幾天在從新的梳理本身,寫完這個例子要系統的學一下jQuery,我司如今用的仍是比較多,畢竟用了它不用考慮IE兼容性,可讓開發更有效率。javascript
HTML
和CSS
相信你們都用過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>
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'; }
//獲取到關閉標籤元素code
var oClose = document.getElementById('ui_boxyClose'); //爲這個元素綁定一個click事件 oClose.onclick = function () { //當點擊這個按鈕時,把這個按鈕的display設置爲none document.getElementById('loginPanel').style.display = 'none'; }