一、客户区大小ClientWidth和ClientHeight

 <style>
#box {
width: 200px;
height: 200px;
background-color: aquamarine;
margin: 20px;
border: 20px solid red;
padding:20px;
}
</style> </head>
<body>
<div id="box"> </div> <script>
var box = document.getElementById("box"); //容器的大小: width + padding;
console.log(box.clientWidth);
console.log(box.clientHeight);
</script>

二、ScrollWidth/scrollHeight  scrollTop/scrollLeft(这两个是相对于定位了的父盒子而言的)

三、拖拽盒子分析:

思路分析:准备工作:先获得大盒子的(上图黑色边框内)====id(box)

再获得注册信息头部(上图红色边框内)====id(drop)

//step:1鼠标按下这个注册信息头部(drop)后同时需要移动盒子

drop.onmousedown=function(e){  //e为系统自带的属性

e=e||window.event;   //e的兼容性(短路运算)

鼠标与盒子之间的距离(a)=鼠标在页面之中的位置(b)-盒子距离页面边界的距离(c)

var offsetX=e.pageX-box.offsetLeft;
var offsetY= e.pageY-box.offsetTop;

//同时移动

document.onmousemove=function(e){

//盒子在移动后的位置(e)=移动后的鼠标在页面之中的位置(d)-鼠标与盒子之间的距离(a)

var x= e.pageX-offsetX;
var y= e.pageY-offsetY;

//接下来我们要判断盒子的位置不能够超出整个页面

If(x<0){    //判断上边缘与左边缘

x=0;

}

If(y<0){

y=0;}

}

if(y>window.innerHeight-box.offsetHeight){   //判断下边缘与右边缘

//innerHeight是页面可视区域的高度,window.innerHeight-box.offsetHeight得到的是盒子在页面之中可以移动的最大高度
   
y=window.innerHeight-box.offsetHeight;
}
if(x>window.innerWidth-box.offsetWidth){
    x=window.innerWidth-box.offsetWidth;
}

box.style.left=x+”px”;

box.style.top=y+”px”;

}

//鼠标抬起时盒子不再改变位置

drop.onmouse=function(){

document.onmousemove=null;

}

详见下面拖拽案例:

 <style>
* {
margin: 0;
padding: 0;
} .nav {
height: 30px;
background: #036663;
border-bottom: 1px solid #369;
line-height: 30px;
padding-left: 30px;
} .nav a {
color: #fff;
text-align: center;
font-size: 14px;
text-decoration: none; } .d-box {
width: 400px;
height: 300px;
border: 5px solid #eee;
box-shadow: 2px 2px 2px 2px #666;
position: absolute;
top: 40%;
left: 40%;
background-color: white; /* 不让文字被选中 */
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
} .hd {
width: 100%;
height: 25px;
background-color: #7c9299;
border-bottom: 1px solid #369;
line-height: 25px;
color: white;
cursor: move;
} #box_close {
float: right;
cursor: pointer;
}
</style>
</head>
<body>
<div class="nav">
<a href="javascript:;" id="register">注册信息</a>
</div>
<div class="d-box" id="d_box">
<div class="hd" id="drop">注册信息 (可以拖拽)
<span id="box_close">【关闭】</span>
</div>
<div class="bd"></div>
</div> <script src="common.js"></script>
<script> var box = document.getElementById("d_box");
var drop = document.getElementById("drop"); //鼠标再按下之后,同时移动
drop.onmousedown=function(e){
//e的兼容性(短路运算)
e=e||window.event;
//鼠标在盒子之中的距离=鼠标在页面之中的位置-盒子距离页面边界的距离
var offsetX=e.pageX-box.offsetLeft;
var offsetY= e.pageY-box.offsetTop;
document.onmousemove=function(e){
//盒子在移动后的位置=移动后的鼠标的在页面中的位置-鼠标在盒子之中的距离
var x= e.pageX-offsetX;
var y= e.pageY-offsetY;
if(x<0){
x=0;
}
if(y<0){
y=0;
}
// window.innerHeight浏览器可是区域的高度
if(y>window.innerHeight-box.offsetHeight){
y=window.innerHeight-box.offsetHeight;
}
if(x>window.innerWidth-box.offsetWidth){
x=window.innerWidth-box.offsetWidth;
}
box.style.left=x+"px";
box.style.top=y+"px";
} }
//当鼠标抬起的时候,盒子不再改变位置
drop.onmouseup=function(){
document.onmousemove=null;
}
</script>

