點燈坊

失くすものさえない今が強くなるチャンスよ

使用 object- 設定 Object Fit

Sam Xiao's Avatar 2021-02-03

若圖片由 API 以 Base64 String 傳回且圖片大小不一,此時 Front-end 為了美觀必須在不改變原圖比例下有相同長寬,此時可使用 Tailwind CSS 的 Object Fit 與 Object Position 完成。

Version

Tailwind CSS 2.1.1

Original

fit000

原圖為 900x506

<template>
  <img src="https://picsum.photos/900/506/?random=10">
</template>

Both Half

fit001

上下左右都縮減為一半。

<template>
  <img class="w-[450px] h-[253px]" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[450px] h-[253px]">

widthheight 各改為 50%,原圖仍維持其比例。

User Size

fit002

使用自訂長寬,width 為 1/4,height 為 1/2,很明顯原圖比例已經跑掉。

<template>
  <img class="w-[225px] h-[253px]" src="https://picsum.photos/900/506/?random=10">
</template>

第 6 行

<img class="w-[225px] h-[253px]">

height 為一半,但 width 變成 1/4

Object Fit

Fill

fit011

原圖比例依然跑掉。

<template>
  <img class="w-[225px] h-[253px] object-fill" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-fill"> 
  • object-fill:將原圖硬塞至指定 size,且喪失原圖比例

可發現 object-fill 有加沒有加最後結果一樣,因為此為 object-fit 的預設值

Contain

fit012

仍然將圖片塞進指定 size,但保留原圖比例。

<template>
  <img class="w-[225px] h-[253px] object-contain" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-contain">
  • object-contain:維持原圖比例並視情況放大或縮小,最後塞進指定 size 內

Cover

fit013

原圖比例不變,只 crop 中間部分。

<template>
  <img class="w-[225px] h-[253px] object-cover" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-cover"> 
  • object-cover:維持原圖比例並縮圖,crop 進指定 size 內

None

fit014

只 crop 部分原圖至指定 size。

<template>
  <img class="w-[225px] h-[253px] object-none" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-none"> 
  • object-none:不改變原圖比例也不縮圖,只 crop 原圖一部分塞進指定 size 內

Scale Down

fit015

看起來與 object-contain 結果相同。

<template>
  <img class="w-[225px] h-[253px] object-scale-down" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-scale-down">
  • object-scale-down:選擇 object-containobject-none 中 file size 較小的呈現

object-scale-down 本質是 CSS 的 object-fit: scale-down

Object Position

Default Value

fit016

看起來與 object-cover 結果相同。

<template>
  <img class="w-[225px] h-[253px] object-cover object-center" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-cover object-center"> 
  • object-center:以原圖 x50%y50% 作為 <img> 的起始點,這也是 object-cover 的預設值,也就是以原圖中心開始顯示,適合大部分使用情境。

object-cover object-center 與只使用 object-cover 結果相同

Right Top

fit017

object-cover 將重點放在右上角。

<template>
  <img class="w-[225px] h-[253px] object-cover object-right-top" src="https://picsum.photos/900/506/?random=10">
</template>

第 2 行

<img class="w-[225px] h-[253px] object-cover object-right-top"> 

若目的在顯示原圖右上角部分,可使用 object-right-top

Conclusion

  • Object Fit 提供多種效果,以本例而言,cover 為最佳效果,可視需求決定
  • Object Position 預設會取得圖片中間部分,可再使用 Object Position 微調重點位置

Reference

Tailwind CSS, Object Fit
Tailwind CSS, Object Position