JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

170 篇文章 3 订阅

我们在浏览网页的时候,大部分都有一个一键回到顶部的按钮,无论是pc端还是移动端,这个功能都很常见。我在一次面试的时候,也要求手写这个功能。

首先我们新建一个空页面,把body的高度设置为3000px。这样做的目的是让浏览器出现滚动条,不然我们还得放很多的内容把页面撑起来。

body {
    height: 3000px;
}

html部分我们写两个div,一个是标志位,放在浏览器的顶部,这样我们就能很直观的知道什么时候到了浏览器顶部。另一个div就是我们返回顶部的按钮。

<div id="top">我这里是浏览器的顶部</div>
<div id="logo">返回顶部</div>

还有它们的样式

#logo {
    background-color: rgb(129, 192, 242);
    position: fixed;
    right: 20px;
    bottom: 20px;
    text-align: center;
    width: 90px;
    height: 90px;
    line-height: 90px;
    color: #fff;
    border-radius: 50%;
    display: none;
    cursor: pointer;
}
#logo:hover {
    background-color: rgb(45, 150, 233);
}
#top {
    text-align: center;
    width: 100%;
    background-color: #f3f3f3;
    padding: 20px 0;
}

在实际的应用场景中,这个按钮肯定是滚动条出现滚动事件才会出现,也就是说,一定是当前的位置不在浏览器顶部,这个按钮才有意义,所以我们暂时给它的样式设置为display:none达到一个隐藏的效果。

现在的效果是这样的。
在这里插入图片描述

下面我们开始写核心部分的JS代码。

var oDiv = document.getElementById('logo');
window.onscroll = function() {
    oDiv.style.display = 'block';
    var height = document.documentElement.scrollTop || document.body.scrollTop;
    console.log(height);
    if(height == 0) {
        oDiv.style.display = 'none';
    }
}

首先我们先给浏览器的滚动事件加相应的事件处理函数。我们核心操作的是windowonscroll属性。

如果出现滚动事件,那么我们首先要做的操作是让按钮出现,也就是通过JS把它的display属性设置为block,让它显示出来。

然后要做的一件事是获取当前窗口距离浏览器顶部的距离,因为各个浏览器都存在自己的特性,所以我们需要做兼容处理

document.documentElement.scrollTop || document.body.scrollTop基本上可以兼容所有浏览器。

如果当前窗口距离顶部是0,说明我们已经返回了顶部,那么这个按钮就需要隐藏了,依然是将它的display设置成为none

还有一个核心事件就是这个按钮的点击事件

oDiv.onclick = function() {
    var height = document.documentElement.scrollTop || document.body.scrollTop;
    var t = setInterval(() => {
        height -= 50;
        if(height > 0) {
            window.scrollTo(0,height);
        }else {
            window.scrollTo(0,0);
            clearInterval(t);
        }
    }, 10);
}

我们依然先获取一下当前窗口距离顶部的高度

想实现回到顶部的功能,window对象依然存在一个方法可以使用,那就是scrollTo方法,我们可以都调用这个方法并且传入相应参数,来操作当前窗口滚动到某个坐标。第一个参数是X轴,第二个参数是Y轴。我们这个功能主要操作它的Y轴,所以,第一个参数均传入0即可。

这样虽然可以实现功能,但是经过测试发现,它回到顶部的时间是非常快的,几乎一瞬间就回去了,这样对用户的体验非常不好。所以我们把操作window对象的scrollTo方法写入了一个setInterval定时器中,10ms调用一次,每次滚动50。

在这里插入图片描述
通过效果图可以看到,我们现在已经实现了一个商用网站中回到顶部功能的全部内容。

关于平滑滚动的功能,如果大家不喜欢自己写定时器。可以使用API实现,可以查一下MDN文档,系统为我们提供了API可以实现平滑滚动的效果。

在这里插入图片描述
也就是说,我们可以把点击事件的内容改写为

oDiv.onclick = function() {
    window.scrollTo({
        top:0,
        behavior:"smooth"
    })
}

通过测试,和我们之前写的代码效果是一样的。

大家可能会有疑问,既然有这么好用的API,为什么我还要介绍上面的定时器实现的写法呢?

其实过度使用API并不是什么好事,API不是万能的,只是别人帮我们封装了一份业务代码,来减轻我们的工作量,上面这个behavior属性的底层实现和我们之前写的定时器代码是没有区别的。

所以大家不仅要学过使用API来完成业务功能,也要在闲暇之余要自己手写实现,API可以帮我们提高工作效率,但是并不会提高我们的编码能力我在面试的时候就遇到过很多手写API功能的要求,所以,想提升自己的竞争力,要多写原生代码多实践。

有任何问题欢迎交流!
QQ:505417246
微信:18331092918
微信公众号:Code程序人生
个人博客:https://Creator12333.github.io

在这里插入图片描述

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现录制视频并兼容所有浏览器,可以使用MediaRecorder API。这个API在现代浏览器中得到支持,但在一些旧版本的浏览器中可能不支持。为了让它兼容所有浏览器,可以使用一个polyfill库,比如`@webcomponents/webcomponentsjs`。 以下是实现录制视频并兼容所有浏览器的步骤: 1. 首先,在HTML中创建一个`<video>`元素和一个`<button>`元素,用于开始和停止录制。 ``` <video id="video"></video> <button id="start">Start Recording</button> <button id="stop">Stop Recording</button> ``` 2. 在JavaScript中,使用`navigator.mediaDevices.getUserMedia()`方法获取用户的摄像头和麦克风权限,并将其流媒体传递给`<video>`元素。 ``` const video = document.getElementById('video'); navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(stream => { video.srcObject = stream; video.play(); }) .catch(error => { console.error(error); }); ``` 3. 创建一个`MediaRecorder`对象,将`<video>`元素的流媒体传递给它,并指定录制视频的格式和编码器。 ``` let mediaRecorder; const chunks = []; function startRecording() { mediaRecorder = new MediaRecorder(video.srcObject, { mimeType: 'video/webm; codecs=vp9' }); mediaRecorder.ondataavailable = event => { chunks.push(event.data); }; mediaRecorder.start(); } function stopRecording() { mediaRecorder.stop(); } ``` 4. 当用户点击“开始录制”按钮时,调用`startRecording()`函数开始录制;当用户点击“停止录制”按钮时,调用`stopRecording()`函数停止录制,并将录制的视频转换为Blob对象。 ``` document.getElementById('start').addEventListener('click', () => { startRecording(); }); document.getElementById('stop').addEventListener('click', () => { stopRecording(); const blob = new Blob(chunks, { type: 'video/webm' }); const videoURL = URL.createObjectURL(blob); // 将录制的视频显示在页面上 const recordedVideo = document.createElement('video'); recordedVideo.src = videoURL; document.body.appendChild(recordedVideo); }); ``` 5. 如果要兼容所有浏览器,可以在HTML中添加一个`<script>`标签,引入`@webcomponents/webcomponentsjs`库。 ``` <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2.4.3/bundles/webcomponents-sd-ce.js"></script> ``` 这样就可以实现录制视频并兼容所有浏览器了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CreatorRay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值