拉伸和缩放CSS背景


Answers:


267

对于现代浏览器,您可以使用background-size以下命令完成此操作:

body {
    background-image: url(bg.jpg);
    background-size: cover;
}

cover 表示垂直或水平拉伸图像,以使其永远不会平铺/重复。

适用于Safari 3(或更高版本),Chrome,Opera 10 +,Firefox 3.6+和Internet Explorer 9(或更高版本)。

要使其与较低版本的Internet Explorer一起使用,请尝试以下CSS:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";

2
顺理成章:您对以前的IE:过滤器的建议仅部分起作用。它可以按比例缩放图片的宽度,但高度缩放错误,因为它不限制任何内容。页面越高,背景图片就越多。.=(我在IE8上尝试过此方法。此外,无论如何,可以使用这些“ cover”命令使它与iphone等手机兼容吗?我知道这里有视口问题,但可能以将背景缩放到整个屏幕的方式将视口缩放到整个屏幕吗?感谢您的回复!

3
特定于IE的过滤器不是理想的解决方案,因此可以使用CSS替代品随意调整IE的条件。我个人在自己的网站上使用CSS3“封面”,并且在iOS设备上运行良好,只需确保定义设备宽度即可。
Clement

9
掩护不会拉扯背景。100%100%是。
neoswf 2012年

对于我不想水平或垂直拉伸图像超过实际分辨率的图像,此解决方案最适合我。谢谢..!!
Noddy先生

1
注意:从Chromium 78.0.3904.97开始,不可能沿每个轴独立缩放svg图像。您可能需要按比例放大并将其转换为光栅图像。
迈克,

567

使用CSS 3属性background-size

#my_container {
    background-size: 100% auto; /* width and height, can be %, px or whatever. */
}

自2012年以来,此功能可用于现代浏览器。


93
要保留图像的长宽比,应使用“ background-size:cover;”。或“ background-size:包含;”。我建立了一个可在IE8中实现这些值的polyfill
-Rémi

6
我知道这已经一岁了,但我必须(笑着)同意“体面的浏览器”部分。检查所有浏览器,但IE的问题比其他任何浏览器都多。
ErocM 2013年

36
background-size: 100% 100%;如果必须帮助其他人,我必须努力获得想要的效果。
guanome

1
的解释covercontain 对MDN
mohas

2
这实际上是行不通的。问题是要填充容器,这意味着我们希望它拉伸以免重复。另一方面,如果高度未覆盖该区域,则该答案将在高度方向上重复。“拉伸填充”是指拉伸,但是您必须这样做,所以不会重复。正确的答案是从下面“发现”。这实际上可以解决这种情况。
gman 2015年

171

用CSS缩放图像的可能性不大,但是可以通过以下方式实现类似的效果。

使用此标记:

<div id="background">
    <img src="img.jpg" class="stretch" alt="" />
</div>

使用以下CSS:

#background {
    width: 100%; 
    height: 100%; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:100%;
}

并且应该完成!

为了将图像缩放为“全出血”并保持宽高比,您可以改为:

.stretch { min-width:100%; min-height:100%; width:auto; height:auto; }

效果很好!但是,如果裁切了一个尺寸,它将仅在图像的一侧裁切,而不是在两侧均等地裁切(并居中)。我已经在Firefox,Webkit和Internet Explorer 8中对其进行了测试。


2
效果很好...但是一直在寻找一些更强大的功能(可能使用javascript),该功能还可以将其居中并根据图片是横向还是纵向进行调整。如果有人在这个方面有解决方案,那就喜欢链接...谢谢!
Brian Armstrong 2010年

4
万一其他人感兴趣,这似乎很好用:buildinternet.com/project/supersized
Brian Armstrong,2010年

1
水平居中可以通过margin: 0 autoon进行.stretch。通过仅设置widthheight,纵横比将保持不变。尝试使用max-widthmax-height限制缩放比例...
罗纳德

