务实|内容滚动与导航标签互动关联方案

• 阅读 497

务实|内容滚动与导航标签互动关联方案

一、需求场景描述

1.先看演示效果

务实|内容滚动与导航标签互动关联方案

类似这种,当也页面左侧内容滚动的时候,需要关联激活左侧导航节点;当点击右侧导航节点时, 也会将左侧对应的内容滚动到可视区域顶部的场景,并不少见,比如知识类社区,掘金查看文章时,百度查看百科词条时,都有这种场景,而我的实际开发种也遇到此类需求。遂有此文。

2.需求分解:

1.滚动左侧内容,关联激活右侧导航节点

2.单击右侧导航节点,右侧相应的段落滚动到可视区顶部

二、关键技术点提前知

技术点1:Element.scrollIntoView()

1.scrollIntoView() 的作用

scrollIntoView()方法会滚动元素的父容器,使被调用scrollIntoView()的元素对用户可见。

2.基本用法介绍:

var el = document.getElementById("p1");

// true 可以省略效果相同
el.scrollIntoView(true)

// alignToTop:Boolean型参数。
// 如果为 true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。
// 如果为 false,元素的底端将和其所在滚动区的可视区域的底端对齐。
el.scrollIntoView(false);

// 可选,scrollIntoViewOptions:{behavior: "smooth", block: "end", inline: "nearest"}
// 可选,behavior :定义动画过渡效果,"auto"或 "smooth" 之一。默认为 "auto"。
// 可选,block:定义垂直方向的对齐,"start", "center", "end", 或 "nearest"之一。默认为 "start"。
// 可选,inline:定义水平方向的对齐,"start", "center", "end", 或 "nearest"之一。默认为 "nearest"。
el.scrollIntoView({behavior: "smooth", block: "end", inline: "nearest"});
el.scrollIntoView({block: "end"});

3.注意事项

普通的布局没问题,但是要注意,取决于其它元素的布局情况,此元素可能不会完全滚动到顶端或底端。比如整体上已经到顶部了,无法再滚动,那么该元素就不会移动到可视区的顶部。

技术点2:Element.getBoundingClientRect()

Element.getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合,就是该元素的 CSS 边框大小。返回的结果是包含完整元素的最小矩形,并且拥有left, top, right, bottom, x, y, width, 和 height这几个以像素为单位的只读属性用于描述整个边框。除了width 和 height 以外的属性是相对于视图窗口的左上角来计算的。

下面是它的打印信息示例:

console.dir(document.getElementById("p1").getBoundingClientRect())

务实|内容滚动与导航标签互动关联方案

如果是标准盒子模型,元素的尺寸等于width/height + padding + border-width的总和。如果box-sizing: border-box,元素的的尺寸等于 width/height。

三、实现思路分析

1.数据初始化处理

// 从内容数据list中,获取段落标题作为导航标题。并为导航节点增加href,以段落的id值作为href的值
this.list.map((item, i) => {
  this.activities.push({title: item.title, act: false, href: "#p" + i});
});

2.监听滚动条,以便滚动内容时,关联激活右侧导航标签

// 监听滚动条
window.addEventListener("scroll", function (e) {
  // 防抖动处理
  clearTimeout(that.timeout)
  this.timeout = setTimeout(() => {
    that.activeNavNode(e)
  }, 100)
});

3.实现点击右侧导航节点,关联左侧内容滚动到可视区顶部

// dom中定位导航
navToPosition(item, index) {
  // 激活相应的导航节点,变色
  this.active = index;
  // 根据导航节点的href信息即id信息,获取对应的元素节点,通过 scrollIntoView 滚动该元素到可视区顶部
  document.querySelector(item.href).scrollIntoView(true);
},

4.实现滚动右侧内容,关联激活左侧导航节点

// 激活左侧对应的导航条
activeNavNode(e) {
  const nodes = document.getElementsByTagName("section")
  for (let i = 0; i < nodes.length; i++) {
    let node = nodes[i];
    // 获取该元素此时相对于视口的顶部的距离,即是元素顶部距离视口屏幕上边的距离
    let nodeY = node.getBoundingClientRect().y
    // 当元素距离视口顶部的距离在 [0,200] 之间,设置激活该元素对应左侧的导航标题,这个数字可以按需定义
    // 这里关联内容和导航标签,是巧妙利用了内容在元素集合中的索引序号和导航标签中的一致
    // 即是 list 和 activities 和 nodes 中下标相等的元素,具有对应关联的关系
    if (nodeY <= 200 && nodeY >= 0) {
      this.active = Number(i)
      return
    }
  }
},

