前端开发入门到实战:CSS 页面滚动平滑

1. 这些年自己步子慢了

这些年自己在无障碍访问,SVG和Canvas这些偏小众的领域花了大量的学习精力,以至于很多前端新特性,新技术没能及时关注和了解,有CSS3领域的新属性,有JS领域的新API,包括全新的ES6/ES7语法等,相比以前的学习,步子确实慢了。比方说,本文要介绍的平滑滚动,无论是CSS还是JS,现代浏览器都提供了原生的属性或方法支持,而且差不多已经有一年时间,而我最近才知道,和数年前实时关注新技术的自己形成了明显的对比。

不过随着SVG和Canvas的基础越来越牢固,细节越来越深入,我的学习重心已经开始往广度方向转移,慢慢拾起那些遗落的麦穗。

2. 从干巴巴到又湿又滑

假设页面中有下面这一段HTML:


<a href="#" rel="internal">返回顶部</a>

帮我们点击“返回顶部”这个文字链接的时候,页面就会“唰”地一声瞬间定位到浏览器顶部,速度之快,升势之猛,以至于你没有任何反应,就像暴风雨般的爱情,让你猝不及防,脑中不断回想:“我在哪里?我是谁?我刚刚做了什么?”

所有这些反应的产生,归根结底在于我们这个滚动效果实在是太干巴巴了,机械生硬没有灵性不解风情。

人是有情感的动物,既然我们做的网页是给人用的,那自然充满情感,不要那么干巴巴,让滚动效果又湿又滑,用户体验就会好。

光滑如雪的肌肤,饱满湿润的红唇,是不是总能让人心动不已?如果我们的交互效果也能做得如此,也同样也能让用户心动。

浏览器似乎也意识到这一点,从去年年底开始,已经开始支持浏览器的原生平滑滚动定位,CSS?scroll-behavior属性和JS?scrollIntoView()方法都可以。

二、CSS scroll-behavior与平滑滚动

scroll-behavior:smooth写在滚动容器元素上,可以让容器(非鼠标手势触发)的滚动变得平滑。

初始值是‘auto‘

简单更实际的用途

其实scroll-behavior的使用没有那么多花头,你就记住这么一句话——

凡是需要滚动的地方都加一句scroll-behavior:smooth就好了!

你别管他用不用得到,也不用管浏览器兼容性如何,你都加上。这就像一个不要钱的免费抽奖,没有中奖,没关系,又没什么损失,中奖了自然好,锦上添花!scrol-behavior:smooth就是这种尿性。

举个例子,在PC浏览器中,网页默认滚动是在&lt;html&gt;标签上的,移动端大多数在&lt;body&gt;标签上,于是,我加上这么一句:

html, body { scroll-behavior:smooth; }

此时,点击下面这个“返回顶部”链接,就会平滑滚动到顶部(真·实时效果,可以点击尝试)。

HTML代码如下:

<a href="#">返回顶部</a>


从这一点来看,业界浏览器的CSS reset都可以加上这么一条规则:

html, body { scroll-behavior:smooth; }

三、JS scrollIntoView与平滑滚动

DOM元素的scrollIntoView()方法是一个IE6浏览器也支持的原生JS API,可以让元素进入视区,通过触发滚动容器的定位实现。

随着Chrome和Firefox浏览器开始支持CSS?scroll-behavior属性,顺便对,scrollIntoView()方法进行了升级,使支持更多参数,其中一个参数就是可以使滚动平滑。

语法如下:

target.scrollIntoView({
    behavior: "smooth"
});

我们随便打开一个有链接的页面,把首个链接滚动到屏幕外,然后控制台输入类似下面代码,我们就可以看到页面平滑滚动定位了:

document.links[0].scrollIntoView({
    behavior: "smooth"
});

如下视频截屏:

其它:

  • scrollIntoView()升级后的方法,除了支持‘behavior‘,还有‘block‘‘inline‘等参数,有兴趣可以参阅MDN相关文档。
  • 如果我们的网页已经通过CSS设置了scroll-behavior:smooth声明,则我们直接执行target.scrollIntoView()方法就会有平滑滚动,无需再额外设置behavior参数。例如,如果你是在鑫空间原站浏览的此文章,打开控制台,执行下面代码,就可以看到平滑滚动效果了:
document.forms[0].scrollIntoView();

四、JS平滑滚动向下兼容处理

JS实现平滑滚动并不难,jQuery中animate()方法:

scrollContainer.animate({
    scrollTop: 0
});

或者使用requestAnimationFrame API这类原生JS也能实现。例如下面这个我速写的个方法:


/**
 @description 页面垂直平滑滚动到指定滚动高度
 @author zhangxinxu(.com)
*/
var scrollSmoothTo = function (position) {
    if (!window.requestAnimationFrame) {
        window.requestAnimationFrame = function(callback, element) {
            return setTimeout(callback, 17);
        };
    }
    // 当前滚动高度
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    // 滚动step方法
    var step = function () {
        // 距离目标滚动距离
        var distance = position - scrollTop;
        // 目标滚动位置
        scrollTop = scrollTop + distance / 5;
        if (Math.abs(distance) < 1) {
            window.scrollTo(0, position);
        } else {
            window.scrollTo(0, scrollTop);
            requestAnimationFrame(step);
        }
    };
    step();
};

使用的是自己私藏缓动动画JS小算法,滚动先快后慢。

使用如下,例如,我们希望网页平滑滚动到顶部,直接:

scrollSmoothTo(0);

就可以了。



难的是如何支持平滑滚动的浏览器原生处理,不支持的浏览器还是使用老的JS方法处理。

我是这么处理的JS如下判断:

if (typeof window.getComputedStyle(document.body).scrollBehavior == ‘undefined‘) {
   // 传统的JS平滑滚动处理代码...
}

