day05---Dom網(wǎng)頁特效

滾動事件和加載事件

滾動事件:
當頁面進行滾動時觸發(fā)的事件
事件名:scroll
監(jiān)聽整個頁面滾動
語法:

 document.addEventListener('scroll', function () {
            console.log('滾動了')
        })

加載事件:
加載外部資源(如圖片恼策、外聯(lián)CSS和JavaScript等)加載完畢時觸發(fā)的事件
為什么要學?
? 有些時候需要等頁面資源全部處理完了做一些事情
? 老代碼喜歡把 script 寫在 head 中,這時候直接找 dom 元素找不到
事件名:load
監(jiān)聽頁面所有資源加載完畢:
給 window 添加 load 事件:

        window.addEventListener('load', function () {
            // 把代碼寫在load的事件處理函數(shù)中
            let div = document.querySelector('div')
            div.addEventListener('click', function () {
                alert('嘻嘻')
            })
        })

注意:不僅可以監(jiān)聽整個頁面資源加載完畢涣楷,也可以針對某個資源綁定load事件

1.2 加載事件:
當初始的 HTML 文檔被完全加載和解析完成之后分唾,DOMContentLoaded 事件被觸發(fā),而無需等待樣式表狮斗、 圖像等完全加載
事件名:DOMContentLoaded
監(jiān)聽頁面DOM加載完畢: ? 給 document 添加 DOMContentLoaded 事件

document.addEventListener('DOMContentLoaded', function () {
            console.log('測試')

            // 把代碼寫在DOMContentLoaded的事件處理函數(shù)中
            let div = document.querySelector('div')
            div.addEventListener('click', function () {
                alert('嘻嘻')
            })
        })

元素大小和位置

scroll家族

獲取寬高:
獲取元素的內(nèi)容總寬高(不包含滾動條)返回值不帶單位
scrollWidth
scrollHeight
只讀屬性绽乔,不能修改

獲取位置:
獲取元素內(nèi)容往左、往上滾出去看不到的距離
scrollLeft
scrollTop
這兩個屬性是可以修改的t

獲取頁面的滾動卷曲距離: document.documentElement.scrollTop

案例:頁面滾動顯示返回頂部按鈕
 // 獲取元素
        let backtop = document.querySelector('.backtop')

        // 需求:
        //  1. 滾動的時候控制返回頂部的按鈕顯示還是隱藏
        //    1.1 當頁面滾動卷曲的距離 超過了 500碳褒, 就顯示折砸,否則隱藏
        //    1.2 要監(jiān)聽頁面滾動事件  給頁面注冊scroll滾動事件
        //  2. 點擊按鈕,實現(xiàn)返回頂部

        // 需求1
        window.addEventListener('scroll', function () {
            // 來頁面滾動卷曲的距離
            let y = document.documentElement.scrollTop
            // console.log(y)

            // 判斷是否有超過600
            if (y >= 600) {
                backtop.style.display = 'block'
            } else {
                backtop.style.display = 'none'
            }
        })

        // 需求2:
        backtop.addEventListener('click', function () {
            // 返回頂部
            document.documentElement.scrollTop = 0
        })
offset家族

獲取寬高:
offsetWidth和offsetHeight
獲取元素的真實寬高沙峻、包含元素自身設(shè)置的寬高睦授、padding、border

獲取位置:
offsetLeft和offsetTop
獲取元素距離自己定位父級元素的左摔寨、上距離
注意:都是只讀屬性

案例:仿京東固定導航欄案例
 let sk = document.querySelector('.sk')
    let header = document.querySelector('.header')

    // 需求:當頁面滾動距離超過秒殺模塊的時候去枷,顯示header(top為0)  否則隱藏(top為-80px)

    // 分析:
    //  1. 給window注冊scroll滾動事件
    //  2. 獲取頁面滾動距離 scrollTop
    //  3. scrollTop 和 秒殺模塊到頁面頂部的距離 offsetTop
    //   3.1 scrollTop >= sk.offsetTop 顯示header
    //   3.2 否則隱藏(top為-80px)

    // 1. 
    window.addEventListener('scroll', function () {
      // 2 
      let y = document.documentElement.scrollTop
      console.log(y, sk.offsetTop)

      // 3. 
      if (y >= sk.offsetTop) {
        // 注意:style別落下
        // 0的時候,單位px可以不寫
        header.style.top = 0
      } else {
        header.style.top = '-80px'
      }
    })
