Esticar e dimensionar o fundo do CSS

653

Existe uma maneira de obter um background em CSS para esticar ou dimensionar para preencher seu contêiner?

Lawrence Dol
fonte

Respostas:

267

Para navegadores modernos, você pode fazer isso usando background-size:

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

cover significa esticar a imagem na vertical ou na horizontal, para que nunca se repita.

Isso funcionaria para o Safari 3 (ou posterior), Chrome, Opera 10+, Firefox 3.6+ e Internet Explorer 9 (ou posterior).

Para que ele funcione com versões inferiores do Internet Explorer, tente o seguinte CSS:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
Clemente
fonte
2
Para Clement: O que você sugere para filtros para o IE: s anterior funciona apenas parcialmente. Escala a largura da imagem, mas a escala da altura dá errado, não restringindo-a a nada. Quanto maior a página, mais a imagem de plano de fundo é .. = (Eu tentei isso no IE8. E também, de alguma forma, seria possível usar esses comandos 'cover' e, de alguma forma, torná-la compatível com celulares como o iphone? problema, mas poderia ser possibke para dimensionar a janela de exibição para tela inteira de uma forma que fundo é escalado aqui ?? Obrigado por respostas!
3
Os filtros específicos do IE não são soluções ideais, portanto, sinta-se à vontade para usar o IE com alternativas de CSS. Eu pessoalmente uso a "capa" do CSS3 no meu próprio site e funciona bem em dispositivos iOS, mas não se esqueça de definir a largura do dispositivo.
Clement
9
A tampa não estica a BG. 100% 100% sim.
neoswf
Essas soluções funcionaram melhor para mim, onde eu não queria esticar a imagem horizontalmente ou verticalmente mais do que a resolução real. Obrigado..!!
Noddy
1
Nota: a partir do Chromium 78.0.3904.97, não é possível dimensionar imagens svg independentemente ao longo de cada eixo. Pode ser necessário redimensioná-lo e convertê-lo em uma imagem rasterizada.
Mike
567

Use a propriedade CSS 3background-size :

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

Está disponível para navegadores modernos, desde 2012.

vinyll
fonte
93
Para preservar a proporção da imagem, use "background-size: cover;" ou "tamanho do plano de fundo: contém;". Eu construí um polyfill que implementa esses valores em IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi
6
Sei que tem um ano, mas tenho que (rir e) concordar com a parte dos 'navegadores decentes'. Verifique todos os seus navegadores, mas tive mais problemas com o IE do que qualquer um deles.
ErocM
36
Eu tive que definir background-size: 100% 100%;para obter o efeito desejado, se isso ajudasse alguém.
guanome
1
explicação sobre covere contain no MDN
mohas 14/03
2
isso realmente não funciona. A questão é encher o recipiente, o que significa que queremos que ele se estique para que não se repita. Por outro lado, esta resposta será repetida na direção da altura se a altura não cobrir a área. "Alongar para preencher" significa alongar, no entanto, é necessário que ele não se repita. A resposta correta é "capa" abaixo. Isso realmente lida com o caso de que isso não acontece.
gman 23/02
171

Escalar uma imagem com CSS não é bem possível, mas um efeito semelhante pode ser alcançado da seguinte maneira.

Use esta marcação:

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

com o seguinte CSS:

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

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

e você deve estar pronto!

Para dimensionar a imagem para "sangrar completamente" e manter a proporção, você pode fazer isso:

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

Funciona muito bem! Se uma dimensão for cortada, no entanto, ela será cortada em apenas um lado da imagem, em vez de ser cortada uniformemente nos dois lados (e centralizada). Eu testei no Firefox, Webkit e Internet Explorer 8.

SolidSmile
fonte
2
Isso funciona bem ... mas estava procurando algo um pouco mais robusto (provavelmente com javascript) que também o centralizava e se ajustava com base em se a imagem era paisagem ou retrato. Se alguém tiver uma solução nesse sentido adoraria um link ... obrigado!
22910 Brian Armstrong19 de
4
Caso alguém esteja interessado, isso parece funcionar bem: buildinternet.com/project/supersized
Brian Armstrong
1
A centralização horizontal pode ser feita com margin: 0 autoon .stretch. Ao definir apenas widthou height, a proporção permanece a mesma. Tente usar max-widthe max-heightlimitar o fator de zoom ...
Ronald
1
Isso não funciona para mim no ie8 / ie9, mas funciona no ie6 / ie7 (e, claro, em todos os outros navegadores). Em ie8 / ie9, a imagem aparece apenas em cerca de 3/4 da div. Alguém tem o mesmo problema?
3
Uma falha no SO: não há como marcar respostas que não estão mais corretas, levando pessoas como @Ullas a se desviarem. É fácil dimensionar fundos em todos os navegadores modernos. developer.mozilla.org/en/CSS/background-size
Glenn Maynard
161

Use o atributo size-background em CSS3:

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

EDIT: Modernizr suporta a detecção de suporte de tamanho de fundo . Você pode usar uma solução alternativa JavaScript criada para funcionar, no entanto, precisar e carregá-la dinamicamente quando não houver suporte. Isso manterá o código sustentável, sem recorrer a invasões CSS intrusivas para determinados navegadores.

Pessoalmente, eu uso um script para lidar com ele usando jQuery, é uma adaptação do imgsizer . Como a maioria dos modelos que agora uso largura% s para layouts de fluido entre dispositivos, há uma leve adaptação a um dos loops (considerando tamanhos que nem sempre são 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;
}

Edição: Você pode também estar interessado em jQuery CSS3 Finaliz [s] e .

Metalshark
fonte
3
Apenas para enfatizar, o Modernizr NÃO habilita o suporte ao tamanho do plano de fundo em navegadores que não o suportam nativamente. Ele apenas possui um teste conveniente entre navegadores. Cabe a você falsificá-lo quando o teste retornar falso.
22612 Chris Moschini
34

Experimente o tamanho do plano de fundo do artigo . Se você usar todas as opções a seguir, ele funcionará na maioria dos navegadores, exceto no 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%;
} 
alekwisnia
fonte
1
Obrigado! Isso difere de "tamanho do plano de fundo: capa"
Pavel Vlasov
1
isso se estendeu para mim no ipad, mas não foi dimensionado. thx para postagem.
Don Cote
1
Isso é ótimo para reduzir o fundo também. Obrigado!
Sendo #
1
Se a imagem de fundo é um SVG, também é necessário especificar preserveAspectRatio="none"dentro do SVG. Mais informações sobre isso aqui . Demonstração aqui .
Mentalista,
você pode usar o tamanho de fundo: capa; anexo em segundo plano: fixo; você pode escalá-lo
Siraj Ahmed
15