这样就可以无缝对接了。

五、结语结尾语结束语

没有个人特质的文章就像没有灵魂的机器一样。怀念张含韵的照片,家里领导不放心,怕侵犯版权找上门,都给下掉了,现在的那些美女照片,就像白开水一样,索然无味……

我琢磨着要换个角色或者标签,例如……一匹马!

这里推荐一下我的前端学习交流圈:767273102 ,里面都是学习前端的从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴。2019最新技术,与企业需求同步。好友都在里面学习交流,每天都会有大牛定时讲解前端技术!

学习前端,我们是认真的

原文地址:https://blog.51cto.com/14284898/2404478

时间: 2024-11-05 17:31:07

前端开发入门到实战:CSS 页面滚动平滑的相关文章

前端开发入门到实战:计算一个页面内每个模块的曝光时间(停留时间)

产品希望看到投放出去的活动页,用户对其页面内的什么信息比较感兴趣,对什么信息完全不感兴趣.=> 计算页面内每模块的停留时间 第一次听到这个需求,我的大脑开始疯狂运转,然后想到了plan 1, plan 2, plan3...中间还有很多失败想法我已经忘记了,这里方案三是我最终采用的方法. 方案一:根据页面dom将页面分模块 var bodyChildrenLists = $('body').children() var bodyChildDomLsit = [] var initHeight =

前端开发入门到实战:通过 rem 和 vw 实现页面等比例缩放自适应

一.rem 和 vw 简介 1. rem rem?是相对长度单位,是指相对于根元素(即html元素)font-size(字号大小)的倍数. 浏览器支持:Caniuse 示例 若根元素?font-size?为 12px html { font-size: 12px; } h1 { font-size: 2rem; /* 2 × 12px = 24px */ } p { font-size: 1.5rem; /* 1.5 × 12px = 18px */ } div { width: 10rem;

前端开发入门到实战:CSS中字体单位:px、em、rem和%

对于绘图和印刷而言,"单位"相当重要,然而在网页排版里,单位也是同样具有重要性,在CSS3普及以来,更支持了一些方便好用的单位(px.em.rem-等),这篇文章将整理这些常用的CSS单位,也帮助自己未来在使用上能更加得心应手. "网页"和"印刷"的单位若要把单位做区隔,最简单可以分为"网页"和"印刷"两大类,通常对于CSS来说只会应用到网页的样式,毕竟真正要做印刷,还是会倾向透过排版软件来进行设计. 网页

前端开发入门到实战:css实现修改浏览器自动填充表单的默认样式

当表单中存在input[password]的时候,采用submit方式提交.就会触发浏览器自动填充表单.比如chrome自动填充后,淡×××输入框代替了背景样式,看起来有些怪异. ?那么如何通过css实现取消浏览器自动填充表单的默认样式呢? 解决方法一: 当input文本框是纯色背景的,可以对input:-webkit-autofill使用足够大的纯色内阴影来覆盖input输入框的×××背景:如: input:-webkit-autofill { -webkit-box-shadow: 0 0

前端开发入门到实战:css实现div垂直水平居中的2种常用方法

方法一: 利用vertical-align:middle进行垂直方向上的居中对齐,此方法需要满足的条件: 设置父元素的行高line-height等于父元素height的高度 子元素必须是行内块级元素display:inline-block; 子元素设置vertical-align:middle 此方法在开发中不能右浮动(不能靠右边) 下方是完整代码,可以新建一个HTML文件进行测试(绿色的盒子): <html> <head> <title>导航条</title&g

前端开发入门到实战:css 浮动布局,清除浮动

浮动的特性: (1)浮动元素有左浮动(float:left)和右浮动(float:right)两种 (2)浮动的元素会向左或向右浮动,碰到父元素边界.其他元素才停下来 (3)相邻浮动的块元素可以并在一起,超出父级宽度就换行 (4)浮动让行内元素或块元素自动转化为行内块元素(此时不会有行内块元素间隙问题) (5)浮动元素后面没有浮动的元素会占据浮动元素的位置,没有浮动的元素内的文字会避开浮动的元素,开成文字绕图的效果 (6)父元素如果没有设置尺寸(一般是高度不设置),父元素内整体浮动的元素无法撑开

前端开发入门到实战:css 定位布局

文档流: 文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列.块元素占一行,行内元素在一行之内从左到在排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置. 关于定位: 可以使用css的position属性来设置元素的定位类型,position设置项如下: (1)relative?生成相对定位元素,元素所占据的文档流的位置保留,元素本身相对自身原位置进行偏移. (2)absolute?生成绝对定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相

前端开发入门到实战:把HTML转成PDF的4个方案及实现

在本文中,我将展示如何使用 Node.js.Puppeteer.headless Chrome 和 Docker 从样式复杂的 React 页面生成 PDF 文档. 背景:几个月前,一个客户要求我们开发一个功能,用户可以得到 PDF 格式的 React 页面内容.该页面基本上是患者病例的报告和数据可视化结果,其中包含许多 SVG.另外还有一些特殊的请求来操纵布局,并对 HTML 元素进行一些重新排列.因此与原始的 React 页面相比,PDF 中应该有不同的样式和额外的内容. 由于这个任务比用简

前端开发入门到实战:HTML5新增和废弃的标签

一.废弃的标签 以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,矛盾的是老浏览器对新标签的支持度又不够,视项目的受众对象而定了. 1.能用CSS代替的元素 这些元素包含basefont.big.center.font.s.strike.tt.u.这些元素纯粹是为页面展示用的,表现的内容应该由CSS完成. 2.frame框架 这些元素包含frameset.frame.noframes.HTML5中不支持frame框架,只支