Java script的webAPI中的scroll、offset、client三者相同与不同知识点

webAPI第五天网页特效

回顾昨日冒泡事件

  1. e.stopPropagation() //阻止冒泡
  2. removeEventListener() // 注销事件监听
  3. 委托:原理是用了冒泡,监听给父元素

手风琴案例

  1. 实现的效果,在一个大div内有几个小div,每个小DIV的大小一样,鼠标划过那个div,这个div就变大,其他几个div变小。鼠标离开变回原样
  2. 编程步骤:2.1 获取元素;2.2 循环绑定事件,配合css实现效果。
let lis = document.querySelectiorAll('li')
for ( let i = 0;i<lis.length;i++) {
    //鼠标移入
    lis[i].addEventListener('mouseenter',()=>[
        for (let j = 0;j<lis.length;j++) {
        lis[j].style.width = '100px'
    }
    this.style.width = '800px'
    ])
    //鼠标离开
    for(let j = 0;j<lis.length;j++){
        lis[j].style.width='240px'
    }
}

li {
    transition: all 500ms;
}

滚动事件和加载事件--知识点

1. 滚动事件:

页面滚动的时候触发的事件,事件名scroll,一般把监听给window或document,也可以是其他元素

window.addEventListener('scroll',()={
    
})
let div = document.querySelector('div')
div.addEventListener('scroll',()={
    
})

2. 加载事件:

加载外部资源完毕时触发的事件,事件名:load

let img = document.querySelector('img')
img.addEventListener('load',()={
})
//或 window.addEventListener('load',()=>{})之类

2.1 特别加载事件:

DOMContentLoaded, DOM树加载完毕事件

document.addEventListener('DOMContentLoaded',()={})

元素大小和位置--知识点

1.scroll家族,可读写

获取元素内容总宽和高,返回不带单位

let div = document.querySelector('div')
div.scrollWidth //内容的宽度 
div.scrollHeight // 内容的高度

1.1 获取位置:

元素往左和往下被卷去看不到的距离(重点)

window.scrollTop //被卷去的高度,也是页面往下走的高度
window.scrollLeft // 被卷去的左侧
window.addEventListener('scroll',()=>{
    console.log(document.documentElement.scrollTop)  //document.documentElement 就是html标签
})

let div = document.querySelector('div')
div.addElementlistener('click',()=>{
    document.documentElement.scrollTop = 500 //可以给值,指定滚动到什么位置 ,重点!没有单位!
})

2.offset家族

得到宽高和获取位置

2.1 得到元素的宽和高

仅仅是盒子模型盒子的大小 (内容+padding+border)

let div = document.querySelector('div')
console.log(div.offsetWidth)// div的宽度
console.log(div.offsetHeight) // div的高度

2.2 获取位置

获取元素距离定位父级元素的左、上距离,父元素没定位,页面左上角,只读。

let div = document.querySelector('div')
console.log(div.offsetTop)// 高度距离 ,以左上角
console.log(div.offsetHeight) //左边距,以左上角

电梯导航案例

1681955566410.png

点击小导航,当前添加active ,其余移除activ,得到对应内容的offsetTOP值,滚动到相应位置

let items = document.querySelectorAll('.item')
let contents = document.querySelectorAll('content')
for (let i =0;i<items.length;i++) {
    items[i].addEventListener('click',()=>{
        document.querySelector('.aside .active').classList.remove('active')
        this.classList.add('active')
        document.documentElement.scrollTop = contents[i].offsetTop
    })
}

3.client家族

3.1得到可视区域的大小

let div = document.querySelector('div')
console.log(div.clientWidth) //仅仅是可是区域,不包含滚动条,边框等,包含padding
console.log(div.clientHeight) //仅仅是可是区域,不包含滚动条,边框等,包含padding
window.addEventListener('resize',function() {          //resize事件,窗口大小改变
    console.log(document.documentElement.clientWidth)
})

3.2 得到可视区域边框的宽度

clientLeft,clientTop 得到就是盒模型border的上宽度与左宽度

综合案例轮播图

1681959336323.png

思路:①分析html与css结构②根据需求分解为几个javascript模块③写各个模块,测试模块

需求:

  1. 鼠标移入小图标,小图标高亮,下边绿色,其他图片遮罩,无边框高亮
  2. 当鼠标移入小图片,显示上面的大图片,上面的大图片有淡入淡出效果 opacity
  3. 自动更改图片描述信息
  4. 点击箭头按钮,播放上一张或下一张 index= index % lis.length
  5. 定时器自动播放
  6. 鼠标经过停止计时器,鼠标离开继续定时器 clearInterval(定时器id)

注意事项:多次复用的代码需要封装函数

<!DOCTYPE html>
<html lang="en">

