JS特效

offset

offsetWidth,offsetHeight:沒有單位很魂,數(shù)值類型,檢測盒子的寬高,包括padding和border绽乔,不包含margin

offsetWidth = padding + border + width

offsetHeight = padding + border + height

offsetTop,offsetLeft:檢測在父盒子中距離最近的帶有定位的盒子的左上的距離补疑,如果父級盒子都沒有定位歧沪,那么以body為準,從父親的padding開始算莲组,不包括父親的border诊胞,包含父親的padding,也包含自己的margin锹杈,但是不包含自己的padding和border,沒有單位撵孤,數(shù)值類型

offsetTop = top + father.padding + margin

offsetLeft = left + father.padding + margin

style.top不一定等于offsetTop

scroll

scrollWidth,scrollHeight:不包括margin,當里面的內(nèi)容沒有超過盒子時,代表的是盒子的寬高竭望,當內(nèi)容超過盒子時邪码,代表內(nèi)容的寬高

scrollWidth = width + padding

scrollHeight = height + padding

scrollTop,scrollLeft:網(wǎng)頁被卷去的左上,都是body調(diào)用

    window.onscroll = function () {
      document.title = document.body.scrollTop;


      //沒有dtd約束的
        document.title = document.body.scrollTop;
      //有dtd約束的
        document.title = document.documentElement.scrollTop;

      //兼容寫法
        document.title = document.body.scrollTop || document.documentElement.scrollTop;
        document.title = document.body.scrollTop + document.documentElement.scrollTop;
            document.title = window.pageYOffset;
        alert(window.pageYOffset);
        document.title = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;

    }

client

clientHeight,clientWidth:包含padding但是不包含border和margin

clientHeight = padding + height

clientWidth = padding + width

clientTop,clientLeft:代表border

clientTop = borderTop

clientLeft = borderLeft

動畫