四、淘宝放大镜案例:

思路分析:

<div class="box" id="box">
<div class="small">
<img src="data:images/small.webp" width="350" alt=""/> <div class="mask"></div>
</div>
<div class="big">
<img src="data:images/big.jpg" width="800" alt=""/>
</div>
</div>

//准备工作:

根据需要获得所有需要的元素标签:

var box=document.getElementById("box");
var small=box.children[0];
var smallImg=small.children[0];
var mask=small.children[1];
var big=box.children[1];
var bigImg=big.children[0];

//step1:鼠标移动到小盒子之中时,显示小盒子中的蒙板,同时显示大图片

//移出小盒子时,蒙板隐藏,大图片隐藏

Small.onmouseover=function(){

Mask.style.display=”block”;

Big.style.display=”block”;

}

Small.onmouseout=function(){

Mask.style.display=”none”;

Big.style.display=”none”;

}

//step:鼠标放入盒子之中是让mask蒙板跟着移动

Small.onmousemove=function(e){

//var x=e.pageX-box.offsetLeft;

//var y=e.pageX-box.offsetTop;

//发现鼠标与mask的左上角位置保持一致

//所以我们需要再减去蒙板宽高的一半,这样鼠标就能在蒙板的中间位置显示

var x=e.pageX-box.offsetLeft-mask.offsetWidth/2;

var y=e.pageX-box.offsetTop-mask.offsetHeight/2;

if(x<=0){
    x=0;
}
 if(y<=0){
     y=0;
 }
 //box设置了相对定位,所以是相对于box的宽度和高度而言的
if(x>box.offsetWidth-mask.offsetWidth){
    x=box.offsetWidth-mask.offsetWidth;
}
 if(y>box.offsetHeight-mask.offsetHeight)
 {
    
y=box.offsetHeight-mask.offsetHeight;
 }
 mask.style.left=x+"px";
 mask.style.top=y+"px";

step3:蒙板移动右边的大图片也跟着移动

这里需要用到一个等式(原理是等比例移动)因为左右两个图片的大小是不一样的

MaskX(蒙板左侧距小图片左侧的距离)/maxMaskImg(蒙板在小图片之中左右移动的最大距离)

=bigImgX(大图片的左侧相对于它所在的盒子左侧移动的距离)(未知数)/maxBigImgX(大图片在它所在的盒子之中所能移动的最大宽度)

var bigImgX=x*(bigImg.offsetWidth-big.offsetWidth)/(box.offsetWidth-mask.offsetWidth);
 var
bigImgY=y*(bigImg.offsetHeight-big.offsetHeight)/(box.offsetHeight-mask.offsetHeight);

bigImg.style.marginLeft=-bigImgX+"px";
bigImg.style.marginTop=-bigImgY+"px";

}

五、滚动条案例分析:

//准备工作:

先获得所有需要的元素标签

var box=document.getElementById("box");
var content=document.getElementById("content");
var scroll=document.getElementById("scroll");
var bar=document.getElementById("bar");

//1.计算滚动条的大小
//    boxH/contentH=barH/scrollH
    var barH=box.offsetHeight*scroll.offsetHeight/content.offsetHeight;
    bar.style.height=barH+"px";
    //判断如果盒子的高度超过盒子之中文字的高度,则滚动条的高度为0px
    if(box.offsetHeight>content.offsetHeight){
        bar.style.height="0px";
    }
    //2.拖拽滚动
    scroll.onmousedown=function(e){
        var offsetY= e.pageY-box.offsetTop-bar.offsetTop;
        document.onmousemove=function(e){
            var y= e.pageY-offsetY-box.offsetTop;
           if(y<0){
               y=0
           }
            if(y>scroll.offsetHeight-bar.offsetHeight){
                y=scroll.offsetHeight-bar.offsetHeight;
            }
            bar.style.top=y+"px";
            //3.文字跟随滚动
//            barY/maxBarY=contentY/maxContent(等比例计算)
            //barY(滚动条距离外面定位了的父盒子box的距离)
            //maxContent (文字可移动的最大距离)=contentH(文字内容的高度)-boxH(盒子的高度)
            //maxBarY(滚动条可移动的最大距离)=scrollH(滚动栏轨道的高度)-barH(滚动条的高度)
            //contentY(文字距离外面定位了的父盒子box的距离)(未知数)
            var contentY=y*(content.offsetHeight-box.offsetHeight)/(scroll.offsetHeight-bar.offsetHeight);
            content.style.top=-contentY+"px"; //取反滚动条向下拖动,内容是向上移动的
        }
    }
    document.onmouseup=function(){
        document.onmousemove=null;
    }

												

