CSS – background-image and styling img
前言
之前写过一些:
这篇作为整理.
Styling img
default behavior
img element width: auto, height: auto 情况下, 会依据图片的 original size 决定.
<div class="container"> <img src="./images/tifa2.PNG" /> div>
效果
红色框是 container 的大小. 图片超过了.
max-width 100%
所以通常 Tailwind, Bootstrap 它们的 base.css 都会给图片设定一个 max-width:100%
当 img 其中 1 个 dimension 有值以后, 它就会按图片的比例 resize.
width, height: 100%
有些情况下, 希望图片完全覆盖框. 也就是说比例会被改变.
img { width: 100%; height: 100%; }
效果
由于, 图片本来的比例是 16:9, 而被强行塞入一个 1:1 的框里, 它就变形了.
object-fit: contain
object-fix 就是用来调整它变形的.
object-fit: contain;
contain 的意思就是把图片完整的塞入, 但是不变形, 而是留白. 好处是图片信息还在, 坏处是留白.
object-fit: cover
完整图 -->
cover 没有造成留白, 但是图片信息却丢失了. 它只截取了中间的部分.
它的步骤是先把图片压缩 (依据比例选择 width, height 其中一边来压缩), 比如上面这个是压缩高度.
图片 vertical 的信息被保留了, 那 horizontal 就需要被牺牲掉. 它默认会保留中间的信息. 所以左右就丢失了.
如果想自行控制它截取的部分. 可以使用
object-position: horizontal vertical
object-position: 70% 0;
通常是用 % 来控制的. 由于 cover 肯定是压缩其中一边, 所以 horizontal vertical 也只需要调 1 边而已.
它的 percent 算法是这样的
第一张是效果图, 第二张是解释它如果从 70% 开始 cut.
object-fit: fill
这个就是默认值, 也就是图片会变形.
object-fit: none
跟 cover 有点像, 只是它不会压小, 它就直接 clip 中间.
这时也是可以用 object-position 来调整. 通常这时就是调 2 边 holizontal 和 vertical
object-fit: none;
object-position: 70% 0%;
效果
它的算法是这样的:
假设图片的 width 是 1349px. 框是 250px
那么 1349 - 250 = 1099px 这个就是 0-100% 的 range.
除于 100 等到 10.99px = 1%
所以用 px 来表达的话是 70 * 10.99px = 769.3px (记得要用 negative value, 不然方向会错)
object-position: -769.3px 0%;
效果是一模一样的.
filters
img { filter: grayscale(100%); /* 黑白照 */ filter: blur(4px); /* 变萌 */ }
还有许多 effects, 但常用的就只有上面 2 个, 更多参考.
Flip Image
镜子效果是通过 scaleX 来做的.
img:hover { transform: scaleX(-1); }
extra 4px at the bottom
参考:
background-image
default behavior
background-image 默认就类似有了 img width, height: 100% 的概念. 它是不会超出 container 的 (废话不然它怎么是 background).
default 它的效果是 object-fit: none
background-size and background-position
其实就是 image 的 object-fit 和 object-position
background-image: url("./images/tifa2.PNG");
background-size: cover;
background-position: 70% 0;
玩法一模一样就不再解释了.
background-repeat
如果图片比 container 小, 默认情况下它会自动重复. 可以 set 成 no-repeat, x-repeat, y-repeat, repeat 来控制它.
multiple background-image
background image 是可以 multiple 的
用逗号分开 1, 2
越靠前的越在上层, 用户越看见.
shorthand 的写法
background-origin
set background image render 位置
background-origin: content-box
border-box, 从 border 开始
padding-box (default), 从 padding 开始
content-box, 从内容开始
background-clip
和 origin 一样, 也是 border-box, padding-box, content-box, 只是它是用来做 paint 的, 比如 color
background-clip: content-box;