Atualmente não. Ele estará disponível no CSS 3 , mas levará algum tempo até ser implementado na maioria dos navegadores.

Eran Galperin
fonte
2
Grande artigo disponível em A List Apart: Supersize that Background, Please!
jensgram
3
-1 Não acho que essa resposta seja muito relevante ... e não oferece uma solução de qualquer tipo.
Potherca
1
@Potherca, esta resposta estava correta no momento (quase 3 anos atrás).
Eran Galperin
4
Há uma razão para a data ser mostrada. Deve ser mantido para referências históricas. Você está revisando todas as respostas antigas do site e as rebatendo? a resposta ainda está correta, mesmo que mais informações tenham sido adicionadas desde então. Observe também que outras respostas aqui basicamente afirmam o mesmo (e algumas são realmente incorretas - elas afirmam que é impossível). Tenho a sensação de que você escolheu este, uma vez que tem alguns votos.
Eran Galperin
3
Não, eu peguei em um presente desde que tudo que ele faz é dizer "Computer dizer não", mesmo que existem várias soluções para este problema, mesmo em 2008 ;-)
Potherca
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;
}

Trabalha em:

  • Safari 3+
  • Chrome Whatever +
  • IE 9+
  • Opera 10+ (o Opera 9.5 suporta tamanho de fundo, mas não as palavras-chave)
  • Firefox 3.6+ (o Firefox 4 suporta a versão prefixada por não fornecedor)

Além disso, você pode tentar isso para uma solução ie

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

Crédito para este artigo por Chris Coyier http://css-tricks.com/perfect-full-page-background-image/

Blowsie
fonte
Como isso é melhor ou diferente do que apenas "background-size: cover"?
PKHunter
@PKHunter, não sei exatamente ao que você está se referindo. Isso é usar background-size: coverexceto com prefixeds navegador e uma solução IE
Blowsie
8

