首页
学习
活动
专区
圈层
工具
发布

React项目中如何实现一个简单的锚点目录定位

前言 锚点目录定位功能在长页面和文档类网站中非常常见,它可以让用户快速定位到页面中的某个章节 如何在React中实现锚点定位和平滑滚动 目录自动高亮的实现思路 处理顶部导航遮挡锚点的解决方案 服务端渲染下的实现方案...对于锚点定位来说,主要涉及这两个部分: 设置锚点,为页面中的某个组件添加id属性 点击链接,跳转到指定锚点处 例如: // 锚点组件 function AnchorComponent() {...但是在Next.js的SSR环境下就会有问题: 点击目录链接时,页面不会滚动。 这是因为在服务端,我们无法获取组件的ref,所以锚点元素不存在,自然无法定位。 滚动页面时,目录高亮也失效。...服务端渲染的静态HTML中,并没有绑定滚动事件,所以无法自动高亮。 预取数据 首先,我们需要解决点击目录链接的问题。 既然服务端无法获取组件ref,那就需要在客户端去获取元素位置。...简单来说就是: 在服务端渲染时,读取路由参数,提前计算高亮状态 将高亮数据注入到响应中 客户端拿到注水的数据后渲染,不会出现高亮错位 实现步骤: 1.服务端获取参数和数据 // 在getServerSideProps

3K20

图解浏览器的各种距离

因为这里要介绍一个 react 事件的坑点: react 事件是合成事件,所以它少了一些原生事件的属性,比如这里的 offsetY,也就是点击的位置距离触发事件的元素顶部的距离。...react-use 提供的 useMouse 的 hook 就解决了这个问题: 它是用 e.pageY 减去 getBoundingClientRect().top 减去 window.pageYOffset...这里有涉及到了几个新的属性。...element.getBoundingClientRect:拿到 width、height、top、left 属性,其中 top、left 是元素距离可视区域的距离,width、height 绝大多数情况下等同...offsetHeight、offsetWidth,但旋转之后就不一样了,拿到的是包围盒的宽高 其中,还要注意 react 的合成事件没有 offsetY 属性,可以自己算,react-use 的 useMouse

