当前位置: 首页 > wzjs >正文

中国网站建设调查分析热狗网站排名优化外包

中国网站建设调查分析,热狗网站排名优化外包,网页设计与网站建设论述题,深圳有哪些软件公司图片性能优化 图片懒加载 如何判断图片出现在了当前视口 &#xff08;即如何判断我们能够看到图片&#xff09;如何控制图片的加载 原生实现 <img src"shanyue.jpg" loading"lazy" />loading"lazy" 延迟加载图像&#xff0c;直到它和视…

图片性能优化

图片懒加载

  1. 如何判断图片出现在了当前视口 (即如何判断我们能够看到图片)
  2. 如何控制图片的加载

原生实现

<img src="shanyue.jpg" loading="lazy" />

loading="lazy" 延迟加载图像,直到它和视口接近到一个计算得到的距离(由浏览器定义)。目的是在需要图像之前,避免加载图像所需要的网络和存储带宽。这通常会提高大多数典型用场景中内容的性能。

  • lazy:对资源进行延迟加载。
  • eager:立即加载资源。
  • auto:浏览器自行判断决定是否延迟加载资源。

通过相对计算获取元素位置

图片顶部到文档顶部的距离 > 浏览器可视窗口高度 + 滚动条滚过的高度,此时的图片就是不可见的,如果图片顶部到文档顶部的距离 < 浏览器可视窗口高度 + 滚动条滚过的高度那么该图片就应该出现在可视区域内了。

但你还记得我们前面提到的注意事项吗?如果用户直接滑到页面底部,那么这个判断条件对所有的图片都为真,还是会造成性能问题。所以我们要再加上一条判断条件 图片的高度 + 图片顶部到文档顶部的距离 > 滚动条滚过的高度,以确保图片确实在可视区域内,而不只是被滑过。

  • 待加载图片的高度:img.clientHeight
  • 图片顶部到文档顶部的距离:img.offsetTop
  • 浏览器窗口滚动过的距离:document.documentElement.scrollTopdocument.body.scrollTop
  • 浏览器可视窗口高度:document.documentElement.clientHeightwindow.innerHeight
const imgs = document.querySelectorAll('img')
function lazyLoad(imgs) {console.log('lazyLoad')// 浏览器可视窗口的高度const windowHeight = window.innerHeight// 可视窗口滚动过的距离const scrollHeight = document.documentElement.scrollTopfor (let i = 0; i < imgs.length; i++) {if (windowHeight + scrollHeight > imgs[i].offsetTop && imgs[i].clientHeight + imgs[i].offsetTop > document.documentElement.scrollTop && !imgs[i].src) {imgs[i].src = imgs[i].dataset.src}}
}
// 进入页面时执行一次加载
lazyLoad(imgs)
// 监听滚动事件,当滚动到可视区域时加载图片
// 此处可以添加防抖/节流优化 window.onscroll = throttle(lazyLoad, 500)
window.onscroll = function () {lazyLoad(imgs)
}

Element.getBoundingClientRect()

getBoundingClientRect 返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的 CSS 边框集合 。DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

有了这个 API 后我们很同意获取图片的 top 值,当 top 值小于可视区的高度的时候就可以任何图片进入了可视区,直接加载图片即可。

document.addEventListener('DOMContentLoaded', () => {const lazyImages = document.querySelectorAll('img.lazyload')const lazyLoad = () => {lazyImages.forEach((img) => {if (img.getBoundingClientRect().top <= window.innerHeight && img.getBoundingClientRect().bottom >= 0 && getComputedStyle(img).display !== 'none') {img.src = img.dataset.srcimg.classList.remove('lazyload')}})if (lazyImages.length === 0) {document.removeEventListener('scroll', lazyLoad)window.removeEventListener('resize', lazyLoad)window.removeEventListener('orientationchange', lazyLoad)}}document.addEventListener('scroll', lazyLoad)window.addEventListener('resize', lazyLoad)window.addEventListener('orientationchange', lazyLoad)
})

使用 IntersectionObserver

<img data-src="xxx.jpg" class="lazyload" /><script>document.addEventListener('DOMContentLoaded', () => {const lazyImages = document.querySelectorAll('img.lazyload')if ('IntersectionObserver' in window) {const observer = new IntersectionObserver((entries, observer) => {entries.forEach((entry) => {if (entry.isIntersecting) {const image = entry.targetimage.src = image.dataset.srcimg.classList.remove('lazyload')observer.unobserve(image)}})})lazyImages.forEach((img) => {observer.observe(img)})} else {lazyImages.forEach((img) => {img.src = img.dataset.src})}})
</script>

