前端基本功--网页特效1 11.11

一、offset家族

  1. offset (自己的)
    js中有一套方便获取元素尺寸的方法:offset。

  2. 图片1.png
  3. offsetWidth offsetHeight
    得到对象的宽度和高度。
    offsetWidth = width + border + padding
    div.style.width 只能得到行内(body中的css样式,行内/嵌入/外链)的数值。

  4. offsetLeft offsetTop
    返回距离上级盒子(最近的带有定位)左边/上边的位置。
    如果父级都没有定位则以body 为准,这里的父级指的是所有上一级,不仅仅指的是父亲,还可以是 爷爷 曾爷爷。。
    从父级的padding开始算的,border不算, 就是子盒子到定位的父盒子边框到边框的距离

  • 筋斗云
   var cloud = document.getElementById("cloud");
    var nav = document.getElementById("nav");
    var lis = nav.children[1].children;
    var current = 0;
    for(i = 0 ;i < lis.length; i++){
        lis[i].onmouseover = function(){
           target = this.offsetLeft;
        }
        lis[i].onmouseout = function(){
            target = current;
        }
        lis[i].onclick = function(){
            current = this.offsetLeft;
        }
    }//error:写成i<=
    var leader = 0 ,target = 0;
    setInterval(function(){
        leader = leader +( target - leader)/10;
        cloud.style.left = leader + "px"; 
    },30);
  1. offsetParent
    返回对象的父亲 (带有定位的、 不一定是亲的)
    parentNode:返回父亲(亲的)
    如果当前元素的父级元素没有进行CSS定位(position relative),offsetParent为body。
    如果当前元素的父级元素中有CSS定位,offsetParent取最近的那个父级元素。
  2. offsetTop style.top 的区别
    (1)、最大区别是offsetLeft 可以返回没有定位盒子的距离左侧的位置, 而 style.top 不可以 只有定位的盒子 才有 left top right。
    (2)、offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。
    style.left = 300px parseInt(300px)想要相加就用parseInt。
    (3)、offsetTop 只读,而 style.top 可读写(可以更改值)。
    (4)、如果没有给 HTML元素指定过 top样式,则 style.top 返回的是空字符串。
    (5)、最重要的区别style.left 只能得到行内样式,offsetLeft 不需要。

