<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>响应式图片 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9B%BE%E7%89%87/</link><description>Recent content in 响应式图片 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 06 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9B%BE%E7%89%87/index.xml" rel="self" type="application/rss+xml"/><item><title>响应式图片</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-008/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-008/</guid><description>&lt;p&gt;响应式是指实现不同屏幕分辨率的终端上浏览网页的不同展示方式。&lt;/p&gt;
&lt;p&gt;本知识点的主要内容有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么要使用响应式图片&lt;/li&gt;
&lt;li&gt;怎么实现响应式图片&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1为什么要使用响应式图片"&gt;1、为什么要使用响应式图片&lt;/h2&gt;
&lt;p&gt;假如有一张图片的显示宽度为200px，那么，它在 &lt;code&gt;1x&lt;/code&gt;（即设备像素比为 1 的显示器） 的显示器上，是占了 200 个物理像素（即实际所占的像素）；它在 &lt;code&gt;2x&lt;/code&gt; 的显示器上，实际上是占了 400 个物理像素；在 &lt;code&gt;3x&lt;/code&gt; 的显示器上，实际上是占了 600 个物理像素；在 &lt;code&gt;4x&lt;/code&gt; 的显示器上就是占了 800 个物理像素。&lt;/p&gt;
&lt;p&gt;如果这个图片只提供 200 像素的尺寸，那么在 &lt;code&gt;2x~4x&lt;/code&gt; 的显示器上看起来就很模糊。如果只提供 800 像素的版本，那么在 &lt;code&gt;1x~3x&lt;/code&gt; 的设备上会显得多余，因为加载时间会相较长，所以我们要使用响应式图片。&lt;/p&gt;
&lt;p&gt;再比如一个场景，相同的banner，在电脑上需要使用大图，但是手机上面使用小图，不然会造成手机上加载慢浪费流量等问题，这也可以使用响应式图片来解决。&lt;/p&gt;
&lt;h2 id="2实现方法"&gt;2、实现方法&lt;/h2&gt;
&lt;h3 id="css3-media-query"&gt;css3 media query&lt;/h3&gt;
&lt;p&gt;一个办法是使用&lt;code&gt;backgound-image&lt;/code&gt;结合媒体查询，如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.banner&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-image: url&lt;span style="color:#f92672"&gt;(&lt;/span&gt;/static/large.jpg&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@media screen and &lt;span style="color:#f92672"&gt;(&lt;/span&gt;max-width: 767px&lt;span style="color:#f92672"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-image: url&lt;span style="color:#f92672"&gt;(&lt;/span&gt;/static/small.jpg&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种方法的缺点是对SEO不太友好，因为如果使用img标签还可以写个alt属性。&lt;/p&gt;
&lt;h3 id="picture标签"&gt;picture标签&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;picture&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;source&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;srcset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w1000.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;media&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(min-width: 801px)&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;source&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;srcset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w800.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;media&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(max-width: 800px)&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w800.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;picture&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如上，如果页面宽度大于800px（PC），则加载大图，而在手机上加载小图。这样写浏览器就只会加载source里面的一张图片。但是如果是用js动态插进去的，它还是会去加载两张，只有写在html里面加载初始化页面的时候才只加载一张。&lt;/p&gt;
&lt;p&gt;picture必须要写img标签，否则无法显示，对picture的操作最后都是在img上面，例如onload事件是在img标签触发的，picture和source是不会进行layout的，它们的宽和高都是0。&lt;/p&gt;
&lt;p&gt;另外使用source，还可以对图片格式做一些兼容处理：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;picture&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;source type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image/webp&amp;#34;&lt;/span&gt; srcset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner.webp&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;img src&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner.jpg&amp;#34;&lt;/span&gt; alt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/picture&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;webp在保持同等清晰度的情况下，体积可以减少一半，但是目前只有Chrome支持，Safari和firefox一直处于实验阶段，所以其它的浏览器如firefox将会加载jpg格式的照片：&lt;/p&gt;</description></item></channel></rss>