以 % 为单位缩放 HTML 图像的宽度和高度

Aru*_*yan 17 html javascript css image

我知道 HTML 图像的宽度和高度属性可以简单地通过<img src="Debian.jpg" style="height: 120px; width: 130px">.

我正在寻找的是,是否存在一个 CSS 属性,该属性只取一个值,%并根据该百分比缩放原始图像的宽度和高度。例如,如果高度和宽度Debian.jpg1000x700与我指定50%在CSS属性然后将图像按比例缩小到500x350,因此纵横比被维持。

我很难在单独调整高度和宽度的同时保持图像的纵横比。如果这样的属性不存在,那么有什么方法可以保持纵横比并获得所需的图像尺寸?

Ric*_*ard 6

是的,有一种方法可以保持图像的纵横比并将图像调整为原始尺寸的一小部分。但是,CSS 无法知道图像的内在大小(原始大小)。因此,您只能做两件事:

  • 明确告诉 CSS 原始大小
  • 使用JS获取图片加载时的原始大小

什么不起作用

使用百分比值作为widthfor的值img是行不通的,因为百分比值解析为其容器大小的百分比,而不是其原始大小。下面,我演示了不起作用的例子。

话虽如此,我个人通常希望明确指定图像的宽度。例如,在大型设备上,我希望图像为 1080 像素。在较小的设备上,我希望图像为 560 像素。我可以简单地为明确大小的图像创建一个容器,将图像放在容器内,并将图像的宽度指定为 100%(其容器大小)。


什么有效

如前所述,有两种方法可以使图像达到其原始宽度的 50%。首先,使用JS。其次,明确告诉 CSS 原始图像宽度。

  • 使用 JS 方法,您只需更改图像的宽度。加载时,获取图像的固有宽度,然后将新宽度设置为固有宽度除以 2。简单。
  • 使用 tell-CSS-explicitly 方法不太有利。此解决方案假定图像始终相同,并且需要您(开发人员)事先知道原始图像大小。当您更改原始图像大小时,您还需要更新您的代码。话虽如此,您可以通过在 CSS 类中指定一个CSS 自定义属性、指定一个提供固有宽度的属性(在 HTML 中)然后使用attr()(仍然是实验性的并且大多不受支持)或使用一个intrinsicsize属性和通过 CSS设置widthstyle(仍然是实验性的,不受支持)。如上所述,最后两个解决方案不受大多数​​浏览器的支持,并且可能还不能正常工作。

在我看来,将图像的宽度设置为其固有宽度的 50% 的最佳选择是使用 JS。这是一个解决方案,演示了无效的解决方案和 JS 解决方案。如果您只更改图像的尺寸(宽度/高度)之一,则纵横比会自动保持。

const imageJS = document.querySelector('.image--changed-with-js')

imageJS.onload = () => {
  const intrinsicWidth = imageJS.width
  imageJS.width = imageJS.width / 2
}
Run Code Online (Sandbox Code Playgroud)
* {
  box-sizing: border-box;
}

body,
html {
  margin: 0px;
}

img {
  margin: 20px 0;
}

/* Image has its intrinsic size (i.e. the original image size) */
.image--original {
  width: auto;
}

/* Image contained within a 500px container
 Image has a width of 50% of 500px = 250px */
.container {
  width: 500px;
}

.image--changed-with-container {
  width: 50%;
}

/* Image is not contained within a div
However, image is inside body
<body> is its container
It now has a width of 50% of the body
NOT 50% of its intrinsic width */
.image--changed-without-container {
  width: 50%;
}

/* Image changed using JS
You can get the intrinsic size through JS and modify its size there */
.image--changed-with-js {}
Run Code Online (Sandbox Code Playgroud)
<img class="image--original" src="https://img.freepik.com/free-vector/abstract-galaxy-background_1199-247.jpg?size=626&ext=jpg">

<div class="container">
  <img class="image--changed-with-container" src="https://img.freepik.com/free-vector/abstract-galaxy-background_1199-247.jpg?size=626&ext=jpg">
</div>

<img class="image--changed-without-container" src="https://img.freepik.com/free-vector/abstract-galaxy-background_1199-247.jpg?size=626&ext=jpg">

<img class="image--changed-with-js" src="https://img.freepik.com/free-vector/abstract-galaxy-background_1199-247.jpg?size=626&ext=jpg">
Run Code Online (Sandbox Code Playgroud)