1
在ie8 / ie9中,这对我不起作用,但在ie6 / ie7中(当然,在所有其他浏览器中)也有效。在ie8 / ie9中,图像仅显示约div的3/4。有人有同样的问题吗?

3
SO的缺陷:无法标记不再正确的答案,从而导致像@Ullas这样的人误入歧途。在所有现代浏览器中轻松缩放背景。developer.mozilla.org/en/CSS/background-size
Glenn Maynard

161

在CSS3中使用background-size属性

.class {
     background-image: url(bg.gif);
     background-size: 100%;
}

编辑: Modernizr支持检测背景大小的支持。您可以使用编写的JavaScript解决方法来工作,但是您需要它,并且在没有支持的情况下动态加载它。这将保持代码的可维护性,而无需借助某些浏览器的侵入式CSS hack。

我个人使用脚本来处理jQuery,它是imgsizer的改编。正如我现在所做的大多数设计一样,使用宽度%表示设备间的流体布局,对其中一个回路略有适应(说明尺寸并非总是100%):

for (var i = 0; i < images.length; i++) {
    var image = images[i],
        width = String(image.currentStyle.width);

    if (width.indexOf('%') == -1) {
        continue;
    }

    image.origWidth = image.offsetWidth;
    image.origHeight = image.offsetHeight;

    imgCache.push(image);
    c.ieAlpha(image);
    image.style.width = width;
}

编辑: 您可能还对jQuery CSS3 Finaliz [s] e感兴趣。


3
只是强调一下,Modernizr并未在本身不支持背景大小的浏览器中启用对背景大小的支持。它只是有一个方便的跨浏览器测试。当测试返回false时,由您来伪造它。
克里斯·莫斯奇尼

34

尝试文章background-size。如果使用以下所有选项,它将在Internet Explorer以外的大多数浏览器中运行。

.foo {
    background-image: url(bg-image.png);
    -moz-background-size: 100% 100%;
    -o-background-size: 100% 100%;
    -webkit-background-size: 100% 100%; 
    background-size: 100% 100%;
} 

1
谢谢!这不同于“背景大小:封面”
Pavel Vlasov

1
这在ipad上对我来说是很困难的,但没有扩展。张贴thx。
唐·科特

1
这也非常适合使其背景缩小。谢谢!
bealalex 2012年

1
如果背景图像是SVG,则还必须preserveAspectRatio="none"在SVG中指定。关于这方面更多的信息在这里。演示在这里
心理学家

您可以使用background-size:cover; 背景附件:固定;您可以缩放它
Siraj Ahmed

15

不是现在。它会在CSS 3中提供,但是要在大多数浏览器中实现它需要一些时间。


2
出色的文章可在A List Apart上找到:请放大该背景!
jensgram

3
-1我认为这个答案不是很相关...并且它不提供任何解决方案。
2011年

1
@Potherca这个答案当时(大约3年前)是正确的。
伊兰·加尔珀林

4
有显示日期的原因。应该保留它作为历史参考。您是否要遍历网站上所有的旧答案并否决它们?即使此后添加了更多信息,答案仍然是正确的。还要注意,这里的其他答案基本上都表示相同(有些确实不正确-他们表示这是不可能的)。我有一种选择,因为它有一些票,我有种感觉。
伊兰·加珀林

3
不,我选择这是因为,即使是在2008年也有针对此问题的几种解决方案,它所做的只是说“计算机说不” ;-)
Potherca 2011年

15
.style1 {
        background: url(images/bg.jpg) no-repeat center center fixed;
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
}

适用于:

  • Safari 3+
  • Chrome Whatever +
  • IE 9+
  • Opera 10+(Opera 9.5支持背景大小,但不支持关键字)
  • Firefox 3.6+(Firefox 4支持非供应商前缀版本)

另外,您可以尝试此解决方案

    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
    -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
    zoom:1;

感谢Chris Coyier的这篇文章 http://css-tricks.com/perfect-full-page-background-image/


这与“背景尺寸:封面”相比有何不同?
PKHunter '17

