美文网首页
DOM window事件

DOM window事件

作者: 你怀中的猫 | 来源:发表于2022-05-03 16:25 被阅读0次

1、window.onresize 监听浏览器窗口大小变化

  • 当浏览器宽高发生变化,就会自动触发

2、window.onscroll 监听滚动条

  • 当滚动条发生移动自动触发事件

3、window.onload

  • 当页面资源全部加载完毕的时候触发,只会触发一次

滚动偏移 window.onscroll

  • 滚动条事件,当页面滚动条发生偏移的时候,会触发这个事件
  • 获取窗口 document.documentElement
  • 获取窗口可见的高度 document.documentElement.clientHeight
  • 获取窗口可见的宽度 document.documentElement.clientWidth
  • 获取页面整体高度 document.documentElement.scrollHeight
  • 获取页面整体宽度 document.documentElement.scrollWidth
  • 完美兼容
    var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

回到顶部

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .wrap{
            width: 300px;
            height: 300px;
            border: 5px solid #333;
        }
        #btn{
            width: 200px;
            height: 100px;
            border-radius: 20px;
            font-size: 40px;
            position: fixed;
            bottom: 50px;
            right: 50px;
            display: none;
        }
    </style>
</head>
<body>

    <button id="btn">回到顶部</button>
    <div class="fwrap">
        <div class="wrap"></div>
        <div class="wrap"></div>
        <div class="wrap"></div>
        <div class="wrap"></div>
        <div class="wrap"></div>
        <div class="wrap"></div>
    </div>
   
</body>
<script>


    //获取大盒子
    var fwrap = document.querySelector('.fwrap');
    var btn = document.querySelector('#btn');

    //谷歌和火狐支持
    window.onscroll = function(){

        //滚动条高度
        var sT = parseInt(document.documentElement.scrollTop) ;
        console.log(sT);
        //可视区域高度
        var cH = parseInt(document.documentElement.clientHeight);
        console.log(cH);
        //页面整体高度
        var sH = parseInt(document.documentElement.scrollHeight);
        console.log(sH);

        //计算公式 : 滚动条高度 + 可视区域高度 = 页面整体高度

        if((sT + cH) == sH){
            //当页面滑到底部时,为页面添加一个盒子
            var ele = document.createElement('div');
            ele.className = 'wrap';
            ele.style.backgroundColor = '#' + parseInt(Math.random() * 0xffffff).toString(16);
            //将创建好的大盒子添加至大盒子中
            fwrap.appendChild(ele);
            // alert('你以到达页面底部');
            btn.style.display = 'block';
        }
    }



    //给按钮绑定点击事件
    btn.onclick = function(){ 
        //获取当前的滚轮高度  
        var num = document.documentElement.scrollTop;
        console.log('当前的滚轮高度:' + num);
        var timer = setInterval(function(){
            num -= 40;
            document.documentElement.scrollTop = num;   
            btn.style.display = 'none';  
            if(num <= 0){
                //清除定时器
                clearInterval(timer);
            }       
        },10)   
    }
 
</script>
</html>

瀑布流

实现思路:

  • 1、在html中写一个大盒子wrap
  • 2、获取wrap标签
  • 3、先声明一个空的对象。 var json = {list:[]}
  • 4、使用for生成测试数据,声明一个空对象obj,用来保存对象数据
  • 5、对象数据生成完毕后,将数据添加(push)至测试的json对象中
  • 6、定义一个方法,创建所有的盒子,将创建好的盒子添加至wrap中
  • 7、定义一个渲染数据的方法,获取json对象中list的数组,使用for循环生成盒子,调用创建盒子的方法 。
  • 8、声明一个方法,计算一行中最多可以排几列,获取浏览器视窗宽度和盒子的宽度,两者相除,对结果进行取整
  • 9、定义一个方法,给所有的盒子做定位
  • 10、先获取所有的盒子、浏览器的视窗、盒子所占的宽度、剩余空间的宽度,间隙平分
    剩余空间
    间隙 = 视窗宽度 % 盒子的宽度 / (列数 + 1)
  • 11、使用for循环给所有的item定位,先判断第一行有几个,索引值小于列数,则证明是第一行,先给第一行做定位,再给其他行做定位
  • 12、取出盒子所有的高度,存在一个数组中
  • 13、找出数组中最小高度 Math.min.apply(null,数组)
  • 14、根据最小值查找它的下标,然后设置其left值
  • 15、更新高度数组中的数据 新的列高 = 旧的高度 + 上下间距 + item高度
  • 16、当页面加载完毕之后执行代码 重新调用定位方法
  • 17、当页面大小发生变化,触发定位方法 重新调用定位方法
  • 18、当页面到达底部时,不断渲染页面
  • 19、判断到底部时,调用创建所有item的方法及定位方法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            margin: 0;
            padding: 0;
        }
         .wrap{
            border: 1px solid #ccc;
            margin: auto;
            position: relative;   
        }
        .item{
            width: 250px;
            border: 1px solid red;
            box-shadow: 0 0 5px #666;
            padding: 10px;
            padding-bottom: 0;
            position:absolute;
            transition: 0.5s;
        }
        .item>img{
            width: 100%;
        }
        .price,.dc{
            font-size: 20px;
            margin-left: 10px;
            margin-bottom: 5px;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
            color: rgb(45, 15, 243);
        }
    </style>
