如何让div高度自动调整到背景大小?

Joh*_*dol 245 html css height background

如何在不设置特定高度(或最小高度)的情况下让div自动调整为我为其设置的背景大小?

Has*_*avi 500

有一种非常好的和很酷的方法可以使背景图像像img元素一样工作,因此它会height自动调整.你需要知道图像widthheight比例.将height容器的容器设置为0,并padding-top根据图像比率设置百分比.

它将如下所示:

div {
    background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
    background-size: contain;
    background-repeat: no-repeat;
    width: 100%;
    height: 0;
    padding-top: 66.64%; /* (img-height / img-width * container-width) */
                /* (853 / 1280 * 100) */
}
Run Code Online (Sandbox Code Playgroud)

你刚刚得到一个具有自动高度的背景图像,就像img元素一样.这是一个工作原型(你可以调整大小并检查div高度):http://jsfiddle.net/TPEFn/2/

  • 确实太棒了!只是为了后代看到这个答案,如果你正在使用指南针(scss),我使用他们的辅助函数创建了一个mixin来为你做计算:`@mixin div-same-size-as-background-img($ url){background-image:url($ url); background-size:包含; background-repeat:no-repeat; 宽度:100%; 身高:0; padding-top:百分比(image-height($ url)/ image-width($ url)); }` (21认同)
  • 对于那些想知道的人来说,填充顶部不会创建空白区域,因为它只会增加元素的高度.图像是背景图像,因此显示正确的定位和间距.这是非常愚蠢的我们必须为CSS提出这样的技巧. (18认同)
  • 虽然这种方法适用于显示背景图像,但它通过填充填充来渲染div本身不太有用.Kryptik建议在容器内添加一个绝对定位的div,但为什么还要为背景图像烦恼呢?然后你可以在内容div中使用一个实际的图像,如果你只是绝对地将所有内容放在它上面.这首先破坏了使用背景图像的目的. (15认同)
  • @GaryHayes你可以将`position:relative`设置为div并将另一个div放入`position:absolute; 顶部:0; 底部:0; 左:0; 右:0;`设置 (10认同)
  • 不幸的是,padding-top不允许你在div中放置任何其他内容,例如背景上的表单元素. (8认同)
  • 最终,我最终将填充计算再次分为两半,并将其分别划分为顶部和底部(即“ padding:61.805%0%61.805%0%;”)。这样,至少我打算在背景图像上包含的内容位于div的中间,而不是一直推到底部。但是,这仍然需要一定的负利润。 (2认同)
  • 如果要将内容放在div中而不使用相对/绝对位置(最常用于电子邮件模板),请使用padding-bottom代替 (2认同)
  • 我不了解填充计算。答案是“ 853/1280 * 100”,等于“ 0.006664”。那等式中的“容器宽度”是什么?百分比值?像素值?为什么计算不等于所提供的代码中的内容? (2认同)

Tma*_*mac 238

另一种可能效率低下的解决方案是将图像包含在img元素集下visibility: hidden;.然后使background-image周围的div与图像相同.

这会将周围的div设置为img元素中图像的大小,但将其显示为背景.