<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>QQ音乐轮播图</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .wrapper {
            width: 700px;
            margin: auto;
        }

        li {
            list-style: none;
        }

        ul.indicator {
            width: 700px;
            height: 80px;
            background-color: #000;
            display: flex;
            justify-content: space-evenly;
            padding: 10px 0;
        }

        .indicator li {
            display: block;
            position: relative;
            display: inline-block;
            width: 60px;
            height: 60px;
        }

        .indicator li img {
            width: 60px;
            height: 60px;
        }

        .container {
            position: relative;
        }

        .extra {
            position: absolute;
            bottom: 0;
            width: 700px;
            height: 53px;
            background-color: rgba(0, 0, 0, 0.8);

        }

        .extra p {
            font-size: 28px;
            color: #98e404;
            font-weight: 500;
            display: inline-block;
            padding-left: 20px;
            line-height: 53px;
        }

        .extra a {
            margin-top: 12px;
            float: right;
            line-height: 53px;
            width: 30px;
            height: 30px;
            background-image: url(./assets/icon_focus_switch.png);
            background-repeat: no-repeat;
        }

        .extra .prev {

            background-position: 0 0;
            margin-right: 10px;
        }

        .extra .next {
            margin-right: 20px;
            background-position: -60px 0;
        }

        .bigPicturArea {
            height: 320px;
        }

        li .mask {
            position: absolute;
            background-color: rgba(0, 0, 0, 0.4);
            width: 60px;
            height: 60px;
            top: 0;
            left: 0;
        }

        .bigPicturArea {
            position: relative;
        }

        .bigPicturArea li {
            position: absolute;
            left: 0;
            top: 0;
            opacity: 0;
            transition: all .3s;
        }

        .bigPicturArea li.active {
            opacity: 1;
        }

        li .mask.active {
            display: none;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <div class="container">
            <ul class="bigPicturArea">
                <li class='active'><img src="./assets/b_01.jpg" alt="" class="bigPicture active"></li>
                <li><img src="./assets/b_02.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_03.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_04.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_05.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_06.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_07.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_08.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_09.jpg" alt="" class="bigPicture"></li>
                <li><img src="./assets/b_10.jpg" alt="" class="bigPicture"></li>
            </ul>
            <div class="extra">
                <p class="descriptionOfGoods">这是第1张图片的说明</p>
                <a class="next" href="#"></a>
                <a class="prev" href="#"></a>
            </div>
        </div>
        <div class="indicaterContainer">
            <ul class="indicator">
                <li><img src="./assets/s_01.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_02.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_03.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_04.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_05.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_06.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_07.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_08.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_09.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
                <li><img src="./assets/s_10.jpg" alt="./assets/b_02.jpg"><span class="mask"></span>
                    <span class="border"></span>
                </li>
            </ul>
        </div>
    </div>
    <script>
        let lis = document.querySelectorAll('.indicator li')
        let bigPictureLis = document.querySelectorAll('.bigPicturArea li')
        let spans = document.querySelectorAll('.indicator .mask')
        let descriptions = document.querySelector('p.descriptionOfGoods')
        let main = document.querySelector('.wrapper')


        //点击哪个导航图标就展示相应的图片
        let index = 0
        for (let i = 0; i < lis.length; i++) {
            lis[i].addEventListener('mouseenter', function () {
                for (let j = 0; j < lis.length; j++) {
                    bigPictureLis[j].classList.remove('active')
                    spans[j].classList.remove('active')
                }
                bigPictureLis[i].classList.add('active')
                spans[i].classList.add('active')
                descriptions.innerText = `这是第${i + 1}张图片描述`

                index = i

            })
        }

        //左右箭头动作
        let prev = document.querySelector('.extra .prev')
        let next = document.querySelector('.extra .next')
        next.addEventListener('click', () => {
            index++
            index = index % lis.length
            switchPicture()
        })
        prev.addEventListener('click', () => {
            index--
            if (index < 0) {
                index = lis.length - 1
            }
            switchPicture()
        })

        let switchPicture = function () {
            for (let j = 0; j < lis.length; j++) {
                bigPictureLis[j].classList.remove('active')
                spans[j].classList.remove('active')
            }
            bigPictureLis[index].classList.add('active')
            spans[index].classList.add('active')
            descriptions.innerText = `这是第${index + 1}张图片描述`
        }
        let timer = setInterval(() => {
            next.click()
        }, 1000);

        main.addEventListener('mouseenter', function () {
            clearInterval(timer)
        })

        main.addEventListener('mouseleave', function () {
            timer = setInterval(function () {
                // 自动调用右侧按钮的点击事件
                next.click()
            }, 1000)
        })

    </script>
</body>

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

推荐阅读更多精彩内容