案例:電梯導航案例
 // 導航
        let items = document.querySelectorAll('.item')
        // 內(nèi)容
        let neirongs = document.querySelectorAll('.neirong')

        // 需求: 點擊導航的時候
        //  1. 當前點擊的導航高亮是复,其他導航不高亮 ==> 排他效果 (升級效果)
        //  2. 頁面滾動到對應的位置上 ==> 該代碼寫在 點擊導航的事件處理函數(shù)里面


        // 給所有導航注冊click ==> 別落下for循環(huán)删顶,items 是偽數(shù)組
        for (let i = 0; i < items.length; i++) {
            // console.log(items[i])
            items[i].addEventListener('click', function () {
                // 需求1: 排他
                // 1. 先獲取到高亮的元素,將其高亮類名active移出掉
                document.querySelector('.active').classList.remove('active')
                // 2. 點擊的導航添加高亮類名active
                this.classList.add('active')

                // 需求2. 頁面滾動到對應的位置上
                document.documentElement.scrollTop = neirongs[i].offsetTop
            })
        }
client家族

獲取寬高:
clientWidth和clientHeight
獲取元素的可見部分寬高(不包含邊框淑廊,滾動條等)
獲取位置:
clientLeft和clientTop
獲取左邊框和上邊框?qū)挾?br> 注意:都是只讀屬性

會在窗口尺寸改變的時候觸發(fā)事件: resize翼闹,用于獲取頁面可視區(qū)大小

        window.addEventListener('resize', function () {
            console.log(document.documentElement.clientWidth, document.documentElement.clientHeight)
        })
