CSS图像调整自身的百分比?

Min*_* Lo 94 html css image

我试图用自己的百分比来调整img的大小.例如,我只想将图像缩小到50%,将图像缩小一半.但是应用width: 50%;会将图像的大小调整为容器元素的50%(<body>例如,可能是父元素).

问题是,我可以在不使用javascript或服务器端的情况下用一定比例调整图像大小吗?(我没有图像大小的直接信息)

我很确定你不能这样做,但我只想看看是否有智能的CSS解决方案.谢谢!

Vla*_*kov 99

我有2种方法.

方法1. 在jsFiddle上演示

此方法仅调整图像大小,而不是DOM中的实际尺寸,以及调整大小后居中于原始大小中间的视觉状态.

HTML:

<img class="fake" src="example.png" />
Run Code Online (Sandbox Code Playgroud)

CSS:

img {
  -webkit-transform: scale(0.5); /* Saf3.1+, Chrome */
     -moz-transform: scale(0.5); /* FF3.5+ */
      -ms-transform: scale(0.5); /* IE9 */
       -o-transform: scale(0.5); /* Opera 10.5+ */
          transform: scale(0.5);
             /* IE6–IE9 */
             filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9999619230641713, M12=-0.008726535498373935, M21=0.008726535498373935, M22=0.9999619230641713,SizingMethod='auto expand');
}?
Run Code Online (Sandbox Code Playgroud)

浏览器支持说明:浏览器统计信息显示为内嵌css.

方法2. 在jsFiddle上演示

HTML:

<div id="wrap">
    <img class="fake" src="example.png" />
    <div id="img_wrap">
        <img class="normal" src="example.png" />
    </div>
</div>?
Run Code Online (Sandbox Code Playgroud)

CSS:

#wrap {
    overflow: hidden;
    position: relative;
    float: left;
}

#wrap img.fake {
    float: left;
    visibility: hidden;
    width: auto;
}

#img_wrap {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

#img_wrap img.normal {
    width: 50%;
}?
Run Code Online (Sandbox Code Playgroud)

注意: img.normalimg.fake图像相同.
浏览器支持说明:此方法适用于所有浏览器,因为所有浏览器都支持css方法中使用的属性.

该方法以这种方式工作:

  1. #wrap#wrap img.fake有流动
  2. #wrap具有overflow: hidden使得它的尺寸是相同的内图像(img.fake)
  3. img.fake#wrap没有absolute定位的唯一内部元素,因此它不会破坏第二步
  4. #img_wrap具有absolute内部定位#wrap和尺寸延伸到整个元件(#wrap)
  5. 第四步的结果是#img_wrap具有与图像相同的尺寸.
  6. 通过设置width: 50%img.normal,它的大小是50%#img_wrap,因此50%原始图像的尺寸.

  • 这不会将图像大小调整为原始大小的 50%,它现在是 img_wrap 父级的 50%。 (2认同)
  • 不过,`transform:scale()` 解决方案有一个大问题。它不能与 CSS 盒模型很好地交互。我的意思是它*根本*不与它交互,所以你得到的布局看起来都错了。见:http://jsfiddle.net/kahen/sGEkt/8/ (2认同)

小智 38

HTML:

<span>
    <img src="example.png"/>
</span>
Run Code Online (Sandbox Code Playgroud)

CSS:

span {
    display: inline-block;
}
img {
    width: 50%;
}
Run Code Online (Sandbox Code Playgroud)

这必须是使用容器元素方法的最简单的解决方案之一.

当使用容器元件的方法,这个问题的变化这个问题.诀窍是让容器元素收缩包装子图像,因此它的大小将等于未图像化图像的大小.因此,当将width图像的属性设置为百分比值时,图像相对于其原始比例缩放.

其他一些shrinkwrapping启用属性和属性值的是:float: left/right,position: fixed并且min/max-width,如在链接的问题提及.每种都有自己的副作用,但是display: inline-block会更安全.马特float: left/right在他的回答中提到过,但他错误地将其归因于此overflow: hidden.

在jsfiddle上演示


编辑: 正如木马所提到的,您还可以利用新引入的CSS3内在和外在大小模块:

HTML:

<figure>
    <img src="example.png"/>
</figure>
Run Code Online (Sandbox Code Playgroud)

CSS:

figure {
    width: intrinsic;
}
img {
    width: 50%;
}
Run Code Online (Sandbox Code Playgroud)

但是,在撰写本文时,并非所有流行的浏览器版本都支持它.

  • 对于未来的读者:目前在“figure”上设置的正确值是“width: fit-content;”。如今,浏览器支持也好多了。 (2认同)

Emi*_*dın 11

尝试zoom财产

<img src="..." style="zoom: 0.5" />
Run Code Online (Sandbox Code Playgroud)

编辑:显然,FireFox不支持zoom属性.你应该使用;

-moz-transform: scale(0.5);
Run Code Online (Sandbox Code Playgroud)

对于FireFox.

  • 不幸的是,这些信息已过时.目前,Internet Explorer,Chrome和Safari浏览器都支持缩放功能.FireFox和Opera还不支持它.这就是我添加编辑部分的原因.IE是第一个支持它但不是唯一支持它的人. (7认同)
  • 没有像"缩放"那样的CSS属性,除了IE之外,没有人支持它.这是微软专有的东西,非标准的. (3认同)
  • 这就是IE在过去8年中失去一半市场份额的原因.如果您无法可靠地依靠浏览器来支持某些内容,那么您就没有共同点.该规范由浏览器供应商自己编写.如果他们不会把它放在那里,那么就不要依赖它,或者你将像你所做的那样编写多行标记.这不是1998年的全部. (2认同)

ben*_*ace 8

另一种解决方案是使用:

<img srcset="example.png 2x">
Run Code Online (Sandbox Code Playgroud)

它不会验证,因为该src属性是必需的,但它可以工作(在任何版本的 IE 上除外,因为srcset不受支持)。


Max*_*x_B 6

这是一个非常古老的线程,但我在寻找在标准分辨率显示器上显示视网膜(高分辨率)屏幕捕获的简单解决方案时发现了它。

因此,对于现代浏览器,只有 HTML 解决方案:

<img srcset="image.jpg 100w" sizes="50px" src="image.jpg"/>
Run Code Online (Sandbox Code Playgroud)

这告诉浏览器图像是其预期显示尺寸的两倍。该值是成比例的,不需要反映图像的实际大小。也可以使用 2w 1px 来达到相同的效果。src 属性仅用于旧版浏览器。

它的好处是它在视网膜或标准显示器上显示相同的大小,在后者上缩小。