添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
在容器内显示图片的五种方案:contain、cover、fill、none、scale-down

在容器内显示图片的五种方案:contain、cover、fill、none、scale-down

大家好,我是前端西瓜哥。今天我们来学习使用 canvas 技术实现图片查看器需要掌握的一个知识点。

需要在一个特定大小的容器内加载并展示一张照片,我们可以怎样进行图片的默认展示?

contain

contain,将图片保持宽高比缩放到刚好能够放入容器,是最常用的方案。

优点是可以一次看到整张图片,缺点是不能填充整个容器,因此会产生 “黑边”。

这里我们假设画布宽高为 400 x 200,图片宽高为 80 x 80。

先看看示例的模板代码。

constcanvas=document.querySelector('canvas'); canvas.width=400; canvas.height=200; constctx=canvas.getContext('2d'); ctx.fillRect(0,0,canvas.width,canvas.height);//填充黑色底色 constimg=newImage(); img.src='./watermelon.jpg';//图片大小为80x80 img.onload=showImg; functionshowImg(){ //这里选择了“contain”方案 constscale=calcContainScale(img.width,img.height,canvas.width,canvas.height); constw=img.width*scale;//图片缩放后的宽度 consth=img.height*scale;//图片缩放后的高度 const{x,y}=calcPos(w,h,canvas.width,canvas.height)//顺便让图片居中 ctx.drawImage(img,x,y,w,h); //计算让图片居中需要设置的x,y functioncalcPos(w,h,cw,ch){ return{ x:(cw-w)/2, y:(ch-h)/2

我们的 calcContainScale() 方法实现为:

/** *contain模式 *@param{number}w图片宽度 *@param{number}h图片高度 *@param{number}cw容器宽度 *@param{number}ch容器高度 *@returns{number}缩放比 functioncalcContainScale(w,h,cw,ch){ constscaleW=cw/w; constscaleH=ch/h; constscale=Math.min(scaleW,scaleH);//取小值 returnscale; }

算法很简单:计算出将图片的宽高分别缩放为容器宽高需要的比例,然后取其中小的即可。

原因很简单,如果你取大的,必然导致另一个长度超过容器尺寸,图片无法被装下。

cover

cover,图片保持宽高比并尽可能充满容器,需要图片的宽缩放为容器宽,或图片的高缩放为容器宽,然后多余的内容截断。

优点是可以用最小的缩放比来填充容器所有的地方,缺点是不能展示图片所有的内容。

functioncalcCoverScale(w,h,cw,ch){ constscaleW=cw/w; constscaleH=ch/h; constscale=Math.max(scaleW,scaleH);//取大值 returnscale;