JS8day(滚动事件(scroll家族),offset家族,client家族,轮播图案例(待做))

滚动事件

当页面进行滚动时触发的事件

  • 为什么要学?
    很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部
  • 事件名:scroll
  • 监听整个页面滚动:
    windowdocument 添加 scroll 事件
    监听某个元素的内部滚动直接给某个元素加即可
      window.addEventListener('scroll', function () {
          console.log('scroll')
      })

加载事件

方法1

加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

  • 为什么要学?
    有些时候需要等页面资源全部处理完了做一些事情
    老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到
  • 事件名:load
  • 监听页面所有资源加载完毕
    给 window 添加 load 事件
      window.addEventListener('load', function () {
          console.log('load')
      })
  • 注意:不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

方法2

  • 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载。
  • 事件名:DOMContentLoaded
  • 监听页面DOM加载完毕:
    document 添加 DOMContentLoaded 事件
        window.addEventListener('DOMContentLoaded', function () {
            console.log('DOMContentLoaded')
        })

scroll家族(scroll dimensions 滚动尺寸)

  • 获取宽高:
    获取元素的内容总宽高(不包含滚动条)返回值不带单位
    scrollWidthscrollHeight
  • 获取位置:
    获取元素内容往左、往上滚出去看不到的距离
    scrollLeftscrollTop
    这两个属性是 可以修改的
    请添加图片描述
     div.addEventListener('scroll', function () {
         console.log(this.scrollTop)
     })

在这里插入图片描述

  1. scrollWidth和scrollHeight是得到元素什么的宽高?
    内容宽高,不包含滚动条
  2. 被卷去的头部或者左侧用那个属性?是否可以读取和修改?
    scrollTop / scrollLeft
    可以读取,也可以修改(赋值)
  3. 检测页面滚动的头部距离(被卷去的头部)用那个属性?
    document.documentElement.scrollTop

页面滚动显示返回顶部按钮(案例)

在这里插入图片描述
部分代码:

<body>
    <div class="content"></div>
    <div class="backtop">
        <img src="./images/close2.png" alt="">
        <a href="javascript:;"></a>
    </div>
    <script>
        let backtop = document.querySelector('.backtop')
        window.addEventListener('scroll', function () {  //页面滚动检测
            let num = document.documentElement.scrollTop
            console.log(num)
            if (num >= 500) {
                backtop.style.display = 'block';
            }
            else {
                backtop.style.display = 'none';

            }
        })
        //不要写在里面,效率低(滚动依次监听一次)
        backtop.children[1].addEventListener('click', function () {
            document.documentElement.scrollTop = 0
        })

    </script>
</body>

offset家族(offset dimensions偏移尺寸)

