day05---Dom网页特效

滚动事件和加载事件

滚动事件:
当页面进行滚动时触发的事件
事件名:scroll
监听整个页面滚动
语法:

 document.addEventListener('scroll', function () {
            console.log('滚动了')
        })

加载事件:
加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件
为什么要学?
Ø 有些时候需要等页面资源全部处理完了做一些事情
Ø 老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到
事件名:load
监听页面所有资源加载完毕:
给 window 添加 load 事件:

        window.addEventListener('load', function () {
            // 把代码写在load的事件处理函数中
            let div = document.querySelector('div')
            div.addEventListener('click', function () {
                alert('嘻嘻')
            })
        })

注意:不仅可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

1.2 加载事件:
当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、 图像等完全加载
事件名:DOMContentLoaded
监听页面DOM加载完毕: Ø 给 document 添加 DOMContentLoaded 事件

document.addEventListener('DOMContentLoaded', function () {
            console.log('测试')

            // 把代码写在DOMContentLoaded的事件处理函数中
            let div = document.querySelector('div')
            div.addEventListener('click', function () {
                alert('嘻嘻')
            })
        })

元素大小和位置

scroll家族

获取宽高:
获取元素的内容总宽高(不包含滚动条)返回值不带单位
scrollWidth
scrollHeight
只读属性,不能修改

获取位置:
获取元素内容往左、往上滚出去看不到的距离
scrollLeft
scrollTop
这两个属性是可以修改的t

获取页面的滚动卷曲距离: document.documentElement.scrollTop

案例:页面滚动显示返回顶部按钮
 // 获取元素
        let backtop = document.querySelector('.backtop')

        // 需求:
        //  1. 滚动的时候控制返回顶部的按钮显示还是隐藏
        //    1.1 当页面滚动卷曲的距离 超过了 500, 就显示,否则隐藏
        //    1.2 要监听页面滚动事件  给页面注册scroll滚动事件
        //  2. 点击按钮,实现返回顶部

        // 需求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
获取元素的真实宽高、包含元素自身设置的宽高、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')
        // 内容
        let neirongs = document.querySelectorAll('.neirong')

        // 需求: 点击导航的时候
        //  1. 当前点击的导航高亮,其他导航不高亮 ==> 排他效果 (升级效果)
        //  2. 页面滚动到对应的位置上 ==> 该代码写在 点击导航的事件处理函数里面


        // 给所有导航注册click ==> 别落下for循环,items 是伪数组
        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
获取左边框和上边框宽度
注意:都是只读属性

会在窗口尺寸改变的时候触发事件: resize,用于获取页面可视区大小

        window.addEventListener('resize', function () {
            console.log(document.documentElement.clientWidth, document.documentElement.clientHeight)
        })
综合案例:轮播图案例
  // 轮播图开始啦
    // 需求①:小图标鼠标经过事件
    //   鼠标经过小图片,当前高亮,其余兄弟变淡  添加类
    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')
        // 鼠标经过谁,谁加上active 这个类
        this.classList.add('active')

        // 需求② :大图片跟随变化  一定要放到鼠标经过事件里面
        // 对应的大图片跟着显示,如果想要过渡效果,可以使用opacity效果,可以利用CSS淡入      淡出的效果,还是添加类
        // 选出唯一的那个active ,删除类
        document.querySelector('.slides ul .active').classList.remove('active')
        // 对应序号的那个 li,谁加上active 这个类
        piclis[i].classList.add('active')
        text.innerHTML = `第${i + 1}张图的描述信息`

        // 需求④:解决一个BUG
        // 点击右侧按钮可以实现播放下一张,但是鼠标经过前面的,播放就会乱序
        // 解决方案:  让变化量 index 重新赋值为 当前鼠标经过的索引号
        // 鼠标经过了那个小li 他的索引号就是 i 
        // 右侧按钮是通过 index 来了控制播放的
        index = i
      })
    }


    // 需求③:右侧按钮播放效果
    //   点击右侧按钮,可以自动播放下一张图片
    //   需要一个变化量  index 不断自增
    //   然后播放下一张图片
    //   如果到了最后一张,必须要还原为第1张图片
    //   教你一招: 索引号 = 索引号 % 数组长度 (放到播放前面)
    let index = 0  // 全局变量  信号量 控制器 为了给 右侧按钮和左侧按钮同时使用
    next.addEventListener('click', function () {
      index++
      // 选出 index 小图片 做操作
      // console.log(index)
      // if (index === lis.length) {
      //   index = 0
      // }
      index = index % lis.length
      common()

    })

    // 需求⑤:左侧按钮播放效果
    //   点击左侧按钮,可以自动播放上一张图片
    //   需要一个变化量  index 不断自减
    //   然后播放上一张图片
    //   如果到了第一张,必须要从最后一张播放
    //   教你一招: 索引号 = (数组长度 + 索引号) % 数组长度
    prev.addEventListener('click', function () {
      index--
      // 选出 index 小图片 做操作
      // console.log(index)
      if (index < 0) {
        index = lis.length - 1
      }
      // index = (lis.length + index) % lis.length
      common()

    })

    // 需求⑥:
    //   因为左侧按钮和右侧按钮里面有大量相同的操作,可以抽取封装一个函数 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}张图的描述信息`
    }



    // 需求⑦:开启定时器
    //   其实定时器自动播放,就相当于点击了右侧按钮,此时只需要, next.click()
    let timer = setInterval(function () {
      // 自动调用右侧按钮的点击事件
      next.click()
    }, 1000)
    // 需求⑧:
    //   鼠标经过停止定时器 (清除定时器)

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

推荐阅读更多精彩内容