<div style="background-image: url(http://your-image.jpg);">
 <img src="http://your-image.jpg" style="visibility: hidden;" />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 也许我错过了一些东西,但是如果你打算在你的标记中添加一个`img`,为什么不简单地*不*隐藏实际的`<img>`而不用"背景图像"呢?以这种方式做事有什么好处? (29认同)
  • 不完全有用,因为图像将使用'空间',内容看起来像有一个很大的边缘顶部. (12认同)
  • @ www139当你说加载时,你究竟是什么意思?图像下载后,可能会被缓存.从那时起,任何其他请求都基于本地副本.所以不行.它没有下载两次.但是,它加载了两次. (4认同)
  • 很好的答案,但浏览器是否必须加载两次呢? (3认同)
  • @MarkAmery 关于 `background-image` 最酷的事情之一是它可以使用 [CSS blend-modes](https://css-tricks.com/basics-css-blend-modes/),而 `img` 不能. (2认同)

Ori*_*rds 35

无法使用CSS自动调整背景图像大小.

您可以通过测量服务器上的背景图像然后将这些属性应用于div来破解它,正如其他人所提到的那样.

您还可以根据图像大小(一旦图像下载后)修改一些javascript以调整div的大小 - 这基本上是相同的.

如果你需要你的div来自动调整图像,我可能会问你为什么不在你<img>的div里放一个标签?

  • ^^这可能不是一个好主意.浏览器可能需要几秒钟才能下载您的图像,并且在此之前您无法测量它,因此您的div将在相当长的时间内以错误的大小悬挂! (3认同)
  • 他可以在文档准备好后运行 JavaScript。 (2认同)
  • 您无法使用媒体查询更改“img”的“src”,但可以使用媒体查询更改用作背景图像的文件。 (2认同)

hor*_*key 21

这个答案与其他答案类似,但对大多数应用程序来说总体上是最好的.你需要事先了解手头的图像尺寸.这将允许您添加叠加文本,标题等,没有负片填充或图像的绝对定位.它们的关键是设置填充%以匹配图像宽高比,如下例所示.我使用了这个答案,基本上只是添加了一个图像背景.

.wrapper {
  width: 100%;
  /* whatever width you want */
  display: inline-block;
  position: relative;
  background-size: contain;
  background: url('https://upload.wikimedia.org/wikipedia/en/thumb/6/67/Wiki-llama.jpg/1600px-Wiki-llama.jpg') top center no-repeat;
  margin: 0 auto;
}
.wrapper:after {
  padding-top: 75%;
  /* this llama image is 800x600 so set the padding top % to match 600/800 = .75 */
  display: block;
  content: '';
}
.main {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  color: black;
  text-align: center;
  margin-top: 5%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div class="main">
    This is where your overlay content goes, titles, text, buttons, etc.
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • -1使用!important - 并链接到另一个答案.请考虑从相应的代码中复制其他答案(带有属性)i,以便这个更完整,并且链接腐烂. (2认同)
  • 是的 - 我推翻了投票.谢谢 (2认同)

Luc*_*eis 15

也许这可以提供帮助,但这不是一个背景,但你明白了:

<style>
div {
    float: left;
    position: relative;
}
div img {
    position: relative;
}

div div {
    position: absolute;
    top:0;
    left:0;
}
</style>

<div>
    <img src="http://antwrp.gsfc.nasa.gov/apod/image/0903/omegacen_davis.jpg" />
    <div>Hi there</div>
</div>
Run Code Online (Sandbox Code Playgroud)


Lan*_*eyo 15

我查看了一些解决方案,它们很棒,但我认为我找到了一种非常简单的方法。

首先,我们需要从背景图像中获取比例。我们只是将一个维度划分为另一个维度。然后我们得到例如 66.4%

当我们有图像比率时,我们可以简单地通过将比率乘以视口宽度来计算 div 的高度:

height: calc(0.664 * 100vw);
Run Code Online (Sandbox Code Playgroud)

对我来说,它可以工作,正确设置 div 高度并在调整窗口大小时更改它。

  • 是的,这是一个巧妙的技巧,但如果图像尺寸已知,为什么不简单地使用图像的高度呢?我认为我们正在寻找的是一种适用于任何图像的解决方案,无需对数字进行硬编码...... (2认同)

mix*_*x3d 12

最近引入的 CSSaspect-ratio属性(~2020-2021) 是一种无需填充黑客即可实现此目的的好方法并且所有常青浏览器都支持。

由于我们需要提前知道图像的长宽比,并且在许多用例中,您将能够提前预先确定图像尺寸比(但并不总是针对用户生成的内容),因此您可以对单一样式进行硬编码或在必要时内联 css。

aspect-ratio当指定宽度时,将根据提供的比率计算高度(如果指定了高度,则计算宽度)。

div {
    /*common ratio, like an 800*600px image */
    aspect-ratio: 3 / 2;
    /* computed height will be 133.33px, which is width/aspect-ratio */
    width: 200px;
    /* red BG for debugging so any image bleed is shown*/
    background: red; 
    background-image: url('https://images.unsplash.com/photo-1631163190830-8770a0ad4aa9?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=200&q=80');
}
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)


Car*_*rpk 11

很确定这一直都不会在这里看到.但如果您的问题与我的问题相同,那么这就是我的解决方案:

.imaged-container{
  background-image:url('<%= asset_path("landing-page.png") %> ');
  background-repeat: no-repeat;
  background-size: 100%;
  height: 65vw;
}
Run Code Online (Sandbox Code Playgroud)

我想在图像的中心有一个div,这将允许我这样做.


Ber*_*ion 9

有一个纯CSS解决方案,其他答案已错过.

"content:"属性主要用于将文本内容插入元素,但也可用于插入图像内容.

.my-div:before {
    content: url("image.png");
}
Run Code Online (Sandbox Code Playgroud)

这将导致div将其高度调整为图像的实际像素大小.要调整宽度,请添加:

.my-div {
    display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)


Ita*_*vka 5

您可以在服务器端执行:通过测量图像然后设置div大小,或者使用JS加载图像,读取它的属性然后设置DIV大小.

这是一个想法,将相同的图像作为IMG标记放在div中,但是给它可见性:隐藏+使用位置相对来玩+给这个div作为背景图像.

  • @GTHell 哈哈哈 - 检查我回答的年份 (2认同)

mar*_*rtz 5

我有这个问题并找到了Hasanavi的答案,但是我在宽屏幕上显示背景图像时遇到了一个小错误 - 背景图像没有扩散到整个屏幕宽度.

所以这是我的解决方案 - 基于Hasanavi的代码,但更好......这应该适用于超宽屏和移动屏幕.

/*WIDE SCREEN SUPPORT*/
@media screen and (min-width: 769px) { 
    div {
        background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
        background-size: cover;
        background-repeat: no-repeat;
        width: 100%;
        height: 0;
        padding-top: 66.64%; /* (img-height / img-width * container-width) */
                    /* (853 / 1280 * 100) */
    }
}

/*MOBILE SUPPORT*/
@media screen and (max-width: 768px) {
    div {
        background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
        background-size: contain;
        background-repeat: no-repeat;
        width: 100%;
        height: 0;
        padding-top: 66.64%; /* (img-height / img-width * container-width) */
                    /* (853 / 1280 * 100) */
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,该background-size: contain;属性不适合超宽屏幕,并且该background-size: cover;属性不适合移动屏幕,因此我使用此@media属性来调整屏幕大小并解决此问题.