如何统计商品曝光量 想要统计曝光量,其实只需要做两件事: 判断商品组件是否在屏幕(Viewport)内部 如果在屏幕内部,则将包含商品信息的曝光事件(Event)发送到日志服务器 在原生App和web中都有相应成熟的解决方案...但是今天要讨论的是微信小程序中的统计方式。...在web中统计曝光的话,可以监听滚动事件,然后根据元素的offset().top 和 body元素的scrollTop进行计算元素相对于Viewport的位置,从而判断当前页面中有哪些商品组件在屏幕内。...微信小程序的IntersectionObserver接口 官方文档的解释是 IntersectionObserver对象,用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见。...以上是示例伪代码 何时创建IntersectionObserver对象 如果你使用原生小程序进行开发,应该在组件内部的ready生命周期内创建IntersectionObserver对象,组件内部的创建方法有些不同
; 优点: 性能更高:浏览器底层实现,并进行了相应优化,性能没有问题:监听不会在主线程进行(只要回调方法会在主线程触发); 计算量小:这里的计算量小是指的web开发者需要进行的计算操作,因为大部分的计算浏览器...Intersection Observer API类似,使用方式也基本相同,只是部分细节存在差异;具体步骤: 第一步:创建一个观察者(IntersectionObserver) 通过微信小程序框架提供的...、小程序等多端的,其IntersectionObserver接口内部对H5、微信小程序、京东小程序等各平台进行了对齐抹平,具体来说在H5端是按照微信小程序端的格式进行的封装,其内部实现是调用的Web端的...这是由于dataset是小程序的特殊的模版属性,主要作用是可以在事件回调的 event 对象中获取到 dataset 相关数据,Taro对于这些能力是部分支持的,Taro通过在逻辑层的模拟已经支持在事件回调对象中通过...上一点所说的,Taro 对于小程序 dataset 的模拟是在小程序的逻辑层实现的。并没有真正在模板设置这个属性。
一 前言 在一些电商的小程序项目中,长列表是一个很普遍的场景,在加载大量的列表数据的过程中,可能会遇到手机卡顿,白屏等问题。...整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)。...正常情况下,当在移动端滑动设备的时候,只有手机屏幕内可视区域是真正需要渲染的部分,如下所示: 那就首先就要知道哪些 item 在屏幕区域内,一般情况下,这种长列表都是基于 scroll-view 实现的...,这种方式对于小程序的开发者有一定技术熟练度的要求。...首先通过 IntersectionObserver 创建一个观察者对象,这里规定的有效区域为两个屏幕。
懒加载实现 首先不设置 src 属性,将图片真正的 url 放在另外一个属性 data-src 中,在图片即将进入浏览器可视区域之前,将 url 取出放到 src 中。...懒加载的关键是如何判断图片处于浏览器可视范围内,通常有三种方法: 方法一 通过对比屏幕可视窗口高度和浏览器滚动距离与元素相对文档顶部的距离之间的关系,判断元素是否可见。...IntersectionObserver 的作用就是检测一个元素是否可见,以及元素什么时候进入或者离开浏览器视口。...通过设置 option 的 threshold 改变回调函数的触发条件,threshold 是一个范围为0到1数组,默认值是[0],也就是在元素可见高度变为0时就会触发。...Intersection Observer API 会注册一个回调方法,每当期望被监视的元素进入或者退出另外一个元素的时候(或者浏览器的视口)该回调方法将会被执行,或者两个元素的交集部分大小发生变化的时候回调方法也会被执行
这部分字体样式不是页面展示所必须的,因此可以尝试让浏览器延迟加载该 CSS 样式文件,具体的做法如下: 向 link 标签增加 media 属性,值为 only x(这个值在浏览器的媒体查询中与当前页面不匹配...这样做的好处是,当文件内容发生变化时,文件名必定发生变化,反过来说,当浏览器已经缓存了该路径的文件,则可以推断缓存的文件在服务器侧没有发生变化,浏览器可以直接使用缓存的版本而不用进行缓存协商(通过设置比较长的强制缓存...[6m5io70klb.png] 在 Hexo 博客中要实现这种文件版本控制方法,一方面要在 Hexo 构建时修改静态资源的文件名以及对应的引用路径,另一方面要为带哈希值的静态资源设置一个较长的缓存时间...,这里是 10% 的部分出现在屏幕中时会触发以上的回调 threshold: [0.1], }); observer.observe(document.getElementById('comment...这里要先说明一下 Google Fonts 对于中文等大字符集的在线字体的提供方式。
这些矩形在包含目标内容的前提下,将被尽可能小的计算。 ? 对于根元素,基于 rootMargin 的值考虑其矩形边界,这个值会填充或减小根元素的尺寸。 ?...最后至关重要的是,要理解不同于传统 scroll 事件的是,Intersection Observer 并不是在每次交集改变后不间断地轮询。相反,回调只在阈值大约达到时被调用。...Demo 2 – 页内导航 对于单页中随着滚动、相应某个区域的出现而高亮的导航条,Intersection Observer 是很适用的。 ?...section 元素是否足够多的出现在屏幕上,然后恰当地指定样式类名。...尽管可能需要 polyfill,但浏览器支持也在持续改善。该 API 将成为前端优化的利器。
Intersection Observer API会注册一个回调函数,每当被监视的元素进入或者退出另外一个元素时或viewport,或者两个元素的相交部分大小发生变化时,该回调方法会被触发执行,这样网站的主线程不需要再为了监听元素相交而辛苦劳作...,浏览器会自行优化元素相交管理,注意Intersection Observer API无法提供重叠的像素个数或者具体哪个像素重叠,他的更常见的使用方式是当两个元素相交比例在N%左右时,触发回调,以执行某些逻辑...,当其监听到目标元素的可见部分穿过了一个或多个阈thresholds时,会执行指定的回调函数。...rootBounds:根元素的矩形区域的信息,是getBoundingClientRect方法的返回值,如果没有根元素即直接相对于视口滚动,则返回null。...应用 实现一个使用IntersectionObserver的简单示例,两个方块分别可以演示方块1是否在屏幕可见区域内以及方块2是否在方块1的相对可见交叉区域内,另外可以使用IntersectionObserver
显示 : 默认 我们知道小程序页面的脚本逻辑是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能在脚本中使用window,也无法在脚本中操作组件。...,所以把数据写死在页面上了 数据结构如下: ?...悄悄告诉你,小程序里面有个onPageScroll 函数,是用来监听页面的滚动的。 还有个getSystemInfo 函数,可以获取获取系统信息,里面包含屏幕的高度。 接下来,思路就透彻了吧。...this.setData({ group }) }).exec() } onPageScroll(){ // 滚动事件 this.showImg() } 至此,我们完成了一个小程序版的图片懒加载...它是一个新的API,叫做IntersectionObserver, 本文只讲解简单的使用,了解更多请猛戳没错,就是点我 小程序里面给它的定义是节点布局交叉状态API可用于监听两个或多个组件节点在布局位置上的相交状态
前言 前段时间在研究前端异常监控/埋点平台的实现。 在思考方案时,想到了浏览器自带的观察者以及页面生命周期API 。...IntersectionObserver 的优势 Intersection Observer API通过为开发人员提供一种新方法来异步查询元素相对于其他元素或全局视口的位置,从而解决了上述问题: 异步处理消除了昂贵的...比如下面这个小示例: ? 2....; } .post__image { flex: 0 auto; height: auto; } } 但这就很容易出现 当你在超过预期的屏幕(过大)查看页面时,会出现以下的布局...@media查询的最大问题是: 组件响应度取决于屏幕尺寸,而不是响应自身的尺寸。 以下是指令版实现: ? 使用: ? 效果: ?
本文首先论述下如何评判一个小程序页面的性能情况,之后通过具体的案例重点讲解下几点实践技巧,最后再讲讲key值在渲染一个列表时发挥了一个怎么样的作用,以此来论述为啥key值对性能提升有帮助。...另外,由于小程序的视图渲染层和数据逻辑处理层是分开的,不是在同一个线程上面的,从用户触发页面交互,到处理数据逻辑,最后层现页面,数据到视图是需要传输的,因而小程序本身对数据大小也有限制,不能超过1M。...IntersectionObserver 对象,用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见 通过这个api我们不用再主动去监听元素位置了,在页面渲染一开始,通过这个api指明需要监听的元素...2 CDN图片处理 对于页面里面的图片,最好都把图片存储在cdn服务器上,一个是能充分利用cdn缓存来加快请求速度,另外一个就是cdn上能够将图片进行一定的处理,比如裁剪。...实践技巧四 1 key值在列表渲染中的作用 key值在列表渲染的时候,能够提升列表渲染性能,为什么呢?
不包含文档卷起来的部分。 ? 该函数返回一个 object 对象,有8个属性: top,right,buttom,left,width,height,x,y ?...(保存变量); 在使用的时候可能出现 DOM 没有初始化,就读取了该属性,这个时候会返回 0;对于这个问题我们需要等到 DOM 元素初始化完成后再执行。...因此我们优化的方向就是从减少读取元素属性次数下手,查看代码发现一触发屏幕滚动事件就会调用相关方法读取元素的偏移量。...第一种方案 这个方案很常见,不过其带来的副作用也很明显,就是在吸顶效果会有些延迟,如果产品可以接受那就不失为一种好方法。...大概支持了 60% 以上,在项目中还是可以使用的(你需要做好兼容性处理)。 关于 IntersectionObserver 如何使用,请看 MDN 或者 阮一峰教程。
前言 图片懒加载其实已经是一个近乎“烂大街”的词语了,在大大小小的面试中也会被频繁的问到,我在之前的面试中也被问到了图片懒加载的原因、实现方式及底层原理,但由于自己平时很少做“图片”相关的处理,对于“懒加载...基于原生 js 实现图片懒加载 相关 API 先来看几个后面会用到的API document.documentElement.clientHeight 获取屏幕可视区域的高度。 ?...“图片来源MDN[1] element.offsetTop 获取元素相对于文档顶部的高度。 ?...getBoundingClientRect()是DOM元素到浏览器可视范围的距离(不包含页面看不见的部分)。...“这里我们参考阮一峰大佬关于IntersectionObserver API[3]的介绍。 我们在平时的开发中,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它。 ?
懒加载可以在多种场景中实现,包括网页内容、图像、数据等。以下是一些常见的懒加载实现方法: 对于网页内容: 动态插入: 通过JavaScript动态插入内容,而不是在HTML文档加载时静态渲染。...滚动事件监听: 监听滚动事件,当滚动到页面的特定部分时才加载内容。 对于图像: Intersection Observer API: 使用这个API可以检测元素是否进入了视口。...只有当图像与视口至少有部分重叠时,才会加载它。 图像占位符: 使用小图标或占位符替换真实的图像,当图像需要加载时再替换成真实的图像源。...图片懒加载的原理: 由于浏览器会自动对页面中的img标签的src属性发送请求并下载图片,可以通过html5自定义属性data-xxx 先暂存src的值,然后在图片出现在屏幕可视区域的时候,再将data-xxx...对于数据: 分页: 只加载当前页面需要的数据,而不是一次性加载所有数据。 虚拟滚动: 只渲染用户能够在屏幕上看到的项,对于滚动超出视窗的项不进行渲染。
Battery Status 设备电量情况 我会对部分API做一些比较有意思的案例,那么开始我们的学习吧~ 1....当一个IntersectionObserver对象被创建时,其被配置为监听根中一段给定比例的可见区域,并且无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;然而,我们可以在同一个观察者对象中配置监听多个目标元素...来判断当前页面是否处于全屏状态,来实现屏幕切换的效果.如果是react开发者,我们也可以将其封装成一个自定义hooks来实现与业务相关的全屏切换功能. 7....URL URL API是URL标准的组成部分,URL标准定义了构成有效统一资源定位符的内容以及访问和操作URL的API。...,改变网站颜色等,对于webapp中播放视频或者直播时,我们也可以用css画一个电量条,当电量告急时提醒用户.作为一个优秀的网站体验师,这一块还是不容忽视的.
这篇文章,我们将一起探讨,web应用中能对图片进行什么样的优化,以及反思一些“负优化”手段 一、为什么要对图片进行优化 对于大多数前端工程师来说,图片就是UI设计师(或者自己)切好的图,你要做的只是把图片丢进项目中...使用强大的IntersectionObserver IntersectionObserver提供给我们一项能力:可以用来监听元素是否进入了设备的可视区域之内,这意味着:我们等待图片元素进入可视区域后,再决定是否加载它...以上介绍的两种方式,其实最终实现的效果是相似的,但这里还有个问题,当网速慢的时候,图片还没加载完之前,用户会看到一段空白的时间,在这段空白时间,就算是渐进式图片也无法发挥它的作用,我们需要更友好的展示方式来弥补这段空白...四、响应式图片的实践 我们经常会遇到这种情况:一张在普通笔记本上显示清晰的图片,到了苹果的Retina屏幕或是其他高清晰度的屏幕上,就变得模糊了。...这是因为,在同样尺寸的屏幕上,高清屏可以展示的物理像素点比普通屏多,比如Retina屏,同样的屏幕尺寸下,它的物理像素点的个数是普通屏的4倍(2 * 2),所以普通屏上显示清晰的图片,在高清屏上就像是被放大了
从问题快速排查角度来看,我们需要知道用户的使用快照,包括发生问题时的接口请求、页面报错等。 第一部分属于行为监控的范畴,产品一般会让我们在关键的节点埋点,然后产品上线后,通过BI拉数据来进行分析。...我们能做的并不多。 第三部分,用户使用快照这里我们接入了组内其他同学开发的coffeebean系统,可对用户的操作行为进行录制,在排查线上问题时能给予很大的帮助。...唯独第二部分,用户体验这部分的数据(对应性能监控)对我们影响很大,也是我们着力在提升的。 本文就分享一下我们在用户体验优化和页面性能提升上做的一系列改造工作,希望能给看文章的你一些启发。...而在 Web Vitals 指标中,Core Web Vitals 是其中的核心,目前包含三个指标: LCP:(Largest Contentful Paint) 从页面加载开始到最大文本块或图像元素在屏幕上完成渲染的时间...但一番试用下来,发现nfes-serviceworker-webp 工具依赖于延迟加载 sw 文件,无法在图片加载的时机保证 sw 注册完成,对于二次缓存有较强的帮助,不适用与我们改善首次加载的场景。
通过 document.documentElement.clientHeight获取屏幕可视窗口高度 通过 document.documentElement.scrollTop获取浏览器窗口顶部与文档顶部之间的距离...,也就是滚动条滚动的距离 通过 element.offsetTop获取元素相对于文档顶部的距离 然后判断②-③<①是否成立,如果成立,元素就在可视区域内。...可以看出返回的元素位置是相对于左上角而言的,而不是边距。 我们思考一下,什么情况下图片进入可视区域。...也就是说,在 bound.top<=clientHeight时,图片是在可视区域内的。...Intersection Observers: https://github.com/WICG/IntersectionObserver IntersectionObserver可以自动观察元素是否在视口内
CSS层面,从最初的纯CSS,到LESS,再到现在的Grid,用户在观看视频的场景很多,我们必须适应不同的分辨率和屏幕尺寸。...Grid,是目前最强大的CSS网格布局方案,它将网页划分成一个个网格,可以任意组合不同的网格,做出不同的布局。对跨终端,多屏幕适配尤为有效。...至于新特性,我们非常喜欢IntersectionObserver API,用它可以更有效的动态加载图像。...画外音: (1)画中画,是近几年推出的新特性; (2)用户在浏览P站视频的时候,真的能腾出手来,进行反馈么? 提问:WebVR技术一直在进步,请问WebVR目前发挥了多大的作用?...答:播放器分为两个部分: (1)基本播放核心功能实现,它是相对独立的; (2)第三方脚本与广告加载,我们会尽早的集成,以便尽早发现问题,我们与第三方合作,手动触发相关事件; 提问:站在技术的角度展望未来
作者: 神Q超人 译者:前端小智 来源:medium 前一阵子在做一个项目的时候,因为每组数据都要先通过很庞大的计算,才把计算后的结果 Render 到页面上,但这样就导致如果单页查出来的数据超过大概...简单说的意思就是只要使用 Intersection Observer API,就能够监听目标的元素在画面上出现或离开的时候,执行你交给它的 callback 方法。下方就来看看使用的方式吧!...observe 方法,把要监听的 div 当作参数传给它,并用 callback 让它可以在 div 出现和离开的时候给个消息: const intersectionObserver = new IntersectionObserver...; 执行的结果就会像这样子: 而 Intersection Observer API 在执行 callback 的时候,也会给你一个 Array,Array 是所有正在监听的元素,我们可以从这些元素里的...JavaScript 的部分先贴代码,下方再来解释: const data = Array.from(Array(200)).map( (_value, index) => `第 ${index +
同理 IntersectionObserver 和 getBoundingClientRect 都能实现 时间分片主要是分批渲染DOM,使用 requestAnimationFrame 来让动画更加流畅..., 可以通过scroll 或IntersectionObserver(交叉观察者,异步的,性能消耗小) 和 getBoundingClientRect 都可以使用 注意:区分虚拟列表与懒加载 懒加载与虚拟列表其实都是延时加载的一种实现...setTimeout的执行时间并不是确定的,当 setTimeout 的执行步调和屏幕的刷新步调不一致,就会出现丢帧的情况,从而出现闪屏 方法二:requestAnimationFrame 与setTimeout...它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象。...DocumentFragments是DOM节点,但并不是DOM树的一部分,可以认为是存在内存中的,所以将子元素插入到文档片段时不会引起页面回流。
领取专属 10元无门槛券
手把手带您无忧上云