object-view-box

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

object-view-box 这个 CSS 属性在可替换元素中定义一个矩形作为可视区域(视区),从而可以缩放或平移可替换元素的内容。它的工作方式类似于 SVG 的 viewBox 属性。

试一试

object-view-box: inset(0 0);
object-view-box: inset(20%);
object-view-box: xywh(95px 20px 60px 60px);
object-view-box: rect(110px 120px 200px 45px);
object-view-box: none;
<section id="default-example">
  <img
    class="transition-all"
    id="example-element"
    src="/shared-assets/images/examples/plumeria-146x200.jpg"
    alt="A close-up of red flowers and buds on a branch." />
</section>
#example-element {
  height: 100%;
  width: 100%;
  border: 2px dotted #888888;
}

@supports not (object-view-box: none) {
  body::before {
    content: "Your browser does not support the 'object-view-box' property.";
    color: black;
    background-color: #ffcd33;
    display: block;
    width: 100%;
    text-align: center;
  }
}

语法

css
/* keywords */
object-view-box: none;

/* <basic-shape-rect> functions */
object-view-box: inset(20%);
object-view-box: inset(20% 30%);
object-view-box: inset(10px 0 25px 33px);
object-view-box: xywh(95px 20px 60px 60px);
object-view-box: rect(10px 30px 30px 10px);

/* Global values */
object-view-box: inherit;
object-view-box: initial;
object-view-box: revert;
object-view-box: revert-layer;
object-view-box: unset;

none

元素没有视区。这是默认值。

<basic-shape-rect>

一个 inset()xywh()rect() 函数,为具有自然尺寸(可替换元素)的元素指定一个视区。否则,解析为 none

描述

object-view-box 属性可用于裁剪或调整可替换元素的大小,包括图像和视频。它的工作原理是在为该元素保留的可用空间中显示可替换元素内容的一部分。显示的可替换元素的部分由该属性的值定义。可用的保留空间由元素的默认外部尺寸决定。显示的内容子区域可以放大、缩小或以其原始尺寸呈现,同时保持内容的固有宽高比

该属性值为 <basic-shape-rect>,是 <basic-shape> 函数中仅限于定义矩形形状的一种。例如,该值可以是 xywh() 函数

css
img {
  object-view-box: xywh(410px 0 400px 150px);
}

在这种情况下,将要显示的图像部分的左上角距离左边缘 410px,距离顶部 0,这由 x 和 y 坐标参数定义。将要显示的原始图像部分的大小为 400px 宽、150px 高;即函数的 wh 分量。这个 400x150 的图像部分将显示在页面布局时为图像本身保留的空间中。显示的内容部分是其原始固有尺寸、放大还是缩小,分别取决于视区是 400px x 150px、小于还是大于图像元素的尺寸。

The leopard image cropped using object-view-box property, with a 400px by 150px viewbox displaying an unscaled section of the image

在这种情况下,由于 object-view-box 属性定义的矩形视区和 <img> 元素的矩形区域大小相同,即 400 x 150 像素,因此可替换元素没有被缩放。

减小 wh 的值可以产生放大效果;因为较小的图像部分被拉伸,所以有放大效果。

增加 wh 参数的值可以产生缩小效果;因为较大的图像部分被收缩,所以有缩小效果。

xy 坐标进行动画处理,通过移动元素的视区而元素本身保持在原位,从而产生平移效果。

正式定义

初始值none
应用于可替换元素
继承性
计算值指定的关键字或计算出的函数
动画类型如有可能则平滑过渡,否则离散

正式语法

object-view-box = 
none |
<basic-shape-rect>

<basic-shape-rect> =
<inset()> |
<rect()> |
<xywh()>

<inset()> =
inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )

<rect()> =
rect( <top> , <right> , <bottom> , <left> )

<xywh()> =
xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [ round <'border-radius'> ]? )

<length-percentage> =
<length> |
<percentage>

<border-radius> =
<length-percentage [0,∞]>{1,4} [ / <length-percentage [0,∞]>{1,4} ]?

示例

基本用法

本示例演示了 object-view-box 属性的基本用法和效果,并使用了三个不同的 <basic-shape-rect> 函数作为示例。

HTML

我们有三个几乎相同的 <img> 元素,包裹在 <figure> 元素中;唯一的区别是它们的类名。

html
<figure>
  <img
    class="intrinsic"
    src="https://mdn.github.io/shared-assets/images/examples/painted-hand.jpg"
    alt="Original scale section of a painted hand" />
  <figcaption>intrinsic</figcaption>
</figure>
<figure>
  <img
    class="zoom-in"
    src="https://mdn.github.io/shared-assets/images/examples/painted-hand.jpg"
    alt="Zoomed in section of a painted hand" />
  <figcaption>zoomed in</figcaption>