綜合案例:輪播圖案例
  // 輪播圖開始啦
    // 需求①:小圖標鼠標經(jīng)過事件
    //   鼠標經(jīng)過小圖片,當前高亮蒋纬,其余兄弟變淡  添加類
    let lis = document.querySelectorAll('.indicator li')
    let piclis = document.querySelectorAll('.slides ul li')
    let text = document.querySelector('.extra h3')
    let next = document.querySelector('.next')
    let prev = document.querySelector('.prev')
    let main = document.querySelector('.main')

    // 給多個小li綁定事件
    for (let i = 0; i < lis.length; i++) {
      lis[i].addEventListener('mouseenter', function () {
        // 選出唯一的那個active 猎荠,刪除類
        document.querySelector('.indicator .active').classList.remove('active')
        // 鼠標經(jīng)過誰,誰加上active 這個類
        this.classList.add('active')

        // 需求② :大圖片跟隨變化  一定要放到鼠標經(jīng)過事件里面
        // 對應的大圖片跟著顯示蜀备,如果想要過渡效果关摇,可以使用opacity效果,可以利用CSS淡入      淡出的效果碾阁,還是添加類
        // 選出唯一的那個active 输虱,刪除類
        document.querySelector('.slides ul .active').classList.remove('active')
        // 對應序號的那個 li,誰加上active 這個類
        piclis[i].classList.add('active')
        text.innerHTML = `第${i + 1}張圖的描述信息`

        // 需求④:解決一個BUG
        // 點擊右側(cè)按鈕可以實現(xiàn)播放下一張脂凶,但是鼠標經(jīng)過前面的宪睹,播放就會亂序
        // 解決方案:  讓變化量 index 重新賦值為 當前鼠標經(jīng)過的索引號
        // 鼠標經(jīng)過了那個小li 他的索引號就是 i 
        // 右側(cè)按鈕是通過 index 來了控制播放的
        index = i
      })
    }


    // 需求③:右側(cè)按鈕播放效果
    //   點擊右側(cè)按鈕,可以自動播放下一張圖片
    //   需要一個變化量  index 不斷自增
    //   然后播放下一張圖片
    //   如果到了最后一張蚕钦,必須要還原為第1張圖片
    //   教你一招: 索引號 = 索引號 % 數(shù)組長度 (放到播放前面)
    let index = 0  // 全局變量  信號量 控制器 為了給 右側(cè)按鈕和左側(cè)按鈕同時使用
    next.addEventListener('click', function () {
      index++
      // 選出 index 小圖片 做操作
      // console.log(index)
      // if (index === lis.length) {
      //   index = 0
      // }
      index = index % lis.length
      common()

    })

    // 需求⑤:左側(cè)按鈕播放效果
    //   點擊左側(cè)按鈕亭病,可以自動播放上一張圖片
    //   需要一個變化量  index 不斷自減
    //   然后播放上一張圖片
    //   如果到了第一張,必須要從最后一張播放
    //   教你一招: 索引號 = (數(shù)組長度 + 索引號) % 數(shù)組長度
    prev.addEventListener('click', function () {
      index--
      // 選出 index 小圖片 做操作
      // console.log(index)
      if (index < 0) {
        index = lis.length - 1
      }
      // index = (lis.length + index) % lis.length
      common()

    })

    // 需求⑥:
    //   因為左側(cè)按鈕和右側(cè)按鈕里面有大量相同的操作嘶居,可以抽取封裝一個函數(shù) common
    function common() {
      document.querySelector('.indicator .active').classList.remove('active')
      lis[index].classList.add('active')
      // 選出 index 大圖片 做操作
      document.querySelector('.slides ul .active').classList.remove('active')
      piclis[index].classList.add('active')
      text.innerHTML = `第${index + 1}張圖的描述信息`
    }



    // 需求⑦:開啟定時器
    //   其實定時器自動播放罪帖,就相當于點擊了右側(cè)按鈕,此時只需要, next.click()
    let timer = setInterval(function () {
      // 自動調(diào)用右側(cè)按鈕的點擊事件
      next.click()
    }, 1000)
    // 需求⑧:
    //   鼠標經(jīng)過停止定時器 (清除定時器)

    main.addEventListener('mouseenter', function () {
      clearInterval(timer)
    })
    //   鼠標離開開啟定時器 (開啟定時器)
    main.addEventListener('mouseleave', function () {
      timer = setInterval(function () {
        // 自動調(diào)用右側(cè)按鈕的點擊事件
        next.click()
      }, 1000)
    })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末整袁,一起剝皮案震驚了整個濱河市菠齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坐昙,老刑警劉巖绳匀,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炸客,居然都是意外死亡襟士,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門嚷量,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陋桂,“玉大人,你說我怎么就攤上這事蝶溶∈壤” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵抖所,是天一觀的道長梨州。 經(jīng)常有香客問我,道長田轧,這世上最難降的妖魔是什么暴匠? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮傻粘,結(jié)果婚禮上每窖,老公的妹妹穿的比我還像新娘。我一直安慰自己弦悉,他們只是感情好窒典,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稽莉,像睡著了一般瀑志。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上污秆,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天劈猪,我揣著相機與錄音,去河邊找鬼良拼。 笑死战得,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的将饺。 我是一名探鬼主播贡避,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼痛黎,長吁一口氣:“原來是場噩夢啊……” “哼予弧!你這毒婦竟也來了刮吧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掖蛤,失蹤者是張志新(化名)和其女友劉穎杀捻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚓庭,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡致讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了器赞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢袱。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖港柜,靈堂內(nèi)的尸體忽然破棺而出请契,到底是詐尸還是另有隱情,我是刑警寧澤夏醉,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布爽锥,位于F島的核電站,受9級特大地震影響畔柔,放射性物質(zhì)發(fā)生泄漏氯夷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一靶擦、第九天 我趴在偏房一處隱蔽的房頂上張望腮考。 院中可真熱鬧,春花似錦玄捕、人聲如沸秸仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂纪。三九已至,卻和暖如春赌结,著一層夾襖步出監(jiān)牢的瞬間捞蛋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工柬姚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拟杉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓量承,卻偏偏與公主長得像搬设,于是被迫代替她去往敵國和親穴店。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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