js-特效部分学习-拖拽效果的更多相关文章

  1. js div浮动层拖拽效果代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 原生js实现模块来回拖拽效果

    代码比较冗余,还没来得及做整理,往见谅. 主要用到的 JS 事件有: onmousedown:鼠标点下事件 onmousemove:鼠标移动事件 onmouseup:鼠标放开事件 具体代码如下: &l ...

  3. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  4. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

  6. js实现本地图片文件拖拽效果

    如何拖拽图片到指定位置,具体方法如下 在从本地上传图片的时候,如果使用拖拽效果,想想应该是更加的高大上,下面直接上js代码 完整代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  7. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  8. 原生js简单实现拖拽效果

    实现弹窗拖拽效果的原理是:按下鼠标并移动——拖拽移动物体,抬起鼠标——停止移动.主要触发三个事件:onmousedown.onmousemove以及onmouseup: 首先搭建结构:一个宽350px ...

  9. 用JS实现版面拖拽效果

    类似于这样的一个版面,点击标题栏,实现拖拽效果. 添加onmousedown事件 通过获取鼠标的坐标(clientX,clientY)来改变面板的位置 注意:面板使用绝对定位方式,是以左上角为参考点, ...

随机推荐

  1. MYSQL C API : mysql_real_escape_string 二进制数据存储

    #include <iostream> #include <string> #include <string.h> #include <mysql.h> ...

  2. FPGA基本原理之一

    FPGA就好像一个平台,用简单的器件和复杂的逻辑构建起来的.这个平台大概由六部分组成,分别为基本可编程逻辑模块(CLB).可编程输入/输出模块(IOB).嵌入式块RAM.丰富的布线资源.底层嵌入功能单 ...

  3. uboot和内核波特率不同

    uboot和内核波特率不同,在uboot启动后,修改uboot参数: set bootargs 'noinitrd root=/dev/mtdblock3 init=/linuxrc console= ...

  4. LINUX下WIFI默认连接

    #! /bin/sh ifconfig wlan0 upiwconfig wlan0 key 123456iwconfig wlan0 essid "rat-linux"iwcon ...

  5. Node.js初探之hello world

    昨天公司内部培训,主讲人王老板对Node.js评价很高,连用几个“变态”来形容,恰好今天周末,有时间来认识下Node.js,对一门新语言最好的认识,是让其输出“hello world”,今天我就利用N ...

  6. Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

    本期内容 : 数据接收架构设计模式 数据接收源码彻底研究 一.Spark Streaming数据接收设计模式   Spark Streaming接收数据也相似MVC架构: 1. Mode相当于Rece ...

  7. 前端开发框架Bootstrap和KnockoutJS

    江湖中那场异常惨烈的厮杀,如今都快被人遗忘了.当年,所有的武林同道为了同一个敌人都拼尽了全力,为数不多的幸存者心灰意冷,隐姓埋名,远赴他乡,他们将唯一的希望寄托给时间.少年子弟江湖老,红颜少女的鬓边也 ...

  8. Microsoft source-code annotation language (SAL) 相关

    More info see: https://msdn.microsoft.com/en-us/library/hh916383.aspx Simply stated, SAL is an inexp ...

  9. Servlet Cookie处理

    Servlet Cookie 处理 Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息.Java Servlet 显然支持 HTTP Cookie. 识别返回用户包括三个步骤: 服务 ...

  10. TCheckListBox

    TCheckListBox.CheckListBox http://www.cnblogs.com/mingdep/archive/2012/03/20/2408282.html 全部打勾 for ( ...