四、完整 demo 示例代码

务实|内容滚动与导航标签互动关联方案

点赞
收藏
评论区
推荐文章
前端尾随者 前端尾随者
2年前
scrollIntoView 与 scrollIntoViewIfNeeded API 介绍
本文转自:根据的描述,Element.scrollIntoView()方法让当前的元素滚动到浏览器窗口的可视区域内。而Element.scrollIntoViewIfNeeded()方法也是用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。但如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。此方法是标准的Element.scroll
想天浏览器 想天浏览器
2年前
想天浏览器登场——国内首款专注于生产力场景的浏览器
天为大家介绍一款专注于工作场景的浏览器——想天浏览器产品尚处于测试阶段。但是我迫不及待为大家介绍我的产品。这是一款无广告,专门为高效能人士打造的纯净浏览器。想天浏览器想天浏览器有什么特色?1.强大的标签分组,让你告别凌乱的标签组2.便捷易用的左侧栏,可以自由添加管理左侧应用3.简洁好用的newtab页4.内置网站导航与个人导航5.支持沉浸式标签栏,减少应用割
Python进阶者 Python进阶者
3年前
一篇文章帮助你理解跑马灯的滚动原理
走马灯效果其实就是利用标签进行图片和文字滚动,设置的样式不一样,滚动的效果就不一样,实现“走马观花”的效果。一、滚动方式1\.普通滚动Document这里是您要填的内容1.1 文字碰到左边就会停止这里是您要填的内容1.2 文字碰到右边就会停止这里是您要填的内容2.图片滚动2.1 预设滚动图片滚动到右边界,自动再
九路 九路
2年前
RecycleView滚动定位不准确问题研究
开发当中经常会遇到的产品需求,recycleview自动滚动到某一个位置。具体场景可能是如下:页面初始化之后自动自动跳转到某一个位置页面滚动之后要回到某一个位置为了展示完全需要recycleview做微小的
小尉迟 小尉迟
1年前
JetBrains PhpStorm 2023 (PHP集成开发)PhpStorm中文设置
PhpStorm是一款商业的PHP集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。如何设置中文点击菜单栏的「PhpStorm」,再点击「Preferences…」打开软件的偏好设置,点击左侧导航的「Plug
Wesley13 Wesley13
3年前
CSS 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题
一: 右侧固定宽度左侧自适应  第一种方法:左侧用marginright,右侧float:right 就可以实现。    HTML代码可以如下写:   <div      <ahref""target"_blank"我是龙恩</a   </div <div
Stella981 Stella981
3年前
Safari 快捷键
一标签和网页导航快捷键8个切换到下一个标签页–ControlTab切换到上一个标签页–ControlShiftTab向下滚动一屏–空格向上滚动一屏–Shift空格焦点移到地址栏– !(http://static.oschina.net/uploads/img/201503/2423192
Wesley13 Wesley13
3年前
RN路由
引言本来打算将ReactNavigationGuides这一章内容集中写在这篇文章内的,但由于篇幅太长,阅读的时候很费劲,所以这里将Guides这一章的内容分篇来记录。首先,我们来看看Tabnavigation!Tabnavigation移动应用中最常见的导航样式可能是基于标签的导航。它可以是屏幕底部的标题,也可以是标题下方的顶部(
燕青 燕青
1年前
支持M1、VSD Viewer for Mac(Visio绘图文件阅读器) v6.16.1激活版
专业的macOSVisio绘图查看器。在Mac上预览,导航,显示隐藏层,预览形状数据,跟随超链接,打印,保存为PDF以及共享MSVisio绘图。特征基本特征•打开任何MS的Visio®20002013年绘制VDX/VSDX文件格式•滚动,缩放和导航文档•浏
百亿补贴通用H5导航栏方案 | 京东云技术团队
在移动端页面中,由于屏幕空间有限,导航条扮演着非常重要的角色,提供了快速导航到不同页面或功能的方式。用户也通常会在导航条中寻找他们感兴趣的内容,因此导航条的曝光率较高。在这样的背景下,提供一个动态灵活的导航条,为产品赋能,变得尤其重要。
松
Lv1
夜来城外一尺雪,晓驾炭车辗冰辙。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据