dom实例

目录

    ##拖动效果##
    ##滚动对象的位置##
    ##window的滚动##
    ##指定滚动条滚动到某一个位置##
    ##固定导航##
    ##返回顶部##
    ##触底加载更多##
    ##二级联动##
    ##三级联动##

拖动效果

        <div class="box"></div>
        var box = document.querySelector('.box')
        // 1:在box上按下:长按
        box.onmousedown = function (e) {
            // 获取鼠标点击位置 在元素上的坐标
            var x = e.offsetX
            var y = e.offsetY
            // 2:浏览器窗口中移动
            window.onmousemove = function (e) {
                console.log('11111111');
                // 求元素移动的位移
                var movex = e.clientX - x
                var movey = e.clientY - y
                // 让元素动起来
                box.style.left = movex + 'px'
                box.style.top = movey + 'px'
            }
        }
        // 3:松开鼠标
        box.onmouseup = function () {
            window.onmousemove = null
        }
        // 预留bug:元素移动的范围不能超过浏览器

滚动对象的位置

        <div class="content"></div>
        var content = document.querySelector('.content')
        for (let i = 0; i < 100; i++) {
            var h1 = document.createElement('h1')
            h1.innerHTML = '滚动位置测试' + i
            content.appendChild(h1)

        }
        // 元素:滚动条 高度 内容高度
        // 内容高度 =滚动条滚动最大高度+高度
        // el.scrollHeight = el.scrollTop(最大) +height
        window.onscroll = function (e) {
            var ev = e || window.event
            var page=document.documentElement||document.body
            console.log(page.scrollTop);//滚动条滚动的高度 
            console.log(page.scrollHeight);//内容高度
            console.log(getComputedStyle(box,null).height);//元素高度
        }

window的滚动

        <div class="content"></div>
        var content = document.querySelector('.content');
        for (let i = 0; i < 100; i++) {
            var h1 = document.createElement('h1');
            h1.innerHTML = '滚动位置测试' + i;
            content.appendChild(h1)
        }
        window.onscroll = function(){
            console.log(scrollY);
        }

指定滚动条滚动到某一个位置

    <button id="btn">指定滚动位置</button>
    <div class="content"></div>
        var content = document.querySelector('.content');
        for (let i = 0; i < 100; i++) {
            var h1 = document.createElement('h1');
            h1.innerHTML = '滚动位置测试' + i;
            content.appendChild(h1)
        }
        window.onscroll = function(){
            console.log(scrollY);
        }

        btn.onclick = function(){
            /**
             * scrollTo(x,y) scrollBy(x,y)
             * 作用:指定滚动条滚动到某一个位置
             * 参一:x  控制横向滚动条
             * 参二:y  控制纵向滚动条
             */
            // scrollTo(0,300)
            scrollBy(0,300)
        }

        // 常见效果:返回顶部

固定导航

    <div class="navbar"></div>
    <nav>
        <ul>
            <li><a href="#">导航001</a></li>
            <li><a href="#">导航002</a></li>
            <li><a href="#">导航003</a></li>
            <li><a href="#">导航004</a></li>
            <li><a href="#">导航005</a></li>
        </ul>
    </nav>
    <div class="content"></div>
        var content = document.querySelector('.content');
        for (let i = 0; i < 100; i++) {
            var h1 = document.createElement('h1');
            h1.innerHTML = '滚动位置测试' + i;
            content.appendChild(h1)
        }

        // 思路:
        // 当滚动条滚动太某一个位置时候,动态更改固定定位的top

        var nav = document.querySelector('nav');
        var navBar = document.querySelector('.navbar');
        // 作用控制动画执行的
        var flag = true;

        // 1:监听滚动台哦
        window.onscroll = function () {

            // 2:获取滚动滚动位置
            var y = document.documentElement.scrollTop || document.body.scrollTop;
            // 3:找到 滚动到哪里,nav固定定位
            var isHeight = parseFloat(getComputedStyle(navBar, null).height || navBar.currentStyle.height);
            if (y > isHeight) {
                console.log('11111111111');
                // 设置 nav固定顶部
                nav.style.position = 'fixed';
                nav.style.top = 0 + 'px';
                var top = -80;
                // 当滚动条大于300 动画出现导航条只能走一次
                if (flag) {
                    flag = false;
                    var timer = setInterval(function () {
                        top = top + 1;
                        nav.style.top = top + 'px';
                        if (top >= 0) {
                            nav.style.top = 0 + 'px';
                            clearInterval(timer);
                        }
                    }, 16.7)
                }

                // bug 滚动定时器运行次数太多了
                // console.log(timer);

            }else{
                nav.style.position = '';
                nav.style.top = '';
                flag = true;
            }
        }