Em uma palavra: não. A única maneira de esticar uma imagem é com a <img>tag. Você terá que ser criativo.

Isso costumava ser verdade em 2008, quando a resposta foi escrita. Atualmente, os navegadores modernos suportam a background-sizesolução desse problema. Cuidado que o IE8 não suporta.

Vilx-
fonte
6
@Blowsie - Cute. Verifique a data da resposta. O cenário do navegador mudou um pouco nos últimos 5 anos.
Vilx-
5

Definir "esticar e escalar" ...

Se você possui um formato de bitmap, geralmente não é ótimo (graficamente falando) esticá-lo e puxá-lo. Você pode usar padrões repetíveis para dar a ilusão do mesmo efeito. Por exemplo, se você tem um gradiente que fica mais claro na parte inferior da página, use um gráfico com um único pixel de largura e a mesma altura do seu contêiner (ou de preferência maior para contabilizar o dimensionamento) e, em seguida, coloque-o lado a lado no página. Da mesma forma, se o gradiente percorresse a página, ele teria um pixel de altura e mais largura do que seu contêiner e repetiria a página.

Normalmente, para dar a ilusão de esticar para encher o contêiner quando o contêiner cresce ou diminui, você aumenta a imagem do contêiner. Qualquer sobreposição não seria exibida fora dos limites do contêiner.

Se você deseja um efeito que se assemelhe a algo como uma caixa com bordas curvas, cole o lado esquerdo da caixa no lado esquerdo do contêiner com sobreposição suficiente que (dentro da razão) não importa o tamanho do contêiner, ele nunca fica sem fundo e, em seguida, você coloca uma imagem do lado direito da caixa com bordas curvas e a posiciona à direita do contêiner. Assim, à medida que o contêiner encolhe ou cresce, o efeito de caixa curva parece encolher ou crescer com ele - na verdade não, mas dá a ilusão de que é o que está acontecendo.

Para realmente fazer a imagem encolher e crescer com o contêiner, você precisará usar alguns truques de camadas para fazer com que a imagem pareça funcionar como plano de fundo e algum javascript para redimensioná-la com o contêiner. Não existe uma maneira atual de fazer isso com CSS ...

Se você estiver usando gráficos vetoriais, está muito fora do meu domínio de especialização, receio.

BenAlabaster
fonte
Esticar = Alterar as dimensões x e y, alterando independentemente a proporção da imagem, Escala = alterar as dimensões x e y, mantendo proporcionalmente a proporção da imagem.
Lawrence Dol
@ SoftwareMonkey: Como pano de fundo, então não, você não pode alterar a extensão e a escala no verdadeiro sentido dos termos em CSS direto. Você precisa usar vários truques de CSS para dar a ilusão de que é isso que está acontecendo, como descrevi.
BenAlabaster
4

Isto é o que eu fiz disso. Na aula de alongamento, simplesmente mudei a altura para auto. Dessa forma, sua imagem de plano de fundo sempre tem o mesmo tamanho da largura da tela e a altura sempre terá o tamanho certo.

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

.stretch {
    width:100%;
    height:auto;
}
Edward
fonte
2

Adicione uma background-attachmentlinha:

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

.stretch {
    width:100%;
    height:auto;
}
user340273
fonte
2

Gostaria de salientar que isso é equivalente a fazer:

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

Outra ótima solução para isso é o Backstretch de Srobbin, que pode ser aplicado ao corpo ou a qualquer elemento da página - http://srobbin.com/jquery-plugins/backstretch/

nickff
fonte
Nick, geralmente pedimos que você forneça as partes mais importantes da sua resposta e forneça um link externo apenas para obter mais detalhes - isso ajuda as respostas a permanecerem úteis no caso de rot-link.
Lawrence Dol
1
Foi mal. De um modo geral, você adiciona backstretch ao <head> do seu documento e inicializa assim: $ (". Your-element"). Backstretch ("path / to / image.jpg");
nickff
2

Tente isto

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;
}
user3383708
fonte
1

Uma dica adicional para a trapaça do SolidSmile é escalar (o redimensionamento proporcional) definindo uma largura e usando automático para altura.

Ex:

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

fonte
0

Use a border-image : yourimagepropriedade para definir sua imagem e dimensioná-la até a borda inteira da tela ou janela.

Natesh bhat
fonte