勻速動畫

    function animat(target) {
    //要用定時器先清除定時器
      clearInterval(time);

      //速度固定
      var  speed = target >= box.offsetLeft ? 10: -10;

      time = setInterval(function () {
        //在執(zhí)行之前就獲取當前值和目標值之差
        var val = target - box.offsetLeft;
        box.style.left = box.offsetLeft + speed + "px";
        //目標值和當前值只差如果小于步長,那么就不能在前進了
        //因為步長有正有負咬清,所有轉(zhuǎn)換成絕對值來比較
        if(Math.abs(val)<Math.abs(speed)){
        box.style.left = target + "px";
        clearInterval(time);
      },30);
    }

緩動動畫

    function animat(box,target) {

      clearInterval(box.time);

      box.time = setInterval(function () {
        var speed = - (box.offsetLeft - target) / 10;
        //對步長進行二次加工(大于0向上取整,小于0項下取整)
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

        box.style.left = box.offsetLeft + speed + "px";
        if(speed === 0){
          //處理小數(shù)賦值
          box.style.left = target + "px";
          clearInterval(box.time);
        }

      },30);
    }
  /**
   * 緩動動畫終極版
   * @param ele 元素
   * @param json "屬性":值
   * @param fn 回調(diào)函數(shù)
   */
    function animate(ele,json,fn) {
        clearInterval(ele.time);
        ele.time = setInterval(function () {

          //清除定時器的標志
          var bool = true;
          //遍歷json
          for (var key in json) {
            var leader = parseInt(getStyle(ele, key)) || 0;
            var speed = (json[key] - leader) / 10;
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
            leader = leader + speed;
            ele.style[key] = leader + speed + "px";
            if (json[key] !== leader) {
              bool = false;
            }
          }
          //定時器每次執(zhí)行的時候都會把bool賦值成true闭专,經(jīng)過循環(huán)所有的屬性的動畫都結(jié)束了。speed都是0旧烧,bool出來就還是true
          if (bool) {
            clearInterval(ele.time);
            if(fn){
              fn();
            }
          }

        },25);
    }
  //兼容方法獲取元素樣式
  function getStyle(ele,attr){
    if(window.getComputedStyle){
      return window.getComputedStyle(ele,null)[attr];
    }
    return ele.currentStyle[attr];
  }

event對象

事件對象獲取

    document.onclick = function (event) {
      //兼容寫法
      event || window.event;
    }

非重點屬性

      console.log(event.timeStamp);//頁面刷新時間到點擊時的時間差影钉,毫秒
      console.log(event.type);//事件類型,click點擊事件
      console.log(event.target);//該事件被傳送到的對象,也就是觸發(fā)事件的對象
      console.log(event.button);//當事件被觸發(fā)時掘剪,返回那個鼠標按鈕被點擊
      console.log(event.bubbles); //獲取事件是否觸發(fā)冒泡

重點屬性:取決于先去坐標系不同斧拍,相對于坐標系,鼠標的位置


      console.log(event.pageY);//body(頁面)為坐標系
      console.log(event.clientY);//當前可視區(qū)域(瀏覽器)為坐標系
      console.log(event.screenY);//以屏幕為坐標系,基本不用

冒泡

類似響應(yīng)者鏈,但是事件不會找到最適的觸發(fā)杖小,而是都會觸發(fā)

Snip20170605_3.png
//當點擊自盒子時候肆汹,父盒子也會觸發(fā)
    var box1 = document.getElementsByClassName("box1")[0];
    var box2 = document.getElementsByClassName("box2")[0];
    var box3 = document.getElementsByClassName("box3")[0];
    box1.onclick  = function () {
      console.log("點了box1");
    }
    box2.onclick  = function () {
      console.log("點了box2");
    }
    box3.onclick  = function () {
      console.log("點了box3");
    }
    document.body.onclick = function () {
      console.log("點擊了body");
    }
    

捕獲從上往下 body->...div

冒泡從下往上 div->...body

addEventListener第三個參數(shù)true是捕獲愚墓,false是冒泡

    box1.addEventListener("click", function () {
      console.log("點了box1");
    },true);
    box2.addEventListener("click", function () {
      console.log("點了box2");
    },true);
    box3.addEventListener("click", function () {
      console.log("點了box3");
    },true);
    document.addEventListener("click", function () {
      console.log("點了document");
    },true);

避免冒泡

onBlur 、focus昂勉、onload浪册、 onunload、onmouseenter岗照、onmouseleave不會觸發(fā)冒泡

    //阻止冒泡
    box1.onclick = function (event) {
      //這種方法取消冒泡的機制是到box1這個層級時阻斷冒泡繼續(xù)傳遞村象,不會傳到body了。但是之前的box2攒至,box3冒泡還是有,
      //冒泡的時候類似響應(yīng)者鏈的傳遞厚者,到這層被阻止了。
      event = event || window.event;
      if (event && event.stopPropagation) {
        event.stopPropagation();
      }else {
        event.cancelBubble = true;
      }
      console.log("點了box1");
    }
    box2.onclick  = function () {
      console.log("點了box2");
    }
    box3.onclick  = function () {
      console.log("點了box3");
    }
    document.body.onclick = function () {
      console.log("點擊了body");
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迫吐,一起剝皮案震驚了整個濱河市库菲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌志膀,老刑警劉巖熙宇,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溉浙,居然都是意外死亡烫止,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門戳稽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馆蠕,“玉大人,你說我怎么就攤上這事惊奇【<福” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵赊时,是天一觀的道長吨铸。 經(jīng)常有香客問我,道長祖秒,這世上最難降的妖魔是什么诞吱? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮竭缝,結(jié)果婚禮上房维,老公的妹妹穿的比我還像新娘。我一直安慰自己抬纸,他們只是感情好咙俩,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般阿趁。 火紅的嫁衣襯著肌膚如雪膜蛔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天脖阵,我揣著相機與錄音皂股,去河邊找鬼。 笑死命黔,一個胖子當著我的面吹牛呜呐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悍募,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蘑辑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坠宴?” 一聲冷哼從身側(cè)響起洋魂,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啄踊,沒想到半個月后忧设,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刁标,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡颠通,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膀懈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顿锰。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖启搂,靈堂內(nèi)的尸體忽然破棺而出硼控,到底是詐尸還是另有隱情,我是刑警寧澤胳赌,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布牢撼,位于F島的核電站,受9級特大地震影響疑苫,放射性物質(zhì)發(fā)生泄漏熏版。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一捍掺、第九天 我趴在偏房一處隱蔽的房頂上張望撼短。 院中可真熱鬧,春花似錦挺勿、人聲如沸曲横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禾嫉。三九已至灾杰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夭织,已是汗流浹背吭露。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尊惰,地道東北人讲竿。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像弄屡,于是被迫代替她去往敵國和親题禀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容