返回顶部

    <div class="content"></div>
    <button >返回顶部</button>
        var content = document.querySelector('.content');
        var btn = document.querySelector("button");
        btn.style.display = 'none'
        for(var i = 0;i<100;i++){
            var h1 = document.createElement('h1');
            h1.innerHTML = '文本内容' + i;
            content.appendChild(h1)
        }
        var  Y = 0; // 记录滚动条滚动位置
        // 1:如何实现监听滚动条的位置
        window.onscroll = function(e){
            // console.log(scrollY);
            Y = scrollY
            if(scrollY>400){
                // alert('位置到了')
                btn.style.display = 'block'
            }else{
                btn.style.display = 'none'
            }
        }
        btn.onclick = function(){
            // 如何实现指定滚动条滚动到哪一个位置 
            // 如何实现过度返回顶部?
            console.log(Y);
            // 如何随时获取滚动条,当前滚动的高度
            var move = Y;;
           var timer = setInterval(function(){
                move = move - 10
                if(move<=0){
                    move = 0;
                    scrollTo(0,move);//参数为x方向和y方向
                    clearInterval(timer)
                }
                console.log(move);
                scrollTo(0,move);
            },1)
        }
<!-- 
    1: 当滚动条滚动到某个位置时候;显示返回顶部阿牛
    2:小于该位置时候按钮隐藏
    3:点击【返回顶部】按钮;滚动条滚动的位置为0
    4: 过度返回顶部
 -->
 <!-- 
     如何设置初始化样式

     返回顶部录屏时间 15-->

触底加载更多

    <div class="list">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <script src="./data.js"></script>
        // 触底加载更多
        // 1: 查找滚动到底的条件
        // --> 滚动条滚动高度 + 窗口高度 > 页面高度  重点
        /* 
            console.log(scrollY);//已经滚动的高度
            console.log(innerHeight);//浏览器内容显示部分高度(导航栏到浏览器底部)
            console.log(document.documentElement.scrollHeight);//浏览器所有内容高度
            //以上三者关系:scrollY+innerHeight=document.documentElement.scrollHeight 
            
        */
        // 2: 到底后更新数据  (1s后更新数据)
        // 3:更新页面
        // ----> bug:没等数据更新结束,出现多次触底问题。
        // ----> 预期效果:数据更新完毕;页面更具数据渲染完毕;才能出现再次触底现象
        // ----> 防抖节流 
        var list = data;
        var items = document.querySelectorAll('.item');
        for (var i = 0; i < items.length; i++) {
            items[i].innerHTML = list[i];
        }

        var flag = true; // true 表示允许执行到底 false 禁止执行到底
        // 1:监听滚动条位置
        window.addEventListener('scroll', function () {
            // 是否到底的条件表达式
            var isSole = scrollY + innerHeight >= document.documentElement.scrollHeight - 10;
            // console.log(isSole);
            if (isSole && flag) { // 到底了
                console.log('到底了');
                flag = false
                setTimeout(function () {
                    var data = [
                        'dfadsfasf', 'fasdfas', 'fasfdsdf', 'fasdfasd', 'fasdere', 'fasdfsa'
                    ]
                    // 到底后;更新 list 数组
                    list = list.concat(data)
                    console.log(list);
                    // 根据list 实现渲染页面
                    render(list)

                    // 页面渲染结束后;释放开关
                    flag = true;

                }, 1500)


            }
        })

        // 根据list数组长度渲染item
        function render(data) {
            var list_dom = document.querySelector(".list");
            // 清空 list_dom;
            var str = ''
            for (var i = 0; i < data.length; i++) {
                str = str + `
                <div class="item">${data[i]}</div>
                `
            }
            list_dom.innerHTML = str;
        }

二级联动

<select name="" id="province"></select>
    <select name="" id="city"></select>
    <!-- 
        如何实现联动效果

     -->
    <script src="./area.js"></script>
        //  初始化省
        //  1: 将省数据渲染到 页面中
        var pro = document.querySelector('#province')
        //  console.log(area);
        //  for(let k in area){
        //      var option = document.createElement("option")
        //      option.innerHTML = k;
        //      option.value = k
        //      pro.appendChild(option)
        //  }

        renderOpt('#province', area)
        //  pro.options[3].selected= true
        //  初始化市;
        // 1:获取当前初始化省?
        // 如何获取 select 中选中了是哪个option

        // for(let i = 0;i<pro.options.length;i++){
        //     if(pro.options[i].selected){ // 表示呗选中的 option
        //         // 获取选中的option中value值
        //         var provice_init = pro.options[i].value;
        //         console.log(provice_init);
        //         break;
        //     }
        // }
        // console.log(provice_init);

        var seletOpt = filterOptSelted(pro);
        var provice_init = seletOpt.value;

        // 2:根据当前的省,获取市
        var city_data = area[provice_init]
        console.log(city_data[0]);

        // 3:将获取到市数据渲染到页面上
        // var city_dom = document.querySelector("#city");
        // for(let k in city_data[0]){
        //     var option = document.createElement("option")
        //      option.innerHTML = k;
        //      option.value = k
        //      city_dom.appendChild(option)
        // }
        renderOpt('#city', city_data[0])

        // 2:用户选择的发生变化时候,市也变化
        pro.addEventListener('change', function (e) {
            console.log('change run');
            var opt = filterOptSelted(pro);
            var opt_val = opt.value;
            //  根据当前选中的省更新市数据
            var city_data = area[opt_val];
            //  重新渲染市的 select
            renderOpt('#city',city_data[0])

        })

        // 根据数据;往某个select元素中添加option
        // 参一:id选择器 stirng 
        // 参二:渲染的数据
        // 返回值:无
        function renderOpt(str, data) {
            var selet = document.querySelector(str);
            // 先清空 select; (解决bug:累加option)
            selet.innerHTML = '';
            for (var k in data) {
                var option = document.createElement('option');
                option.innerHTML = k;
                option.value = k;
                selet.appendChild(option);
            }
        }

        // 过滤某个select 选中了哪一个option元素
        // 参一:selet 元素 
        // 返回值:被选中的option
        function filterOptSelted(selet) {
            for (let i = 0; i < selet.options.length; i++) {
                if (selet.options[i].selected) {
                    // 返回 选中的option元素
                    return pro.options[i]
                }
            }
        }
    <!-- 
        直播注意事项:
        1:将代码片段封装为函数,新建文件重新写
     -->