在这里插入图片描述

  1. 获取宽高:
    获取元素的自身宽高、包含元素自身设置的宽高、paddingborder
    offsetWidthoffsetHeight
  2. 获取位置:
    获取元素距离自己定位父级元素的左、上距离
    offsetLeftoffsetTop 注意是只读属性(非要给值就用margin-top,margin-left或者定位中的top和left
    在这里插入图片描述
    1. offsetWidthoffsetHeight是得到元素什么的宽高?
    内容 + padding + border
    2. offsetTopoffsetLeft 得到位置以谁为准?
    (1)带有定位的父级
    (2)如果都没有则以文档左上角 为准

电梯导航案例部分代码:

     // 1. 获元取素  
     let items = document.querySelectorAll('.item')
     // 内容的盒子获取
     let neirongs = document.querySelectorAll('.neirong')
     // 2. 左侧aside 模块 点击谁,谁高亮
     for (let i = 0; i < items.length; i++) {
         items[i].addEventListener('click', function () {
             // 找到上一个active 移除类
             document.querySelector('.aside .active').classList.remove('active')
             // 点击谁谁添加类
             this.classList.toggle('active')
             // 3. 右侧内容跟随走动  让页面滚动到对应的offsetTop值位置
             // console.log(neirongs[i].offsetTop) 不用给单位
             document.documentElement.scrollTop = neirongs[i].offsetTop
         })
     }

client家族(client dimensions客户端尺寸)

在这里插入图片描述

浏览器背景颜色改变案例部分代码

        window.addEventListener('resize', function () {   //resize 监听浏览器可是窗口变化
            let w = document.documentElement.clientWidth
            console.log(w)
            if (w >= 1920) {    //浏览器可视窗口clientWidth发生变化则背景颜色改变
                document.body.style.backgroundColor = 'blue'
            }
            else if (w > 540) {
                document.body.style.backgroundColor = 'hotpink'

            }
            else {
                document.body.style.backgroundColor = 'red'

            }
        })

总结

在这里插入图片描述

        // scrollWidth scrollHeight  内容 宽高 (了解)
        let div = document.querySelector('div')
        console.log(div.scrollWidth)  // 150 不带单位
        console.log(div.scrollHeight)  // 336 不带单位
        console.log('----------------------------')
        // offset 盒子元素的大小 = 盒子本身的宽度和高度 + padding + border
        console.log(div.offsetWidth)  // 150 不带单位
        console.log(div.offsetHeight)  // 150 不带单位
        // console.log(div.offsetTop)  //
        // console.log(div.offsetLeft)
        //  client 当前可视区域  不包含滚动条  边框等等
        console.log('----------------------------')
        console.log(div.clientWidth)
        console.log(div.clientHeight)
        console.log(div.clientTop)  // 边框的宽度  了解
        console.log(div.clientLeft)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用scroll-view和定时器结合实现类似轮播图的无缝滚动。具体步骤如下: 1. 在scroll-view中放置多张图片或者其他需要滚动的内容。 2. 使用定时器,定时调用scroll-view的scrollLeft或scrollTop方法,实现滚动效果。 3. 当滚动到最后一张图片时,将scroll-view的scrollLeft或scrollTop设置为0,实现无缝滚动。 4. 在滚动过程中,需要监听scroll-view的scroll事件,当滚动到一定位置时,自动调整滚动位置,以实现无缝滚动效果。 下面是一个示例代码,可以参考实现: ```html <scroll-view class="swiper" scroll-x="{{true}}" style="width:100%;height:300rpx;white-space: nowrap;" bindscroll="onScroll"> <block wx:for="{{imageUrls}}" wx:key="index"> <image class="swiper-item" src="{{item}}" mode="widthFix"></image> </block> </scroll-view> ``` ```javascript Page({ data: { imageUrls: [ 'https://example.com/1.jpg', 'https://example.com/2.jpg', 'https://example.com/3.jpg', 'https://example.com/4.jpg' ], currentIndex: 0 // 当前显示的图片索引 }, onLoad() { // 启动定时器,每隔3秒滚动一次 this.timer = setInterval(() => { this.scrollNext() }, 3000) }, // 滚动到下一张图片 scrollNext() { const { currentIndex, imageUrls } = this.data const nextIndex = currentIndex + 1 >= imageUrls.length ? 0 : currentIndex + 1 this.setData({ currentIndex: nextIndex }) // 滚动到下一张图片 this.scrollToIndex(nextIndex) }, // 滚动到指定图片 scrollToIndex(index) { const query = wx.createSelectorQuery() query.select(`.swiper-item-${index}`).boundingClientRect() query.select('.swiper').boundingClientRect() query.exec(res => { const itemRect = res[0] const swiperRect = res[1] if (!itemRect || !swiperRect) { return } const offsetLeft = itemRect.left - swiperRect.left this.setData({ scrollLeft: offsetLeft }) }) }, // 监听scroll事件,在滚动到最后一张图片时,自动调整滚动位置 onScroll(e) { const { scrollLeft } = e.detail const { imageUrls } = this.data const lastIndex = imageUrls.length - 1 const lastItemRect = wx.createSelectorQuery().select(`.swiper-item-${lastIndex}`).boundingClientRectSync() if (!lastItemRect) { return } if (scrollLeft >= lastItemRect.left) { // 滚动到最后一张图片,重新滚动到第一张图片 this.scrollToIndex(0) } }, onUnload() { // 关闭定时器 clearInterval(this.timer) } }) ``` 注意,上面的示例代码仅供参考,实际开发中还需要考虑更多细节,例如:滚动动画、手势滑动等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值