尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

lazySizes object-fit 插件实战:为旧浏览器补齐 `cover` / `contain` 与 `object-position`

lazySizes object-fit 插件实战:为旧浏览器补齐 `cover` / `contain` 与 `object-position` 前端Web性能【免费下载链接】lazysizesHigh performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.项目地址https://gitcode.com/gh_mirrors/la/lazysizes点击查看免费下载lazySizes 的 object-fit 扩展插件plugins/object-fit/README.md是一个轻量级的部分 polyfill用于在不支持object-fit: cover | contain与object-position的浏览器中还原图片的填充/裁剪显示效果。本文以该插件为核心完整讲解引入方式、标记写法、CSS 初始化技巧并结合仓库源码ls.object-fit.js剖析其克隆显示元素 背景图替代的底层原理同时说明它与 parent-fit、respimg 两个配套插件的协作关系帮助你在响应式图片 懒加载场景下直接落地这套方案。一、这个插件解决什么问题object-fit: cover与object-fit: contain是现代 CSS 中让图片或视频在不拉伸变形的前提下填满或完整放入容器的标准方案object-position则控制内容在容器内的对齐位置。但在 IE 等不支持该属性的旧浏览器中上述写法会直接失效图片会被粗暴拉伸。lazySizes 的 object-fit 插件正是为此而生它在不支持object-fit/object-position的浏览器中将图片的显示层替换为带background-size/background-position的克隆元素从而模拟出 cover、contain 的效果且完全融入 lazySizes 的懒加载与响应式图片体系。从源码看插件的启用条件是当前浏览器确实缺失支持ls.object-fit.jsvar fitSupport objectFit in style; var positionSupport fitSupport objectPosition in style;只有!fitSupport || !positionSupport时插件才会挂载事件监听ls.object-fit.js。也就是说在原生支持的浏览器中它几乎零开销。注意正如文档所强调的这是一个部分 polyfillpartial polyfill并非完整的 object-fit 实现其目标场景是响应式图片 懒加载组合具体限制见下文注意事项。二、引入方式2.1 传统script标签引入核心脚本lazySizes必须加载object-fit 插件只在浏览器不支持时才真正发挥作用若图片配合data-sizesauto使用还需要 parent-fit 插件来计算正确的sizes在不支持响应式图片的浏览器中则额外引入 respimg 插件。原文给出的组合如下!-- polyfill for object-fit (only needed in browsers that dont support object-fit) -- script srcplugins/object-fit/ls.object-fit.min.js/script !-- required: -- script srclazysizes.min.js async/script !-- only for>// never try to import *.min.js files import lazySizes from lazysizes; import lazysizes/plugins/parent-fit/ls.parent-fit; // polyfills import lazysizes/plugins/respimg/ls.respimg; if (!(object-fit in document.createElement(a).style)) { require(lazysizes/plugins/object-fit/ls.object-fit); }这里有三个值得注意的实践要点不要导入*.min.js文件文档明确提示使用未压缩的源码模块如ls.parent-fit、ls.object-fit交由构建工具完成压缩与打包。按需加载 polyfill通过特性检测(object-fit in document.createElement(a).style)判断浏览器是否原生支持仅在缺失时才引入 object-fit 插件这与源码内部的检测逻辑ls.object-fit.js保持了一致。parent-fit 是基础件它不仅是data-sizesauto object-fit 场景的推荐插件更是 object-fit polyfill 插件的底层基础parent-fit 插件说明中明确写道 it is also the base of the object-fit polyfill plugin。三、标记Markup写法object-fit 插件不是无脑把元素全部替换它需要配合标准的 lazySizes 响应式图片标记。原文档给出的示例是data-srcset含宽度w与高度h描述符data-sizesautodiv classimagecontainer img classimagecontainer-img lazyload >var regCssFit /object-fit[]*\s*:\s*[]*(contain|cover)/; var regCssPosition /object-position[]*\s*:\s*[]*(.?)(?($|,|||;))/;也就是说font-family: object-fit: contain这种写法会被解析为fit: contain如果同时写font-family: object-fit: cover; object-position: 50% 50%插件还能解析出定位参数。读取逻辑集中在getObject函数ls.object-fit.js默认定位为center。4.2 完整 CSS 示例原文档给出的配套 CSS 如下它同时演示了固定宽高比容器这一经典布局技巧.imagecontainer { position: relative; border: 3px solid #ccc; } .imagecontainer:before { display: block; width: 100%; content: ; padding-bottom: 100%; height: 0; } .imagecontainer-img { position: absolute; display: block; top: 0; left: 0; width: 100%; height: 100%; transition: 400ms transform; object-fit: contain; font-family: object-fit: contain; } .imagecontainer-img:hover { transform: scale(1.1); }要点拆解:before的padding-bottom: 100%让容器高度等于宽度从而形成稳定的宽高比占位在这里即 1:1避免图片加载前后页面跳动。图片position: absolute铺满容器object-fit: contain是给支持该属性的现代浏览器用的原生声明font-family: object-fit: contain则是给本插件旧浏览器用的开关两者互不冲突一条规则同时服务两类浏览器。transition: 400ms transform与:hover的transform: scale(1.1)展示了图片完全铺满容器后可自由叠加缩放等视觉效果——在 polyfill 场景下这个 hover 缩放依然有效因为克隆显示层同样继承了相应样式。五、源码级原理克隆显示元素 背景图替代5.1 整体流程当插件判定浏览器缺失支持且图片满足条件obj.fit非空且!fitSupport || (obj.position ! center)见 ls.object-fit.js时会调用initFix。其核心思路是克隆图片节点生成一个无src/srcset的显示元素默认类名lazysizes-display-clone可通过lazySizes.cfg.objectFitClass自定义见 ls.object-fit.js插入到原图片之前原图片被隐藏visibility: hiddenposition: absolutels.object-fit.js但保留在 DOM 中继续承担懒加载与尺寸计算职责显示元素用背景图模拟把图片的真实地址赋给显示元素的backgroundImage同时设置backgroundSize config.fit即cover/contain、backgroundPosition config.positionls.object-fit.js从而在旧浏览器里精确还原 object-fit 语义。5.2 关键细节占位 GIF克隆元素先被设为透明 GIFblankSrcls.object-fit.js并清空srcset加载完成后再切换为背景图保证渲染过程中不会出现裂图或重复下载。事件驱动initFix内部监听lazyloaded与load事件ls.object-fit.js一旦图片真实地址变化element.currentSrc || element.src就同步更新克隆元素的backgroundImage并通过lazySizes.rAF在下一帧执行兼顾性能。与懒加载核心的衔接插件挂在lazyunveilread事件上ls.object-fit.js执行onRead检测该事件正是 lazySizes 核心在元素即将加载时派发的src/lazysizes-core.js同时它还监听了lazybeforesizes事件处理重复初始化ls.object-fit.js。核心脚本在自动计算尺寸前会派发lazybeforesizes并允许插件改写event.detail.widthsrc/lazysizes-core.js这正是 parent-fit 插件介入计算的入口。状态标记被处理的图片会打上data-parent-fit、data-parent-containerprev、data-object-fit-polyfilled属性ls.object-fit.js既方便调试排查也是插件自身避免重复处理的依据。5.3 与 parent-fit 的协作parent-fit 插件通过监听同一个lazybeforesizes事件改写尺寸ls.parent-fit.js。它支持三种模式data-parent-fitcontain/cover按父容器宽高与图片真实宽高比反推出正确的显示宽度避免 cover/contain 场景下data-sizesauto计算失真。data-parent-fitwidth直接取父容器宽度作为sizes。父容器选择默认取最近的非picture父元素可用data-parent-containerhtml|.my-image-container指定任意选择器html表示以视口为父容器self表示以图片自身为准详见 parent-fit 插件说明。要让 parent-fit 正确计算图片物理宽高比必须可算ls.parent-fit.js有三种途径data-aspectratio属性、width/height内容属性或srcset中至少一个候选带h高度描述符。例如!-->img.my-image { font-family: parent-container: html; parent-fit: contain; }5.4 与 respimg 的协作在srcset中使用h高度描述符时旧版 Edge 存在读取问题respimg 插件plugins/respimg/README.md可以修复这一点。同时要注意respimg 插件仅支持宽度描述符与picture/data-srcset组合不支持密度描述符x且使用w描述符时必须搭配data-sizesauto或单一px单位的sizes值。六、使用注意事项非完整 polyfill本插件只针对 lazySizes 懒加载体系内的响应式图片生效不承诺覆盖所有object-fit用法如视频元素、非 lazySizes 图片。data-sizesauto与 object-fit 组合必须加载 parent-fit 插件否则自动计算出的sizes可能与实际显示宽度不符这是文档明确推荐 parent-fit 的原因。宽高比信息不能缺parent-fit 需要data-aspectratio、width/height属性或h描述符三者之一来计算比例否则会退回默认宽度计算ls.parent-fit.js。类名可定制克隆显示元素的类名可通过lazySizes.cfg.objectFitClass修改默认lazysizes-display-clone便于与既有样式体系共存。不要导入压缩文件在模块化打包时使用ls.object-fit、ls.parent-fit等未压缩模块避免二次压缩。七、测试与验证仓库在 tests/functional-tests-plugins.js 中为 parent-fit bgset 等组合建立了 QUnit 测试模块如parentFit bgset optimumx、parentFit bgset respimg模块验证插件在真实浏览器事件流lazybeforesizes改写detail.width下与核心脚本的协同正确性。接入本插件后建议在 IE 等无 object-fit 支持的浏览器中用 DevTools 检查图片前的克隆元素是否携带background-image/background-size并确认原图片被visibility: hidden隐藏即可验证 polyfill 是否生效。结语lazySizes 的 object-fit 插件用克隆显示层 背景图的巧妙思路把object-fit: cover|contain与object-position带到了旧浏览器同时与data-sizesauto、parent-fit、respimg 组成了一套完整的响应式 懒加载 填充裁剪解决方案。理解它的font-family触发约定、克隆机制和事件协作链你就能在兼容性与现代特性之间找到平衡直接把它接入现有图片渲染体系。赞分享前端Web性能【免费下载链接】lazysizesHigh performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.项目地址https://gitcode.com/gh_mirrors/la/lazysizes点击查看免费下载相关推荐让旧浏览器也支持object-fit和object-positionobject-fit-images 项目推荐让旧浏览器也支持 object fit 和 object position object fit images 项目推荐 项目介绍 在现代网页设计中 obj30-seconds-of-code CSS 技巧用 object-fit 与 object-position 将图片完美适配容器30 seconds of code CSS 技巧用 object fit 与 object position 将图片完美适配容器 在 Web 布局中图片的教程文档BrewUI HomebrewPackageID唯一规范包标识符的完整设计与实现指南BrewUI HomebrewPackageID唯一规范包标识符的完整设计与实现指南 如果你用过 Homebrew一定知道 brew install doc桌面应用开发工具上一篇Prisma 服务配置完全指南prisma.yml YAML 结构逐字段解析含源码级原理下一篇SQLFluff 团队落地指南以渐进式 CI/CD 路线在组织中推广 SQL 代码规范创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表