三级联动

    <select name="" id="province"> </select>
    <select name="" id="city"></select>
    <select name="" id="district"></select>
    <script src="./area.js"></script>
        /**
         * renderOpt() 
         * 作用:根据数据,给某个select 渲染option
         * 参一:select元素  类型:elementObjeck
         * 参二:数据 obj
         * 返回值:无
         */
        function renderOpt(select, data) {
            select.innerHTML = ''; // 先清空select
            if (data.constructor === Object) {//判断类型
                for (var k in data) {  // 添加option
                    var option = document.createElement("option"); // 创建一个option
                    option.innerHTML = k; // 给option添加文本内容
                    option.value = k;   // 给optiont添加value值
                    select.appendChild(option) // 将创建option添加到 select上
                }
            } else if (Array.isArray(data)) {//判断类型
                for (var i in data) {
                    // data[i]
                    for (var k in data[i]) {
                        var option = document.createElement("option");
                        option.innerHTML = k; 
                        option.value = k;
                        select.appendChild(option)
                    }
                }
            }

        }

        /**
         * filterOptSelected()
         * 作用:过滤某个select中选中的option
         * 参一:select元素  类型 elementObject
         * 返回值:选中的option元素 类型:elementObject
         */
        function filterOptSelected(select) {
            var opts = select.options;   // 获取select元素中所有的option集合
            for (var i = 0; i < opts.length; i++) { // 遍历option,为了检查每个option
                var isSeleted = opts[i].selected; // 获取option的selted值,true 选中  false 没选中
                if (isSeleted) { // 当前被选中的option
                    return opts[i] // 将选中的option元素;输出到函数外部
                }
            }
        }
        var province_dom = document.querySelector("#province");
        // 第一步骤:初始化
        // 1.1初始化省数据渲染
        renderOpt(province_dom, area);

        // 1.2初始化市
        // 1.21 获取当前选中是哪个省
        var pro_opt = filterOptSelected(province_dom);
        console.log(pro_opt);
        console.log(pro_opt.value);
        // 1.22 根据省获取获取市的数据
        var city_data = area[pro_opt.value][0]
        console.log(city_data);

        // 1.23 根据市数据渲染.渲染市
        var city_dom = document.querySelector("#city")
        renderOpt(city_dom, city_data)

        // 1.3初始化区
        // 1.31 获取选中那个市
        var city_opt = filterOptSelected(city_dom)
        console.log(city_opt);
        console.log(city_opt.value);
        // 1.32 根据市,获取区数据
        var district_data = city_data[city_opt.value]
        console.log(district_data);
        // 1.33 根据区数据渲染区
        var district_dom = document.querySelector("#district")
        // ???
        renderOpt(district_dom, district_data)

        // 第二步:当用户更新,省或市

        // 2.1 监听用户是否更改了省
        province_dom.addEventListener('change',function(){
            console.log('province chang run');
            // 2.11 获取更新后的option
            var pro_opt= filterOptSelected(province_dom)
            // 2.12 根据选择的省更新市数据
            city_data = area[pro_opt.value][0];
            console.log(city_data);
            // 2.13 根据市数据更新市
            renderOpt(city_dom,city_data);
            // 2.14 获取当前更新的市,得到获取区数据的索引、
            var city_opt = filterOptSelected(city_dom);
            console.log(city_opt.value);
            // 2.15 根据市索引获取区数据
            district_data = city_data[city_opt.value]
            console.log(district_data);
            // 2.16 根据区数据,渲染去
            renderOpt(district_dom,district_data)
        })

        // 第三步:用户更新市时候
        // 3.1 监听用户更新市
        city_dom.addEventListener('change',function(){
            // console.log('city change run');
            // 3.11 获取更新的是哪个市
            var city_opt = filterOptSelected(city_dom);
            console.log(city_opt.value);
            // 3.12 根据市,获取区数据
            console.log(city_data);
            var district_data  = city_data[city_opt.value]
            console.log(district_data);
            // 3.13 根据区数据,更新区视图
            renderOpt(district_dom,district_data)
        })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值