二、事件对象

  1. onmouseover onmouseout onclick .....等都是事件。在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。所有浏览器都支持event对象,但支持的方式不同。
    体会
 document.onclick = function(event){  // 文档中点击
        // console.log(window.event.clientX);  ie 678
        /*console.log(event.clientX);
        console.log(event.clientY);*/
        var event = event || window.event;   // 兼容性写法
        console.log(event.clientY);// 页面
        console.log(event.pageY);//页面+滚动条
        console.log(event.screenY);//电脑屏幕
  • event 常见属性
    data 返回拖拽对象的URL字符串(dragDrop)
    width 该窗口或框架的高度
    height 该窗口或框架的高度
    pageX 光标相对于该网页的水平位置(ie无)
    pageY 光标相对于该网页的垂直位置(ie无)
    screenX 光标相对于该屏幕的水平位置
    screenY 光标相对于该屏幕的垂直位置
    target 该事件被传送到的对象
    type 事件的类型
    clientX 光标相对于该网页的水平位置 (当前可见区域)
    clientY 光标相对于该网页的水平位置
  1. pageX clientX screenX 区别
    screen X screenY, 是以我们的电脑屏幕 为基准点
    pageX pageY,以我们的文档 (绝对定位) 的基准点 对齐(加上滚动条之间隐藏区域) ie678 不认识
    clientX clientY,以 可视区域 为基准点 类似于固定定位
  2. 鼠标点击对象移动
    document.onclick :点击dom中的对象,实现图的移动
    var image = document.getElementById("image"); 
    document.onclick = function(event){
        var event = event || window.event; //error忘记这个dom中的事件对象了
        targetX = event.clientX - image.offsetWidth/2;
        targetY = event.clientY - image.offsetHeight/2;//error 忘记除2 是减号
    }
    var leaderX = 0, targetX = 0, leaderY = 0, targetY = 0;
    setInterval(function(){
        leaderX = leaderX + (targetX - leaderX ) / 10;
        leaderY = leaderY + (targetY - leaderY ) / 10;
        image.style.left = leaderX + "px";
        image.style.top = leaderY + "px";
    },8);

三、常用事件

  1. 常用事件
    onclick
    onmouseover 鼠标经过
    onmouseout 鼠标离开
    onmousedown 鼠标按下
    onmouseup 鼠标弹起
    onmousemove 当鼠标移动的时候 就是说,鼠标移动一像素就会执行的事件。
  • div.onmouseover 和 div.onmousemove 区别
    他们相同点 都是 经过 div 才会触发
    div.onmouseover 经过只触发一次。
    div.onmousemove 每移动一像素,就会触发一次 。
  1. 放大镜
    思路总结:
    css定位很重要,放大镜定位在小图片中,大图片定位在大盒子中,大图片和放大镜隐藏,移动时出现,首先设置放大镜在小图片中的移动位置限制,再设置右边盒子的移动大小。
    function $(id) {
        return document.getElementById(id);
    } 
    var small = $("box").children[0];
    var big  = $("box").children[1];
    var yellow = small.children[1];
    var bigimage = big.children[0];
    small.onmouseover = function(){
        big.style.display = "block";
        yellow.style.display = "block";
    }
    small.onmouseout = function(){
        big.style.display = "none";
        yellow.style.display = "none";
    }
    small.onmousemove = function(event){
        var event = event || window.event;
        //鼠标移动黄色块在小盒子里面的变化,需要计算
        var x = event.clientX - this.offsetParent.offsetLeft - yellow.offsetWidth/2;
        var y = event.clientY - this.offsetParent.offsetTop - yellow.offsetHeight/2;
        if(x<0){
            x = 0 +"px";
        }
        else if(x>this.offsetWidth - yellow.offsetWidth) {
            x = this.offsetWidth - yellow.offsetWidth;
        }
        if(y<0) {
            y = 0 +"px";
        }
        else if(y>this.offsetHeight - yellow.offsetHeight) {
            y = this.offsetHeight - yellow.offsetHeight;
        }
        yellow.style.left = x+"px";
        yellow.style.top = y+"px";//鼠标在小盒子里面移动,改变的是黄色的位置。
        //大盒子里图片的移动是小盒子的倍数(大盒子/ 小盒子的倍数)
        bigimage.style.left = -x*big.offsetWidth/small.offsetWidth+"px";
        bigimage.style.top = -y*big.offsetHeight/small.offsetHeight+"px";
    }

防止选择拖动
我们知道 按下鼠标然后拖拽可以选择文字 的。
清除选中的内容
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

  1. 滚动条
    思路:鼠标按下之后拖动,用鼠标位置减去小盒子的左边位置得出大盒子距离左侧位置,在用鼠标位置减去大盒子距离左边位置,鼠标事件触发后移动。
    function $(id) {
        return document.getElementById(id);
    } 
    var two = $("one").children[0];
    two.onmousedown = function(event){
        var event = event || window.event;
        var lefta = event.clientX - this.offsetLeft;
        var that = this;
        document.onmousemove = function(event){ //document写成two
         var event = event || window.event;
         that.style.left = event.clientX - lefta+"px";//忘记加px
         var val = parseInt(that.style.left);
         // alert(val);
         if (val < 0) {
            that.style.left = "0px";
         }
         else if (val > 490) {
            that.style.left = "490px";
         }
         $("three").style.width = that.style.left;
         $("span").innerHTML = "已经走了"+parseInt(parseInt(that.style.left)/($("one").offsetWidth-$("two").offsetWidth) * 100)+"%";
         window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

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

推荐阅读更多精彩内容

  • 1复习 根据位置返回 字符 asdfg.charAt(3)=f根据字符返回位置 从前面索引 asdfgg....
    Looog阅读 269评论 0 0
  • offset家族 offset 自己的目的: js中有一套方便的获取元素尺寸的办法就是offset家族; 1/...
    越IT阅读 11,283评论 1 22
  • offset家族三大家族和一个事件对象三大家族(offset/scroll/client)事件对象/event ...
    Yuann阅读 938评论 0 5
  • JS三大系列 三大家族(offset/scroll/client) 事件对象 (event)(事件被触动时,鼠标...
  • 每个人都有自己的童年,经历了太多太多,有些事情已经忘记了,可有些却还清晰的记着。 我出生在80年代,生产技术相当落...
    12月5号阅读 333评论 3 0