图片懒加载

      发布在:前端技术      评论:0 条评论
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:&#39;JetBrains Mono&#39;,monospace;font-size:9.8pt;"><span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> * </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">懒加载<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@description </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">可加载</span><span style="color:#629755;font-style:italic;">`&lt;img&gt;`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">、</span><span style="color:#629755;font-style:italic;">`&lt;video&gt;`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">、</span><span style="color:#629755;font-style:italic;">`&lt;audio&gt;`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">等一些引用资源路径的标签<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{object} params </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">传参对象<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{string?} params.lazyAttr </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">自定义加载的属性(可选)<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{&quot;src&quot;|&quot;background&quot;} params.loadType </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">加载的类型(默认为</span><span style="color:#629755;font-style:italic;">`src`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">)<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{string?} params.errorPath </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">加载失败时显示的资源路径,仅在</span><span style="color:#629755;font-style:italic;">`loadType`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">设置为</span><span style="color:#629755;font-style:italic;">`src`</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">中可用(可选)<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">lazyLoad</span>(params) {<br/> <span style="color:#cc7832;">var </span>attr = (params &amp;&amp; params.lazyAttr) || <span style="color:#6a8759;">&quot;lazy&quot;</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;var </span>type = (params &amp;&amp; params.loadType) || <span style="color:#6a8759;">&quot;src&quot;</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;</span><span style="color:#629755;font-style:italic;">/** </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">更新整个文档的懒加载节点 </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp;</span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">update</span>() {<br/> <span style="color:#cc7832;">var </span>els = <span style="color:#9876aa;font-weight:bold;font-style:italic;">document</span>.<span style="color:#ffc66d;">querySelectorAll</span>(<span style="color:#6a8759;">&quot;[&quot; </span>+ attr + <span style="color:#6a8759;">&quot;]&quot;</span>)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;for </span>(<span style="color:#cc7832;">var </span>i = <span style="color:#6897bb;">0</span><span style="color:#cc7832;">; </span>i &lt; els.<span style="color:#9876aa;">length</span><span style="color:#cc7832;">; </span>i++) {<br/> <span style="color:#cc7832;">var </span>el = els[i]<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span>observer.<span style="color:#ffc66d;">observe</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>}<br/> }<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp; * </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">加载图片<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> &nbsp; &nbsp; </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{HTMLImageElement} el </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">图片节点<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> &nbsp; &nbsp; </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp;</span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">loadImage</span>(el) {<br/> <span style="color:#cc7832;">var </span>cache = el.<span style="color:#9876aa;">src</span><span style="color:#cc7832;">; </span><span style="color:#808080;">// </span><span style="color:#808080;font-family:&#39;宋体&#39;,monospace;">缓存当前</span><span style="color:#808080;">`src`</span><span style="color:#808080;font-family:&#39;宋体&#39;,monospace;">加载失败时候用<br/></span><span style="color:#808080;font-family:&#39;宋体&#39;,monospace;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>el.<span style="color:#9876aa;">src </span>= el.<span style="color:#ffc66d;">getAttribute</span>(attr)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>el.<span style="color:#9876aa;">onerror </span>= <span style="color:#cc7832;">function </span>() {<br/> el.<span style="color:#9876aa;">src </span>= (params &amp;&amp; params.errorPath) || cache<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>}<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;</span>}<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp; * </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">加载单个节点<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> &nbsp; &nbsp; </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{HTMLElement} el<br/></span><span style="color:#8a653b;font-style:italic;"> &nbsp; &nbsp; </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp;</span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">loadElement</span>(el) {<br/> <span style="color:#cc7832;">switch </span>(type) {<br/> <span style="color:#cc7832;">case </span><span style="color:#6a8759;">&quot;src&quot;</span>:<br/> <span style="color:#ffc66d;">loadImage</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case </span><span style="color:#6a8759;">&quot;background&quot;</span>:<br/> el.<span style="color:#9876aa;">style</span>.<span style="color:#9876aa;">backgroundImage </span>= <span style="color:#6a8759;">&quot;url(&quot; </span>+ el.<span style="color:#ffc66d;">getAttribute</span>(attr) + <span style="color:#6a8759;">&quot;)&quot;</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>}<br/> el.<span style="color:#ffc66d;">removeAttribute</span>(attr)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span>observer.<span style="color:#ffc66d;">unobserve</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;</span>}<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp; * </span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">监听器<br/></span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;"> &nbsp; &nbsp; </span><span style="color:#629755;font-style:italic;">* [MDN</span><span style="color:#629755;font-style:italic;font-family:&#39;宋体&#39;,monospace;">说明</span><span style="color:#629755;font-style:italic;">](https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver)<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp; */<br/></span><span style="color:#629755;font-style:italic;"> &nbsp; &nbsp;</span><span style="color:#cc7832;">var </span>observer = <span style="color:#cc7832;">new </span><span style="color:#ffc66d;">IntersectionObserver</span>(<span style="color:#cc7832;">function </span>(entries) {<br/> <span style="color:#cc7832;">for </span>(<span style="color:#cc7832;">var </span>i = <span style="color:#6897bb;">0</span><span style="color:#cc7832;">; </span>i &lt; entries.<span style="color:#9876aa;">length</span><span style="color:#cc7832;">; </span>i++) {<br/> <span style="color:#cc7832;">var </span>item = entries[i]<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if </span>(item.<span style="color:#9876aa;">isIntersecting</span>) {<br/> <span style="color:#ffc66d;">loadElement</span>(item.<span style="color:#9876aa;">target</span>)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span>}<br/> }<br/> })<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;</span><span style="color:#ffc66d;">update</span>()<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> &nbsp; &nbsp;return </span>{<br/> observer: observer<span style="color:#cc7832;">,<br/></span><span style="color:#cc7832;"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color:#ffc66d;">update</span>: <span style="color:#ffc66d;">update<br/></span><span style="color:#ffc66d;"> &nbsp; &nbsp;</span>}<span style="color:#cc7832;">;<br/></span>}</pre><p>低版本浏览器请在上面的代码前引入</p><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:&#39;JetBrains Mono&#39;,monospace;font-size:9.8pt;"><span style="color:#e8bf6a;">&lt;script </span><span style="color:#bababa;">src</span><span style="color:#a5c261;">=&quot;https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver&quot;</span><span style="color:#e8bf6a;">&gt;&lt;/script&gt;</span></pre><p>参考<span style="color: rgb(49, 49, 49); font-family: &quot;Microsoft Yahei UI&quot;, &quot;Microsoft Yahei&quot;, &quot;Helvetica Neue&quot;, Helvetica, &quot;Nimbus Sans L&quot;, Arial, &quot;Liberation Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;Wenquanyi Micro Hei&quot;, &quot;WenQuanYi Zen Hei&quot;, &quot;ST Heiti&quot;, SimHei, &quot;WenQuanYi Zen Hei Sharp&quot;, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);">来源:https://juejin.cn/post/6844904066418491406#heading-3</span></p>
相关文章
热门推荐