</head>
<body>
    <div class="wrap"></div>
</body>
<script>

    //做一个测试数据
    var data = {
        imgList : [
            // {
            //     name : "一号女",
            //     introduce : "爱上对方过后就哭了",
            //     src: "./img/1.jpeg"
            // }
        ],
    }



    for(var i = 0 ; i < 23; i++){
        var obj = {};
        obj.name = "女人" + (i + 1);
        obj.introduce = "爱上对方过后就去微软推哭了";
        obj.src = `./img/${i+1}.jpeg`;

        //对象信息生成完毕后,将这个obj添加至测试data的数组中
        data.imgList.push(obj);
    }

    console.log(data);

    

    //封装一个生成item 的方法
    function creatItem(data){
        //创建item
        var item = document.createElement('div');
        item.className = 'item';
        item.innerHTML = `
            <img class="img" src="${data.src}" alt="">
            <div class="price">价格:${data.name}</div>
            <div class="dc">简介:${data.introduce}</div>
        `;
       
        // return item
        //将创建好的item加入到wrap中
        wrap.appendChild(item)

    }

    var wrap = document.querySelector('.wrap');

    allImg();
    //定义一个渲染全部数据的方法
    function allImg(){
        var datas = data.imgList;
        for(var i = 0; i < datas.length; i++){
            creatItem(datas[i]);
        }
    }



    //定义一个方法计算需要拍几列
    function col(){
        //获取窗口内容区域的宽度
        var winW = document.documentElement.clientWidth;
        //获取item的宽度
        var itemW = document.getElementsByClassName('item')[0].offsetWidth;
        //计算一行中能排几个,对结果取整
        var num = parseInt(winW / itemW);

        return num;
    }
    console.log(col());


    //定义一个方法给item定位
    function posItem(){
        //定义第一行
        var item = document.getElementsByClassName('item');
        //item的宽度
        var iW = item[0].offsetWidth;
        //获取窗口内容区域的宽度
        var winW = document.documentElement.clientWidth;
        //一行中剩下多大的距离
        var mar = winW % iW;
        //计算到每一个间距是多大
        mar = mar / (col() + 1);

        var arrH = [];
        //使用for循环给所有的item定位
        for(var i = 0 ; i < item.length; i++){
            //给第一行做定位
            //i < col() 就算第一行
            if(i < col()){
                item[i].style.top = '0px';
                item[i].style.left = (iW * i + mar * (i + 1)) + 'px';
                //取出item的高度添加到arrH中
                var h = item[i].offsetHeight;
                arrH.push(h);
                console.log(arrH);
            }else{
                //其他行和第一行不一样,将新的item定位到最短的列中
                //判断最短的列是哪一列
                //Math.min.apply()  取最小值
                var min = Math.min.apply(null,arrH);  //固定写法
                console.log(min);

                var mt = 20;
                //将最小值+上下间距作为新的item的top值
                item[i].style.top = (min + mt) + 'px';

                //确定left的值
                //先确定最小的列是第几列,根据最小值查出其索引值
                var index = arrH.indexOf(min);
                item[i].style.left = (iW * index + mar * (index + 1)) + 'px';
                //更新高度数组中的数据
                //  新的列高 = 旧的高度 + 上下间距 + item高度
                arrH[index] = min + mt + item[i].offsetHeight;
            }
        }
    }


    //当页面加载完毕之后执行代码
    window.onload = function(){
        posItem()
    }

    //当页面大小发生变化,触发定位方法
    window.onresize = function(){
        //调用图片的定位方法
        posItem();
    }

    //当页面到达底部时,重新渲染
    window.onscroll = function(){
        //判断到底部
        var winH = document.documentElement.clientHeight;
        var top = document.documentElement.scrollTop;
        var sH = document.documentElement.scrollHeight;

        if(winH + top >= sH){
            //调用创建所有item的方法
            allImg();
            posItem();
        } 
    }

</script>
</html>

相关文章

  • DOM window事件

    1、window.onresize 监听浏览器窗口大小变化 当浏览器宽高发生变化,就会自动触发 2、windo...

  • js杂记

    事件 window.onscroll() 鼠标滑动事件 DOM操作 selector.classList.add(...

  • js 在模板函数上添加事件

    直接写在dom上的事件,在触发的时候会从window下寻找事件对象

  • window.addEventListener VS docu

    事件捕获,从dom结构上到下,window.addEventListener先于document.addEvent...

  • 提取行间样式

    提取事件 为元素添加事件——DOM 0级的事件绑定方式* 匿名函数: window.onload 页面加载之后完成...

  • 事件模型

    DOM事件三阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从...

  • 事件

    dom2事件-捕获阶段(window->html->body->button)-到达阶段(刚好到button上)-...

  • 何时需要使用beforeDestroy

    ①解绑自定义事件 event.$off②消除定时器③解绑自定义的DOM事件 如window.scroll等

  • 实现dom的onload事件

    我们知道,window有onload事件,只触发一次,就是全部dom加载完成后触发. 现在有这么一个需求1.dom...

  • JS 基础

    一、事件 二、对象 三、window 四、DOM 浏览器窗口可视区域大小 网页尺寸scrollHeight 网页尺...

网友评论

      本文标题:DOM window事件

      本文链接:https://www.haomeiwen.com/subject/muabyrtx.html