监听元素的重叠度 IntersectionObserver

var observer = new IntersectionObserver(callback[, options]); 

IntersectionObserverdisconnect()方法终止对所有目标元素可见性变化的观察。

IntersectionObserverobserve() 方法向 IntersectionObserver
对象观察的目标集合添加一个元素。一个观察者有一组阈值和一个根(root),但是可以监视多个目标元素的可见性变化(遵循阈值和根的设置)。

IntersectionObservertakeRecords() 方法返回一个IntersectionObserverEntry 对象数组,每个对象包含目标元素自上次相交检查以来所经历的相交状态变化——可以显式地通过调用此方法或隐式地通过观察器的回调获得。

IntersectionObserverunobserve() 方法命令 IntersectionObserver停止对一个元素的观察。

const ob = new IntersectionObserver( (entries) => {const entry = entries[0]if (entry.isIntersecting) {console.log('加载更多')}  },   {// root 监听元素的祖先元素Element对象,其边界盒将被视作视口。目标在根的可见区域的任何不可见部分都会被视为不可见。root: null,// rootMargin 一个在计算交叉值时添加至根的边界盒 (bounding_box) 中的一组偏移量,类型为字符串 (string) ,可以有效的缩小或扩大根的判定范围从而满足计算需要。语法大致和 CSS 中的margin 属性等同; 可以参考 intersection root 和 root margin 来深入了解 margin 的工作原理及其语法。默认值是"0px 0px 0px 0px"。// threshold 规定了一个监听目标与边界盒交叉区域的比例值,可以是一个具体的数值或是一组 0.0 到 1.0 之间的数组。若指定值为 0.0,则意味着监听元素即使与根有 1 像素交叉,此元素也会被视为可见。若指定值为
1.0,则意味着整个元素都在可见范围内时才算可见。threshold: 0   })const dom = document.querySelector('.loading') 
ob.observe(dom) 

使用库

lazysizes、lazyload

图片预加载

const images = ['https://picsum.photos/id/237/400/400.jpg?grayscale&blur=2','https://picsum.photos/id/238/400/400.jpg?grayscale&blur=2'
]function preloadImages(max = 3) {const _images = [...images]function loadImage() {const src = _images.shift()return new Promise((resolve, reject) => {const link = document.createElement('link')link.rel = 'preload'link.as = 'image'link.href = srcdocument.head.appendChild(link)link.onload = resolvelink.onerror = rejectsetTimeout(reject, 10000)})}function _loadImage() {loadImage().finally(() => {if (_images.length) {loadImage()}})}for (let i = 0; i < max; i++) {_loadImage()}
}
http://www.dtcms.com/wzjs/235511.html

相关文章:

  • 广州哪家做网站价格好seo霸屏软件
  • 包装设计征集网站搜索引擎优化是什么工作
  • 做视频投稿赚钱的网站学网络营销
  • 用cms创建自己带数据库的网站营销网络营销
  • 淘宝天猫优惠卷网站建设网络营销推广方案论文
  • 海南省城乡住房建设厅网站首页b站推广网站入口2023的推广形式
  • wordpress 点击文章图片路径seo是网络优化吗
  • 做网站多钱如何提升网站seo排名
  • 简单网页模板代码seo是什么化学名称
  • 光谷网站建设semicircle
  • 网站建设考试题关键词热度分析
  • 深圳市小程序科技有限公司合肥seo排名优化
  • 免费网站模板宠物用品店网站开通
  • 网站建设公司如何进行工作互联网推广方案
  • 新疆建设工程云网站连云港seo
  • 阐述网站建设利益微信营销的10种方法技巧
  • 池州专业网站建设社群营销的案例
  • 个人域名可以做KTV网站吗2024年新冠疫情最新消息今天
  • 浅灰色做网站背景地推公司
  • 策划会展网站建设代运营公司
  • 世界杯入口南京百度seo代理
  • 网页设计技术培训教程宁波seo网络推广
  • 徐州网站中国搜索引擎份额排行
  • 淘宝网站小视频怎么做百度账号登录中心
  • 课堂网站开发网站快速被百度收录
  • 关于英文网站建设的请示seo搜索引擎优化心得体会
  • 推广型的网站怎么做常德网站建设公司
  • 手机网站跟pc网站有什么不同上海百度推广公司
  • 网页制作相关网站软件开发流程
  • 开一个二手车销售网站怎么做西安百度首页优化