@PKHunter,我不确定您要引用的是什么。这background-size: cover与浏览器前缀和IE解决方案一起使用
Blowsie

8

一言以蔽之。拉伸图像的唯一方法是使用<img>标签。您必须要有创造力。

在写答案时,这在2008年是正确的。今天,现代的浏览器支持background-size解决了这个问题。注意IE8不支持它。


6
@Blowsie-可爱 检查答案日期。在过去的5年中,浏览器的格局发生了一些变化。
Vilx-

5

定义“拉伸和缩放” ...

如果您具有位图格式,则通常无法对其进行拉伸和拉长。您可以使用可重复模式来产生相同效果的错觉。例如,如果您的渐变朝向页面底部变浅,那么您将使用一个宽度为单个像素且高度与容器相同的图形(或者最好是较大尺寸以考虑缩放),然后将其平铺在页。同样,如果渐变跨过页面,则它将比您的容器高1像素宽,然后在页面上向下重复。

通常,为了使容器扩展或收缩时,它可以拉伸以填充容器,使图像比容器大。任何重叠都不会在容器的边界之外显示。

如果您想要的效果依赖于具有弯曲边缘的盒子之类的东西,那么您应该将盒子的左侧粘贴到容器的左侧,并且要有足够的重叠,以至于(在一定程度上)无论容器有多大,它都不会用尽了背景,然后在带有弯曲边缘的框的右侧图像上分层并将其放置在容器的右侧。因此,随着容器的收缩或增长,弯曲的盒子效果似乎随之收缩或增长-实际上并没有,但它给人以错觉。

至于真正使图像随容器缩小和增长,您需要使用一些分层技巧来使图像看起来像是背景,并需要一些JavaScript来随容器调整大小。目前没有使用CSS的方法...

如果您正在使用矢量图形,恐怕您就超出了我的专业领域。


拉伸=更改x和y尺寸独立更改图像的纵横比,比例=更改x和y尺寸按比例保持图像的纵横比。
劳伦斯·多尔

@SoftwareMonkey:在没有背景的情况下,您不能在纯CSS中真正意义上的范围内更改拉伸和缩放比例。您必须使用各种CSS技巧来使人错觉,这就是我所描述的。
BenAlabaster

4

这就是我所做的。在拉伸班中,我只是将高度更改为auto。这样,您的背景图片始终具有与屏幕宽度相同的大小,并且高度始终具有正确的大小。

#background {
    width: 100%;
    height: 100%;
    position: absolute;
    margin-left: 0px;
    margin-top: 0px;
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}

2

添加background-attachment一行:

#background {
    background-attachment:fixed;
    width: 100%; 
    height: 100%; 
    position: absolute; 
    margin-left: 0px; 
    margin-top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}

2

我想指出的是,这等效于:

html { width: 100%; height: 100%; }
body { width: 100%; height: 100%; /* Add background image or gradient to stretch here. */}

2

这里的另一个伟大的解决方案是Srobbin的终点直道可以应用到身体或任何元素在页面上- http://srobbin.com/jquery-plugins/backstretch/


尼克,我们通常要求您提供答案中的重要部分,并仅提供外部链接以获取更多详细信息-这有助于答案在链接腐烂的情况下仍然有用。
劳伦斯·多尔

1
我的错。一般而言,您可以在文档的<head>中添加backstretch,然后像这样进行初始化:$(“。your-element”)。backstretch(“ path / to / image.jpg”);
尼克

2

尝试这个

http://jsfiddle.net/5LZ55/4/

body
{ 
    background: url(http://p1.pichost.me/i/40/1639647.jpg) no-repeat fixed; 
    background-size: cover;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
}

1

SolidSmile作弊的另一个技巧是通过设置宽度并使用“自动”设置高度来缩放(按比例重新调整大小)。

例如:

#background {
    width: 500px;
    height: auto;
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

0

使用该border-image : yourimage属性设置图像并将其缩放到屏幕或窗口的整个边框。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.