拖拽效果也叫模态框,都是表述得同一个效果。
问题描述:
点击链接会弹出一个框框(我这里是登录框),鼠标点击不松手可以实现拖拽框框移动。点击框上得关闭按钮,可以关闭框。
先来看看效果
这个案例的主要分三部分来完成
1. 点击文字,登陆框的显示和隐藏
2. 鼠标按下,拖拽登陆框移动
3. 鼠标松开,登陆框位置不变了
具体得步骤代码里会有详细得解释得。
这里值得注意得点:鼠标按下拖拽的地方是有限制的,不可能任何一个地方都能拖拽着移动,这里我设置的是登陆的头部
JS:
// 拖拽模态框
// 三个部分
// 1.点击文字链接 弹出登陆框
// 2.在登陆框的头部区域按下鼠标 可以拖动登陆框移动 分为两个事件:鼠标按下 鼠标移动
// 3.松开鼠标 登陆框不移动 停在哪个位置不动
// 1.点击文字 显示登陆框 点击关闭 隐藏登陆框
var link = document.querySelector('#link'); // 链接
var login = document.querySelector('#login'); // 登陆框
var mask = document.querySelector('.login-bg'); // 遮挡层
var close = document.querySelector('#closeBtn'); // 关闭按钮
var title = document.querySelector('.login-title'); // 登陆框头部
link.addEventListener('click', function () {
login.style.display = 'block';
mask.style.display = 'block';
// console.log('打开');
});
close.addEventListener('click', function () {
login.style.display = 'none';
mask.style.display = 'none';
// console.log('关闭');
})
// 2.鼠标点击事件 登陆框移动 登陆框的距离=鼠标在页面的坐标-鼠标在盒子的坐标
// (1)鼠标按下就要获得鼠标的位置
title.addEventListener('mousedown', function (e) {
// 登陆框移动的距离 就是鼠标点击的位置距离页面的距离 - 登陆框距离页面的距离
// 鼠标再盒子内的坐标
var x = e.pageX - login.offsetLeft;
var y = e.pageY - login.offsetTop;
// (2)鼠标移动 鼠标的位置更新 登陆框位置更新 所以更新登陆框的坐标
// 鼠标按下触发事件
document.addEventListener('mousemove', move);
function move(e) {
// 登陆框位置:只要鼠标在动 就会更新位置
login.style.top = e.pageY - y + 'px';
login.style.left = e.pageX - x + 'px';
}
// 3.鼠标松开 登录框停止移动 就是停止进行位置的赋值操作
document.addEventListener('mouseup', function () {
document.removeEventListener('mousemove', move);
})
})
结构:
样式:
.login-header {
width: 100%;
text-align: center;
height: 30px;
font-size: 24px;
line-height: 30px;
}
ul,
li,
ol,
dl,
dt,
dd,
div,
p,
span,
h1,
h2,
h3,
h4,
h5,
h6,
a {
padding: 0px;
margin: 0px;
}
.login {
display: none;
width: 512px;
height: 280px;
position: fixed;
border: #ebebeb solid 1px;
left: 50%;
top: 50%;
background: #ffffff;
box-shadow: 0px 0px 20px #ddd;
z-index: 9999;
transform: translate(-50%, -50%);
}
.login-title {
width: 100%;
margin: 10px 0px 0px 0px;
text-align: center;
line-height: 40px;
height: 40px;
font-size: 18px;
position: relative;
cursor: move;
}
.login-input-content {
margin-top: 20px;
}
.login-button {
width: 50%;
margin: 30px auto 0px auto;
line-height: 40px;
font-size: 14px;
border: #ebebeb 1px solid;
text-align: center;
}
.login-bg {
display: none;
width: 100%;
height: 100%;
position: fixed;
top: 0px;
left: 0px;
background: rgba(0, 0, 0, .3);
}
a {
text-decoration: none;
color: #000000;
}
.login-button a {
display: block;
}
.login-input input.list-input {
float: left;
line-height: 35px;
height: 35px;
width: 350px;
border: #ebebeb 1px solid;
text-indent: 5px;
}
.login-input {
overflow: hidden;
margin: 0px 0px 20px 0px;
}
.login-input label {
float: left;
width: 90px;
padding-right: 10px;
text-align: right;
line-height: 35px;
height: 35px;
font-size: 14px;
}
.login-title span {
position: absolute;
font-size: 12px;
right: -20px;
top: -30px;
background: #ffffff;
border: #ebebeb solid 1px;
width: 40px;
height: 40px;
border-radius: 20px;
}
ok,这个案例结束了。思路依然很重要,代码敲三遍吧。。。。