002-DOM事件实例-实现一个可以拖拽的登陆窗口
前言:这是跟着慕课网一个老师的视频做的,这几天在重新的梳理自己,写完这个例子要系统的学一下jQuery,我司现在用的还是比较多,毕竟用了它不用考虑IE兼容性,可以让开发更有效率。
1.项目需求及基本的HTML和CSS
相信大家都用过QQ登陆框,它可以在页面中任意的拖拽,然后点击状态可以切换各种状态。
首先做出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部分省略不写
由于涉及到大量的操作class类名的操作,首先封装一个可以兼容IE取class类名的函数,因为IE10以前是不支持
document.getElementByClassName()
/**
*
* @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()
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()
只需要实现光标按下时,光标移动到某点时,登录框处的位置恰好等于光标此时减去光标到登陆框边缘的距离
//
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.实现点击按钮关闭输入框
//获取到关闭标签元素
var oClose = document.getElementById('ui_boxyClose');
//为这个元素绑定一个click事件
oClose.onclick = function () {
//当点击这个按钮时,把这个按钮的display设置为none
document.getElementById('loginPanel').style.display = 'none';
}002-DOM事件实例-实现一个可以拖拽的登陆窗口的更多相关文章
- jQuery的DOM操作实例(2)——拖拽效果&&拓展插件
一.原生JavaScript编写拖拽效果 二.jQuery编写的拖拽效果 三.在jQuery中拓展一个拖拽插件
- dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...
- DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库. 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制. 试试看! 将文件拖至此处或点击上传.(这仅仅是 dropzo ...
- Javascript写的一个可拖拽排序的列表
自己常试写了一个可拖拽进行自定义排序的列表,可能写的不太好,欢迎提供意见. 我的思路是将列表中的所有项都放进一个包裹层,将该包裹层设为相对定位,每当点击一个项时,将该项脱离文档并克隆一份重新添加到文档 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- 前端笔记之jQuery(下)事件&节点操作&净位置&拖拽&页面卷动值&遍历JSON
一.监听事件大全 1.1 JavaScript事件 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onfoc ...
- AJ学IOS(36)UI之手势事件旋转_缩放_拖拽
AJ分享,必须精品 效果 完成一个图片的捏合缩放,拖拽,旋转动作. 设计思路 拖拽: 首先是最简单的拖拽 //拖拽 -(void)panTest { UIPanGestureRecognizer *p ...
- [Java]接受拖拽文件的窗口
至于这个问题,Java的awt.dnd包下提供了许多完成这一功能的类 例如DropTarget.DropTargetListener等 先来讲一下DropTarget类,这个类完成和拖拽.复制文件等操 ...
- cocos2d-x 3.0 学习笔记: 一个可以拖拽的Label及schedule的应用
#ifndef _DRAGLABEL_H_ #define _DRAGLABEL_H_ #include "cocos2d.h" USING_NS_CC; class DragLa ...
随机推荐
- 华为鸿蒙系统pk安卓系统
Harmony OS Vs Android Comparison It isn’t based on Linux kernel The key difference between HarmonyOS ...
- c# winForm 将窗体状态栏StatusStrip 分成左中右三部分 右边显示当前时间
实现效果:通过StatusStrip显示窗体状态栏同时将状态栏分成三部分居左边显示相关文字信息中间空白显示居右边显示时间信息 1.创建窗体及添加StatusStrip 默认StatusStrip名称 ...
- L3-016 二叉搜索树的结构 (30 分)
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- ubantu中的mysql命令
查看mysql的安装目录:which mysql 进入mysql的运行状态:mysql -uroot -p 56..a_
- Linux磁盘空间满的诡异问题解决方案
问题描述: 今天登上一台服务器,df -h 发面根目录磁盘已经满了 解决过程: cd / du -sh * 发现并没有大文件,占用的空间没多大 根据经验,先通过lsof | grep deleted ...
- left join on注意点
右侧表的条件参数需要放在on后面 where 后面进放置左表的条件参数 比如消息表和用户消息表 消息表里存在类型为<系统消息>的消息是发送给全部用户 我们发送给系统消息时,不直接插入用户消 ...
- 关于dubbo接口性能测试
最初的压测这个dubbo接口有三种思路: .第一种就是基于业务,比如注册业务,注册成功后,会发送短信消息到用户手机,通过业务调用消息服务,最容易实现,但是业务瓶颈最大导致测试结果不准 .第二种是通 ...
- 感觉自己out了
看了公司混乱而落后的框架,想自己开发一个. 无意中到开源网站看到,开源的控件已经非常多了,基本上说应有尽有. 感叹这个知识大爆炸的年代. 自己现在是坐在井底的蛤蟆?
- android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码
Android精选源码 精练的范围选择器,范围和单位可以自定义 自定义View做的小鸟游戏 android popwindow选择商品规格颜色尺寸效果源码 实现Android带有锯齿背景的优惠样式源码 ...
- OpenCV Mat - 基本图像容器
Mat 在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建.为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材 ...