Como esticar a imagem de fundo para preencher um div

102

Quero definir uma imagem de plano de fundo para divs diferentes, mas meus problemas são:

  1. O tamanho da imagem é fixo (60px).
  2. Variando o tamanho do div

Como posso esticar a imagem de fundo para preencher todo o fundo do div?

#div2{
  background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
  height:180px;
  width:200px;
  border: 1px solid red;
}

Verifique o código aqui.

Muhammad Usman
fonte

Respostas:

154

Adicionar

background-size:100% 100%;

para seu css abaixo da imagem de fundo.

Você também pode especificar as dimensões exatas, ou seja:

background-size: 30px 40px;

Aqui: JSFiddle

hendos43
fonte
5
IE não suporta isso. O que fazer?
KarSho
9
não funciona, veja abaixo uma resposta melhor: background-size: 100% 100%;
chriscatfr
Por que ele está se multiplicando em vez de esticar a imagem para caber no contêiner: jsfiddle.net/qdzaw/424
SearchForKnowledge
Você precisa adicionarbackground-repeat: no-repeat;
Rorrik
1
hendo, seu JSFiddle não está mais funcionando (links inativos para hootsuite), você pode atualizá-lo?
TylerH
71

Você pode usar:

background-size: cover;

Ou apenas use uma imagem de fundo grande com:

background: url('../images/teaser.jpg') no-repeat center #eee;
Ouadie
fonte
3
a capa não estica, pode cortar a imagem
drdrej
Não sei o que você está tentando fazer com sua imagem de fundo, mas background-size: cover; background-position: centervou preencher o fundo de divsem esticar a imagem
Ouadie
1
Funciona muito bem para fotos em que o alongamento pode disforme a imagem!
Stijn Van Bael,
45

CSS3 moderno (recomendado para o futuro e provavelmente a melhor solução)

.selector{
   background-size: cover;
   /* stretches background WITHOUT deformation so it would fill the background space,
      it may crop the image if the image's dimensions are in different ratio,
      than the element dimensions. */
}

Máx. trecho sem corte nem deformação (pode não preencher o fundo) : background-size: contain;
Força o estiramento absoluto (pode causar deformação, mas sem corte) : background-size: 100% 100%;

CSS "antigo" sempre funcionando "maneira

Imagem de posicionamento absoluto como o primeiro filho do pai (posicionado em relação) e ampliando-o para o tamanho pai.

HTML

<div class="selector">
   <img src="path.extension" alt="alt text">
   <!-- some other content -->
</div>

Equivalente a CSS3 background-size: cover;:

Para conseguir isso dinamicamente, você teria que usar o oposto do método de contenção alternativo (veja abaixo) e se precisar centralizar a imagem recortada, você precisaria de um JavaScript para fazer isso dinamicamente - por exemplo, usando jQuery:

$('.selector img').each(function(){ 
   $(this).css({ 
      "left": "50%", 
      "margin-left": "-"+( $(this).width()/2 )+"px", 
      "top": "50%", 
      "margin-top": "-"+( $(this).height()/2 )+"px" 
   }); 
});

Exemplo prático:
corte css como exemplo

Equivalente a CSS3 background-size: contain;:

Este pode ser um pouco complicado - a dimensão do seu plano de fundo que transbordaria o pai terá o CSS definido para 100% e o outro para automático. Exemplo prático: css esticando o fundo como imagem

.selector img{
   position: absolute; top:0; left: 0;
   width: 100%;
   height: auto;
   /* -- OR -- */
   /* width: auto; 
      height: 100%; */
}

Equivalente a CSS3 background-size: 100% 100%;:

.selector img{
   position: absolute; top:0; left: 0;
   width: 100%;
   height: 100%;
}

PS: Para fazer os equivalentes de cobrir / conter da forma "antiga" de forma completamente dinâmica (para que você não precise se preocupar com estouros / proporções), você teria que usar javascript para detectar as proporções para você e definir as dimensões conforme descrito. ..

jave.web
fonte
2
Resposta muito mais completa do que a outra resposta "Cubra". Infelizmente, está preso bem aqui perto do fundo ...
BillyNair
24

Para isso você pode usar a background-sizepropriedade CSS3 . Escreva assim:

#div2{
    background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
    -moz-background-size:100% 100%;
    -webkit-background-size:100% 100%;
    background-size:100% 100%;
    height:180px;
    width:200px;
    border: 1px solid red;
}

Verifique isto: http://jsfiddle.net/qdzaw/1/

sandeep
fonte
1
IE não suporta isso. O que fazer?
KarSho
4
Para o IE, use a tag IMG para dar posição absoluta com altura e largura 100%.
sandeep
20

Você pode adicionar:

#div2{
    background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
    background-size: 100% 100%;
    height:180px;
    width:200px;
    border: 1px solid red;
}

Você pode ler mais sobre isso aqui: css3 background-size

Xella
fonte
3
Muito melhor do que a resposta aceita, pois isso mostra que o tamanho do fundo aceita 2 valores para largura e altura.
krb686 de
background-size é css3 e não é compatível com todos os navegadores
Mahdi Jazini
2
body{
  margin:0;
  background:url('image.png') no-repeat 50% 50% fixed;
  background-size: cover;
}
Kursat Turkay
fonte
1

usando css de propriedade:

background-size: cover;
MrBii
fonte
background-size é um css3 e não é compatível com todos os navegadores
Mahdi Jazini
1

Uso: tamanho do fundo: 100% 100%; Para fazer com que a imagem de fundo se ajuste ao tamanho do div.

jagan reddy
fonte
Isso é o que eu procurava - esticar para caber sem levar em conta a proporção do original. Obrigado.
dgig
0

Para manter a proporção, use background-size: 100% auto;

div {
    background-image: url('image.jpg');
    background-size: 100% auto;
    width: 150px;
    height: 300px;
}
Atul Yadav
fonte
0

Experimente algo assim:

div {
    background-image: url(../img/picture1.jpg);
    height: 30em;
    background-repeat: no-repeat;
    width: 100%;
    background-position: center;
}
DJ
fonte