js-特效部分学习-拖拽效果

一、客户区大小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="images/small.webp" width="350" alt=""/>

        <div class="mask"></div>
    </div>
    <div class="big">
        <img src="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;
    }

				
时间: 2024-09-30 18:54:52

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

js实现鼠标的拖拽效果

拖拽效果在我们上网的过程中是很常见的,大家都应该在电脑上面登陆过qq吧,当这个qq的登陆框弹出来的时候,我们是可以进行拖动的.这就是一个拖拽效果 这是我在慕课网上面看到的,我直接拿过来了,地址http://www.imooc.com/learn/60 这个视频讲的蛮好的,一清二楚,不懂的可以去看看. 首先,理清楚一下总体的思路. 第一步:当鼠标按下弹出框某个区域的时候,可以进行拖拽 第二步:弹出框拖拽进行中 第三部:鼠标松开,弹出框拖动到了某个位置. 先上源代码.这个是慕课网的老师提供的 . <

JS 鼠标事件练习—拖拽效果

拖拽效果 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>拖拽效果</title> <link rel="stylesheet" type="text/css" href="拖拽效果.css"> </head> <body> <div

Javascript学习------拖拽效果

<!DOCTYPE html> <html> <head> <title>js拖拽</title> <style> * { margin: 0px; padding: 0px; } .drafting { width: 450px; height: 350px; overflow: hidden; position: absolute; z-index: 1; margin: 0px; box-shadow: 0px 0px 5px

js拖拽效果的原理及实现

js中元素的拖拽效果需要用到的主要的知识点为:事件侦听和鼠标事件.即被拖拽的元素添加事件侦听,侦听的事件主要为mousedown,mousemove和mouseup,一些情况下还需要用到mouseleave.本篇所针对的原理是存在多个相同元素情况下的拖拽.下面结合案例进行分析.1.首先在body中创建7个div元素,并设置css样式. <style> div{ width:50px; height: 50px; background-color: red; position: absolute

Createjs学习心得之使用EaselJs实现拖拽效果

寒假时跟着老师在做一个createjs+angularjs的html5应用app,因为在这之前完全没了解过createjs这个框架,所以在查找资料时发现,国外官网(http://www.createjs.com)API文档虽是详细,但对于一些英语不太好的童鞋(其实我也是一枚英语渣渣)就比较难理解了.而国内中文社区做的并不好,用户不多,资料翻译准确度不够.所以在这里,我就把我学习Createjs的一些心得体会向大家分享下: 一.什么是CreateJS? createjs是一个轻量级的javascr

简单的鼠标拖拽效果(原生js实现)

之前在聊天群里看到有人说面试的时候被问到了怎样实现一个拖拽效果,当时看到后在心里默默思考了下,结果发现好像我也写不出来啊.本着遇到一个解决一个的思想,就亲自敲了一个,看到张鑫旭大神写的代码,真的很厉害,多多学习了,(感觉随便搜一个关于前端方面的问题都能看到他的网站,真是太佩服了,写了那么多文章,十分感谢.)好了,接下来就进入正题了.想实现一个效果首先得明白其中的逻辑,知道了实现逻辑后,就可以码代码了.首先我实现的效果是: 鼠标按下后,才可以执行后续效果 鼠标已经按下,然后鼠标移动,需要拖拽的元素

js拖拽效果实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>    <meta

WEB前端开发学习----11. JQuery 实现简单的拖拽效果

拖拽效果在网页中很常见.实现起来也不难.记录一下今天实现的简单效果. 拖拽演示 快速拖动时,会出现问题,以后修改. 说白了,就是3个点击事件. 1. 按下鼠标左键, 触发点击事件,此时记录下可以得到鼠标相对于拖动控件的位置(当前鼠标位置-控件位置): 2. 拖动鼠标,触发移动事件,可以计算出鼠标移动的距离(当前鼠标位置-之前算出的相对位置),也就是拖拽控件所移动的距离: 3. 鼠标抬起,结束拖动. 在JQ中,event.pageX    event.pageY可以获取鼠标的位置,相对于文档左上角

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

学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcElement(触发事件的事件源对象)和attachEvent("onclick",function(){...}); 2. a. 实现拖放(Drag and Drop): 目前支支持IE, 若定制某对象为可拖放对象, 则必须覆盖目标对象的dragenter和dragover事件, 可以用e