61910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    这是一篇很好的互动式文章,Framer Motion 布局动画

    同样,改变元素的justify-content属性也是一种布局变化,因为它导致该元素的子元素改变位置。 不过,像scale属性的变化并不是布局的改变,因为它的变化不影响页面上的其他元素。...例如,不能对justify-content的变化制作动画,因为justify-content不是一个可动画的属性。 性能问题。...= (props) => { const ref = React.useRef(); React.useLayoutEffect(() => { const { x, y } = ref.current.getBoundingClientRect...碰巧是提,我们用来测量正方形的.getBoundingClientRect()方法也刚好返回元素的 width 和 height: const { width, height } = squareRef.current.getBoundingClientRect...换句话说,这个错误的发生是因为测量的距离和变换原点之间的差异:getBoundingClientRect()返回元素的左上角,而变换原点默认是在元素的中心。

    3.6K20

    useLayoutEffect的秘密

    为了减少阻塞渲染对页面加载速度的影响,可以采取一些优化策略,比如: 「异步加载资源」:使用 async 或 defer 属性加载 JavaScript 文件,让它们不会阻塞页面渲染。...为此,我们需要知道容器的宽度以及每个项目的尺寸。并且,我们无法「未卜先知」其项目中文案信息,也就无法提前做任何工作,例如通过计算每个项目的文本长度来计算剩余空间。...既然,我们无法未雨绸缪,那我们只能亡羊补牢了,也就是我们只有在浏览器已经把这些项目都渲染出来后,然后通过原生 JavaScript API(例如getBoundingClientRect)来获取这些项目的尺寸...因此,它将执行每一行,然后绘制最终结果:带有黑色边框的 div。 我们「无法在屏幕上看到这个红绿黑的过渡」。 如果任务花费的时间超过 16.6ms 会发生什么呢?。浏览器不能停止它或拆分它。...从浏览器的角度来看,它只是一个任务: 这种情况与我们无法看到的红绿黑边框过渡的情况完全相同! 另一方面,使用 useEffect 的流程将分为两个任务: 第一个任务渲染了带有所有按钮的初始导航。

    2.8K10

    GNE 版本升级,基于可视化信号自动化识别并提取新闻正文

    我们来看看它长什么样: 在body 标签下面的所有节点,都有一个属性叫做 is_visiable ,它的值是字符串的 true 或者 false 。...如果值为 true , 那么,还有一个属性叫做 coordinate 。它的值是一个 JSON 字符串,包含了这个节点的尺寸,坐标等信息。 那么,这些特殊的 HTML 是怎么生成的呢?...null element.setAttribute('is_visiable', is_visiable) if (is_visiable) { react...= element.getBoundingClientRect() coordinate = JSON.stringify(react) element.setAttribute...() iter_node(body) } insert_visiability_info() 复制代码 如下图所示: 执行完成以后,重新打开Elements(元素)标签页,就可以看到我们需要的属性已经添加到了各个节点里面

    1.6K31

    JavaScrip最容易犯的十大错误及其避免方法()

    Uncaught TypeError: Cannot read property 如果你是一个javascript开发者,你肯定看到过此错误 读取属性或调用方法的对象的未定义 这可能由于许多原因而发生,...让我们看一个在真实应用程序中如何发生这种情况的示例。 我们将选择React,但不正确初始化的相同原则也适用于Angular,Vue或任何其他框架。...反过来,这意味着ItemList将项目定义为未定义,并且您在控制台中收到错误 - “Uncaught TypeError:无法读取未定义的属性’map’”。 这很容易解决。...Uncaught TypeError: Cannot set property 当我们尝试访问未定义的变量时,它总是返回undefined,我们无法获取或设置undefined的任何属性。...在这种情况下,应用程序将抛出“Uncaught TypeError无法设置未定义的属性”。 10.

    7.3K10

    一次useEffect引发浏览器执行机制的思考

    我们来看看简化后的代码: "问题"代码 // 代码已经是很简化的版本了 仅仅保留了核心的内容 import React, { useEffect } from 'react' import '....浏览器加载机制 关于浏览器加载机制其实我相信大家已经老生常谈了,这里我结合上边两次不同打印的原理来稍微聊聊对应的机制: js执行浏览器会被js引擎"霸占",从而导致渲染进程无法执行阻塞DomTree的渲染的...同时浏览器的渲染引擎和js的解释引擎他们是互斥的,也就是说css加载和dom加载都会和js执行加载互斥的。(当然排除scirpt标签上的defer和async)属性。...执行完毕拿到的就是正确的位置getBoundingClientRect()。...,js文件引用了defer属性。

    1.2K10

    来自1000多个项目的10大JavaScript错误浅析

    在Chrome里读取未定义对象的属性或调用未定义对象的方法时就会发生这个错误,在Chrome开发者控制台可以很容易地重现这个错误。...我们选择React作为示例,不过在其他框架(Angular、Vue等)中也是一样的。...TypeError: ’undefined’ is not an object 在Safari里读取未定义对象的属性或调用未定义对象的方法时就会发生这个错误,在Safari开发者控制台可以很容易地重现这个错误...TypeError: Object doesn’t support property 在IE里读取未定义对象的属性或调用未定义对象的方法时就会发生这个错误,在IE开发者控制台可以很容易地重现这个错误。...Uncaught TypeError: Cannot set property 我们无法对undefined变量进行赋值或读取操作,否则的话会抛出“Uncaught TypeError: cannot

    10.3K80

    clientWidth,offsetWidth,scrollWidth你分的清吗

    对于inline的元素这个属性一直是0 offsetWidth/offsetHeight offsetWidth/offsetHeight计算时包含 content + padding + border...对于inline的元素这个属性一直是0 offsetTop/offsetLeft/offsetRight/offsetBottom: 代表元素距离父级元素的相对距离,但是父级元素需要具有relative...getBoundingClientRect() 它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离...但是滚动元素是从可视区域的左上角和右下角开始计算,如果想获取滚动元素整体的坐标,需要加上滚动距离  var X = node.getBoundingClientRect().left+node.scrollLeft...笔者用react写的,直接附上代码吧 dom (this.scrollRef

    3.1K10

    【前端词典】4 (+1)种滚动吸顶实现方式的比较

    二、使用 JQuery 的 offset().top 实现 我们知道 JQuery 中封装了操作 DOM 和读取 DOM 计算属性的 API,基于 offset().top 这个 API 和 scrollTop...(保存变量); 在使用的时候可能出现 DOM 没有初始化,就读取了该属性,这个时候会返回 0;对于这个问题我们需要等到 DOM 元素初始化完成后再执行。...不急,你是否还记得滚动吸顶使用了 offsetTop 或者 getBoundingClientRect().top 来获取响应的偏移量呢? 既然有读取元素的属性就自然会导致页面 reflow。...因此我们优化的方向就是从减少读取元素属性次数下手,查看代码发现一触发屏幕滚动事件就会调用相关方法读取元素的偏移量。...通过这个属性我们就可以在元素不在可视范围内,不去读取元素的相对位置,已达到性能优化;当浏览器不支持这个属性的时候就使用 throttle 来处理。 我们看看这个属性的兼容性怎么样: ?

    2.6K30

    「实用推荐」如何优雅的判断元素是否进入当前视区

    export const isVisible = (el) => { }; 使用 getBoundingClientRect 获取该元素的位置 const rect = el.getBoundingClientRect...因为每次调用 getBoundingClientRect 都会强制浏览器重新计算整个页面的布局,可能给你的网站造成相当大的闪烁。...editors=0011 更多有用的属性 现在我们知道:当被观测的元素部分进入可见窗口时会触发回调函数一次,当它离开可见窗口时会触发另一次。 这样就回答了一个问题:元素 X 在不在可见窗口里。...如果我们把 threshold 改为[0, 0.25, 0.5, 0.75, 1],当元素的每四分之一变为可见时,我们都会收到通知: 还一个属性没在上文列出: rootMargin. rootMargin...实用 Npm 包推荐 和今天话题相关的npm 包推荐的是:react-visibility-sensor 地址:https://www.npmjs.com/package/react-visibility-sensor

    2K20

    1000多个项目中的十大JavaScript错误以及如何避免

    当你读取一个属性或调用一个未定义对象的方法时,Chrome 中就会报出这样的错误。 ? 导致这个错误发生的原因有很多,常见的一种情况是在渲染 UI 组件时,不正确地初始化状态。...这是在 Safari 中读取属性或调用未定义对象上的方法时发生的错误,这与 Chrome 的上述错误基本相同,只是 Safari 使用不同的错误消息。 ? 3....这是在 Safari 中读取属性或调用空对象上的方法时发生的错误。 ?...TypeError: Cannot Read Property ‘length’ 这是 Chrome 中发生的错误,因为读取了未定义长度属性的变量。 ?...Uncaught TypeError: Cannot Set Property 当尝试访问未定义的变量时,总会返回 undefined。我们也无法获取或设置 undefined 的任何属性。

    13.5K40
    领券