html中的id与onmouse系列事件知识点

简介:最近做项目一直用vue框架,碰上了一些需要直接操作dom的情况,但是vue是数据驱动的框架,对于dom操作很弱,一个ref还不能操作组件中的dom,最后研究了一番发现dom可以直接操作,而且更简单。真是用多了框架把最原始最强大的方法都丢了。先来几个知识点铺垫然后做两个关于鼠标拖动的例子。

一:重视起来id

以前总是用jq,id都是用来定位元素的,但仅仅这么用就让费id的本质了,id是dom对象的入口,所有写在dom元素中的属性都可以用id来获取;
比如dom中的style属性用

<div id="box" style="height:100px;width:100px"></div>
```
```
id.style.width 就能获取到相应的值
```
除了这些添加上去的属性 还有很多方法(回调函数)也可以通过id进行绑定
```
<div id="box" onclick="myonclick()"></div> 
#给div绑定了一个点击事件
#也可以在js中这么写
id.onclick = function(){}
```
总结:id是dom元素对象,可获取或者定义dom元素的属性或者方法
#####二:各种位置
在‘id’的回调事件函数中总有个event对象参数,这个对象玄机很深,只说关于位置的两个属性
1.  **event.clientX、event.clientY**
    鼠标相对于[浏览器](http://www.2cto.com/os/liulanqi/)窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性

2. **event.offsetX、event.offsetY**
鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。

3. **id对象的位置参数**
    id.offsetTop对于父元素(position:absolute或relative)上边缘的像素位置
    id.offsetLeft对于父元素(position:absolute或relative)左边缘的像素位置

都是像素为单位的整形数
列:计算div坐标点
```
var baseY = ev.clientY-ev.offsetY;
var baseX = ev.clientX-ev.offsetX;
//或者
var baseY = ev.clientY-id.offsetTop;
var baseX = ev.clientX-id.offsetLeft;
//注 id指的是id那个名字
```
######三:各种id回调事件
1. onmousedown 
    按下鼠标时候会调用该回调函数
2. onmouseup
    松开鼠标时候
3. onmousemove
    鼠标滑动的时候
    该回调函数是个关于过程的函数,在整个鼠标移动的时候该函数一直有效,所以这个函数中的参数event的clientX,clientY会根据实际位置实时改变
4. onmouseout
    鼠标超出元素的时候

######四:实例1 点击拖动实例
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>点击拖动</title>
</head>
<body>
    
    <div id="box" style="position:absolute;background: #888;width: 500px;height:300px;top:100px;left:100px">
        <div id="inbox" style="position:absolute;background: orange;width: 50px;height: 50px;top:10px">
            拖动我
        </div>
    </div>


<script>

    // box.onclick = function(){
    //     console.log(box.offsetWidth)
    // }
    inbox.onmousedown = function(event){
            var basex = event.clientX-inbox.offsetLeft; //计算client初始位置x
            var basey = event.clientY-inbox.offsetTop;  //计算client初始位置y

            var maxpointx = basex+(box.offsetWidth-inbox.offsetWidth) //最大值坐标 id.offsetWidth 获取宽度值 可以直接计算
            var maxpointy = basey+(box.offsetHeight-inbox.offsetHeight)
            // console.log(basex,basey);
        // 移动事件
        box.onmousemove = function(event){
            // 计算边界 防止超出边界
            if(event.clientX<basex){
                posx = basex
            }else if(event.clientX>maxpointx){
                posx = maxpointx
            }else{
                posx = event.clientX
            }

            if(event.clientY<basey){
                posy = basey
            }else if(event.clientY>maxpointy){
                posy = maxpointy
            }else{
                posy = event.clientY
            }
            var l = posx-basex; //计算clientx 差值
            var t = posy-basey; //计算clienty 差值 差值即

            inbox.style.left = l+"px";
            inbox.style.top = t+"px";
        }
    }
 // 鼠标弹起事件
    inbox.onmouseup = function(ev){
        box.onmousemove = null;
        box.onmouseup=null;
    }
        // 超出事件

    box.onmouseout = function(){
        box.onmousemove = null;
        box.onmouseup=null;
    }
</script>
</body>
</html>
```
#####五:实例2 点击拖动滚动实例
图片在含有滚动条的div里 点击拖动 实现拖动浏览
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>点击拖动滚动</title>
</head>
<body>
    <div id="box" style="height:300px;width: 400px;border: 1px solid red;position: absolute;top:20px;left:20px;overflow: scroll;">
        <div style="width: 800px;height: 600px">
            ![](xxxxxx)
        </div>
        
    </div>
<script>
    box.onmousedown=function(event){
        var basex = event.clientX;
        var basey = event.clientY;

        var scrollLeft = box.scrollLeft;
        var scrollTop = box.scrollTop;
        box.onmousemove = function(event){
            var movex = basex - event.clientX;
            var movey = basey - event.clientY ;

            box.scrollLeft = scrollLeft+movex;
            box.scrollTop = scrollTop+movey;
        }
    }

    box.onmouseup = function(){
        box.onmousemove=null;
    }
    box.onmouseout = function(){
        box.onmousemove=null;
    }
</script>
</body>
</html>
```
总结:例1是根据原始坐标计算left和top值 而例2是根据相对坐标计算scrollLeft和scrollTop应该滚动多少 个原理不同但所用知识点完全相同
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,593评论 2 10
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,313评论 0 8
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 3,022评论 1 10
  • 声明:本文来源于http://www.webzsky.com/?p=731我只是在这里作为自己的学习笔记整理一下(...
    angryyan阅读 6,940评论 1 6
  • “宝贝呀,在这半年要好好努力看书呀,要争口气,要把教师资格证拿到,这样你明年才有更大的机会靠编制……”爸妈在视频的...
    杯子勺子魔方阅读 233评论 0 0