如何实现响应式图片

如何实现响应式图片

一、js或服务端控制图片加载

eg: js控制图片加载:

function makeImageResponsive() {
  var width = document.body.getBoundingClientRect().width // 获取当前视口宽度
  var img = document.getElementsByTagName('img')[0] // 获取需要切换图片的元素
  // 判断不同视口宽度展示不同图片
  if (width <= 480) {
    img.setAttribute('src', '480.png')
  } else if (width <= 800) {
    img.setAttribute('src', '800.png')
  } else {
    img.setAttribute('src', '1600.png')
  }
}
window.onload = function () {
  window.addEventListener('resize', makeImageResponsive)
  makeImageResponsive()
}

优点:兼容性好
缺点:

  1. 需要命令式的实现响应式逻辑
  2. 与业务逻辑耦合了
二、srcset

img 元素的 srcset 属性用于浏览器根据宽、高和像素来加载相应的图片资源。

属性格式:图片地址 宽度(w)/像素(x),多个资源之间用逗号分隔。

eg:

<img src="img/480.png"  srcset="img/480.png 480w,img/800.png 800w,img/1600.png 1600w"/>

解析:当视口大小的宽度小于等于480px时,显示的图片路径为"img/480.png";当视口大小的宽度大于480px且小于等于800px时,显示的图片路径为"img/800.png";当视口大小的宽度大于等于1600px时,显示的图片路径为"img/1600.png"。

缺点:不是按照图片大小来切换加载图片的,而是按照屏幕大小

三、srcset配合sizes

img 元素的 sizes 属性给浏览器提供一个预估的图片显示宽度。

属性格式:媒体查询 宽度(支持px),多条规则用逗号分隔。

eg:

<img src="img/480.png"  srcset="img/480.png 480w,img/800.png 800w,img/1600.png 1600w"
	 sizes="(min-width:800px) 800px,100vw">

解析:在视口宽度大于等于800px时,图片的预估宽度为800px;其余情况则是100%视口宽度。

优点:解决srcset只能依靠视口大小来切换加载图片的不足。

兼容性:srcset和sizes的兼容性

四、picture标签

<picture> 元素通过包含零或多个 <source> 元素和一个 <img> 元素来为不同的显示/设备场景提供图像版本。浏览器会选择最匹配的子 <source> 元素,如果没有匹配的,就选择 <img> 元素的 src 属性中的URL。然后,所选图像呈现在<img>元素占据的空间中。

source属性:

  • srcset 是图片链接
  • media 是媒体查询条件
  • type 是图片类型

eg:

<picture>
	<!--media是媒体查询的条件-->
	<source media="(min-width:801px)"
			srcset="img/1600.png" />
	<source media="(min-width:481px)" 
			srcset="img/800.png" />
	<img src="img/480.png" />
</picture>

解析:当视口大于等于801px时,展示的图片链接是img/1600.png;当视口大于等于481px时,展示的图片链接是img/800.png;其余情况展示的图片链接是展示的图片链接是img/480.png。

优点:灵活性更高。
兼容性:在这里插入图片描述

五、svg

svg是矢量图形,缩放不会失真和变形。

优点:适用于icon的图片,文件大小较小。

缺点:svg很难去表达色彩层次丰富和逼真的图像效果。

在线制作svg图片: 网站1 & 网站2
在线压缩svg图片: 网站


tips: 使用pollyfill来实现响应式图片的兼容,使用picturefill插件

pollyfill的理解:

  • 一个polyfill是一段代码(或者插件),提供了那些开发者们希望浏览器原生提供支持的功能。
  • 因此,一个polyfill就是一个用在浏览器API上的shim.我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了。
  • 术语polyfill来自于一个家装产品Polyfilla
  • Polyfilla是一个英国产品,在美国称之为Spackling Paste(译者注:刮墙的,在中国称为腻子)。记住这一点就行:把旧的浏览器想象成为一面有了裂缝的墙,这些polyfill会帮助我们把这面墙的裂缝抹平,还我们一个更好的光滑的墙壁(浏览器)。

在html中引用picturefill.min.js即可。

<script src="./js/vendor/picturefill.min.js"></script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值