</figure>
<figure>
  <img
    class="zoom-out"
    src="https://mdn.github.io/shared-assets/images/examples/painted-hand.jpg"
    alt="Zoomed out section of a painted hand" />
  <figcaption>zoomed out</figcaption>
</figure>

CSS

我们为所有图像设置了相同的宽度和高度,然后为每个类(即每个图像)设置了不同的 object-view-box 值。彩绘手图像的固有尺寸为 298px x 332px。我们设置了 heightwidth,将外部尺寸设置为 200px x 200px

css
img {
  width: 200px;
  height: 200px;
  border: 1px solid red;
}

我们使用三个不同的形状函数设置了三个不同的 object-view-box 属性值。intrinsic 元素的 xywh() 函数值显示了一个 200px 的正方形图像内容区域,从左侧 70px 和顶部 90px 处开始。zoom-in 元素的 rect() 函数显示了原始元素的一个 160px 的正方形区域,从上边缘的 110px270px,以及从左边缘的 90px250pxzoom-out 可替换元素的 inset() 函数显示了原始元素的一个 298px 的正方形区域;显示了图像的整个宽度,同时从顶部和底部各裁剪了 17px。

css
.intrinsic {
  object-view-box: xywh(70px 90px 200px 200px);
}

.zoom-in {
  object-view-box: rect(110px 250px 270px 90px);
}

.zoom-out {
  object-view-box: inset(17px 0 17px 0);
}

结果

intrinsic 版本显示的是未缩放的图像部分。zoom-in 版本显示的是图像的一个较小部分(160px 正方形),被放大以适应 200px 正方形的视区。由于该部分被拉伸,看起来是放大的。zoom-out 版本显示的是图像的一个较大部分(298px 正方形),被缩小以适应 200px 正方形的视区。由于该部分被收缩,看起来是缩小的。

使用 object-view-box 属性实时放大

此示例演示了如何使用 object-view-box 属性在静态大小的 HTML 元素内放大和缩小可替换元素的一部分。在本例中,一张非常大的图像中豹子的眼睛作为缩放效果的焦点。

HTML

我们包含一个 <img> 元素和一个 range <input> 元素,以及一个关联的 <label>。原始豹子图像的自然尺寸,即固有尺寸,为 1244px 宽、416px 高,宽高比3:1

html
<img
  src="https://mdn.github.io/shared-assets/images/examples/leopard.jpg"
  alt="leopard" />
<p>
  <label for="box-size">Zoom-in: </label>
  <input type="range" id="box-size" min="115" max="380" value="150" />
</p>
<output></output>

CSS

我们定义了一个 --box-size 自定义属性,它在 xywh() 函数中用作高度和宽度,从而创建了一个宽高比为 1:1 的正方形视区。视区的偏移点,即我们缩放效果的焦点,x 坐标设置为 500pxy 坐标设置为 30px,这对应于豹子右眼的左上角。

css
img {
  width: 350px;
  height: 350px;
  border: 2px solid red;

  --box-size: 150px;
  object-view-box: xywh(500px 30px var(--box-size) var(--box-size));
}

JavaScript

我们为滑块添加一个事件监听器,当用户与之交互时,更新 --boxSize 自定义属性的值。为了在滑块向右移动时增加放大效果,滑块的值通过从 500px 中减去它来反转,因为减小视区尺寸会增加放大效果。

js
const img = document.querySelector("img");
const zoom = document.getElementById("box-size");
const output = document.querySelector("output");

function update() {
  const size = 500 - zoom.value;
  img.style.setProperty("--box-size", `${size}px`);
  output.innerText = `object-view-box: xywh(500px 30px ${size}px ${size}px);`;
}

zoom.addEventListener("input", update);
update();

结果

向右移动滑块以增加放大效果,向左移动以减少放大效果。滑块只影响视区的尺寸,而 x 和 y 值(视区的原点)保持不变。<img> 元素的尺寸也不变。

使用 object-view-box 属性进行平移

此示例演示了通过对 object-view-box 属性值进行动画处理来平移图像。

HTML

HTML 中包含一张图片。

html
<img
  src="https://mdn.github.io/shared-assets/images/examples/leopard.jpg"
  alt="leopard" />

CSS

我们定义一个图像尺寸,并保持视区尺寸(即 xywh() 函数的 wh 分量)不变,同时对顶部和左侧位置进行动画处理,在五秒内改变 xy 参数的位置。

css
img {
  width: 350px;
  height: 350px;

  object-view-box: xywh(0 30px 400px 400px);

  animation: panning 5s linear infinite alternate;
}

@keyframes panning {
  from {
    object-view-box: xywh(0 -50px 400px 400px);
  }
  to {
    object-view-box: xywh(800px 68px 400px 400px);
  }
}

结果

规范

规范
CSS 图像模块 Level 5
# propdef-object-view-box

浏览器兼容性

另见