O fundo gradiente CSS3 definido no corpo não se estica, mas repete?


430

ok, digamos que o conteúdo <body>totalize 300px de altura.

Se eu definir o plano de fundo do meu <body>uso -webkit-gradientou-moz-linear-gradient

Depois, maximizo minha janela (ou apenas a levo a mais de 300px), o gradiente terá exatamente 300px (a altura do conteúdo) e repito para preencher o restante da janela.

Estou assumindo que isso não é um bug, pois é o mesmo no webkit e no gecko.

Mas existe uma maneira de fazer o gradiente esticar para preencher a janela em vez de repetir?

Respostas:


718

Aplique o seguinte CSS:

html {
    height: 100%;
}
body {
    height: 100%;
    margin: 0;
    background-repeat: no-repeat;
    background-attachment: fixed;
}

Edit: Adicionado margin: 0;à declaração do corpo por comentários ( Martin ).

Edit: Adicionado background-attachment: fixed;à declaração do corpo por comentários ( Johe Green ).


4
Eu também descobri que eu precisava para adicionar margin:0;no bodyou então eu tenho uma lacuna na parte inferior da minha página.
Martin

8
No Chrome e Safari, o corpo {height: 100%} resulta na extensão da página (mas não no gradiente) para fora da janela de exibição.
thSoft

13
Eu tive que adicionar um anexo em segundo plano: fixo; ao corpo para se livrar da lacuna inferior (Webkit).
J7nn7k

4
Definir um plano de fundo para o corpo e, em seguida, a altura da tag html para 100% faz coisas estranhas no Internet Explorer. Aqui está um exemplo (png).
Justin Force

21
Certifique-se de que background-repeate background-attachmentvêm após suas backgroundregras. Caso contrário, o fundo ainda poderá se repetir.
Kellen

159

Em relação a uma resposta anterior, a criação htmle bodya height: 100%não parece trabalho, se as necessidades de conteúdo para rolagem. A adição fixedao plano de fundo parece consertar isso - nãoneed for height: 100%;

Por exemplo:

body {
  background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#cbccc8)) fixed;
}


5
Isso funcionou para mim em todos os navegadores que testei (Chrome [Mac], Safari [Mac], Firefox [Mac / Win7], IE9 [Win7] e Opera [Mac]) sem o efeito colateral da barra de rolagem da "altura: 100%" solução. Obrigado!
pipwerks

7
Uma observação para as pessoas que usam Sass / Compass. Você não pode definir "fixo" diretamente na mixin de modo a adicionar fixo você adicionar a propriedadebackground-attachment: fixed
Kyle Mathews

2
Se você quer ter tanto o fundo preencher a janela, ou o conteúdo (o que for maior), em seguida, usar min-height:100%(em navegadores compatíveis)
cjk

Consegui executar o seguinte código usando o Compass: @include background (gradiente linear (superior, vermelho 0%, azul 100%) fixo);
mcranston18

Como eu adicionaria uma terceira cor?
sbaden

17

Eu sei que estou atrasado para a festa, mas aqui está uma resposta mais sólida.

Tudo o que você precisa fazer é usar min-height: 100%;e não, height: 100%;e o plano de fundo gradiente estenderá toda a altura da janela de visualização sem repetir, mesmo que o conteúdo seja rolável.

Como isso:

html {
    min-height: 100%;
}

body {
    background: linear-gradient(#ff7241, #ff4a1f);
}

A menos que você precise definir a altura do html como 100%, por exemplo, se precisar de rodapé
fixo

15

Aqui está o que eu fiz para resolver esse problema ... ele mostrará o gradiente para todo o comprimento do conteúdo e, em seguida, simplesmente retornará à cor de fundo (normalmente a última cor do gradiente).

   html {
     background: #cbccc8;
   }
   body {
     background-repeat: no-repeat;
     background: #cbccc8;
     background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#cbccc8));
     background: -moz-linear-gradient(top, #fff, #cbccc8);
     filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#cbccc8');
   }
<body>
  <h1>Hello world!</h1>
</body>

Eu testei isso no FireFox 3.6, Safari 4 e Chrome, mantenho a cor de plano de fundo no corpo de qualquer navegador que, por algum motivo, não suporte o estilo da tag HTML.


13

A configuração html { height: 100%}pode causar estragos no IE. Aqui está um exemplo (png). Mas você sabe o que funciona muito bem? Basta definir seu plano de fundo na <html>tag.

html {
  -moz-linear-gradient(top, #fff, #000);
  /* etc. */
}

O plano de fundo se estende para a parte inferior e nenhum comportamento de rolagem estranho ocorre. Você pode pular todas as outras correções. E isso é amplamente suportado. Não encontrei um navegador que não permita aplicar um plano de fundo à tag html. É CSS perfeitamente válido e existe há algum tempo. :)


1
@ Lynda Isso não é um feedback muito útil. Você se importaria de fornecer um caso em que não funcione?
Justin Force

Desculpe por ser vago. Não sei por que não funciona. Você pode adicionar um gradiente, htmlmas ele pára parcialmente na página no meu caso. A adição background-attachment:fixedresolve o problema. Vi isso acontecer em mais de um site, mas não consegui encontrar a causa.
L84

O ponto desta solução é que ela funcionou em vários navegadores (em 2012, a propósito). Mas você ainda não indica em qual navegador está falando. Se você ainda estiver com problemas, tente adicionar html, body { height: 100%; }.
Justin Force

Verdade. Isso acontece no Firefox e no Chrome (não testei em outros navegadores) e tentei altura e várias outras configurações sem sorte (exceto anexos em segundo plano). Oh, bem, não é grande coisa e espero que sua resposta ainda funcione para a maioria. =>
L84

Ainda tem que enganar com no-repeat e fixo.
MarsAndBack

12

Há muita informação parcial nesta página, mas não uma completa. Aqui está o que eu faço:

  1. Crie um gradiente aqui: http://www.colorzilla.com/gradient-editor/
  2. Defina o gradiente em HTML em vez de BODY.
  3. Corrija o plano de fundo no HTML com "background-attachment: fixed;"
  4. Desative as margens superior e inferior do BODY
  5. (opcional) Normalmente, crio um em <DIV id='container'>que coloco todo o meu conteúdo

Aqui está um exemplo:

html {  
  background: #a9e4f7; /* Old browsers */
  background: -moz-linear-gradient(-45deg,  #a9e4f7 0%, #0fb4e7 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#a9e4f7), color-stop(100%,#0fb4e7)); /* Chrome,Safari4+ */ 
  background: -webkit-linear-gradient(-45deg,  #a9e4f7 0%,#0fb4e7 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(-45deg,  #a9e4f7 0%,#0fb4e7 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(-45deg,  #a9e4f7 0%,#0fb4e7 100%); /* IE10+ */
  background: linear-gradient(135deg,  #a9e4f7 0%,#0fb4e7 100%); /* W3C */ 
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a9e4f7', endColorstr='#0fb4e7',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */

  background-attachment: fixed;
}

body {
  margin-top: 0px;
  margin-bottom: 0px;
}

/* OPTIONAL: div to store content.  Many of these attributes should be changed to suit your needs */
#container
{
  width: 800px;
  margin: auto;
  background-color: white;
  border: 1px solid gray;
  border-top: none;
  border-bottom: none;
  box-shadow: 3px 0px 20px #333;
  padding: 10px;
}

Isso foi testado com o IE, Chrome e Firefox em páginas de vários tamanhos e necessidades de rolagem.


1
Ótimo! Eu estava usando o colorzilla e a resposta principal não funcionou para mim. Este fez. Obrigado! :)
Filly

Por que você prefere fazê-lo em HTML, não em BODY?
sashaikevich

@sashaikevich Ótima pergunta. Não vejo essa resposta há cinco anos, por isso não me lembro. A razão pela qual fiz isso pode ainda não se aplicar a todas as atualizações do navegador. Se você movesse tudo para o corpo, eu ficaria curioso se funcionasse da mesma maneira.
Rick Smith

@ RickSmith Não, eu denominei html. Mas mudei as regras para aplicar ao corpo agora mesmo para verificar, e isso não fez diferença. Talvez fosse uma coisa navegador antigo ...
sashaikevich

4

Sujo; talvez você possa apenas adicionar uma altura mínima: 100%; para o html e as tags do corpo? Isso ou pelo menos definiu uma cor de fundo padrão que também é a cor final do gradiente.


1
O plano de fundo padrão definido como a cor final do gradiente seria uma ótima solução se o gradiente parasse, mas ele não apenas parava que se repete; o plano de fundo padrão só seria visto se o gradiente não fosse suportado.
JD Isaacks

2

Eu tive problemas para obter as respostas aqui para trabalhar.
Eu achei que funcionava melhor para corrigir uma div em tamanho real no corpo, fornecer um índice z negativo e anexar o gradiente a ele.

<style>

  .fixed-background {
    position:fixed;
    margin-left: auto;
    margin-right: auto;
    top: 0;
    width: 100%;
    height: 100%;
    z-index: -1000;
    background-position: top center;
    background-size: cover;
    background-repeat: no-repeat;
  }

  .blue-gradient-bg {
    background: #134659; /* For browsers that do not support gradients */
    background: -webkit-linear-gradient(top, #134659 , #2b7692); /* For Safari 5.1 to 6.0 */
    background: -o-linear-gradient(bottom, #134659, #2b7692); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(top, #134659, #2b7692); /* For Firefox 3.6 to 15 */
    background: linear-gradient(to bottom, #134659 , #2b7692); /* Standard syntax */
  }

  body{
    margin: 0;
  }

</style>

<body >
 <div class="fixed-background blue-gradient-bg"></div>
</body>

Aqui está uma amostra completa https://gist.github.com/morefromalan/8a4f6db5ce43b5240a6ddab611afdc55


0

Eu usei esse código CSS e funcionou para mim:

html {
  height: 100%;
}
body {
  background: #f6cb4a; /* Old browsers */
  background: -moz-linear-gradient(top, #f2b600 0%, #f6cb4a 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2b600), color-stop(100%,#f6cb4a)); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #f2b600 0%,#f6cb4a 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #f2b600 0%,#f6cb4a 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #f2b600 0%,#f6cb4a 100%); /* IE10+ */
  background: linear-gradient(top, #f2b600 0%,#f6cb4a 100%); /* W3C */
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2b600', endColorstr='#f6cb4a',GradientType=0 ); /* IE6-9 */
  height: 100%;
  background-repeat: no-repeat;
  background-attachment: fixed;
  width: 100%;
  background-position: 0px 0px;
}

Uma informação relacionada é que você pode criar seus próprios ótimos gradientes em http://www.colorzilla.com/gradient-editor/

/ Sten


-1
background: #13486d; /* for non-css3 browsers */
background-image: -webkit-gradient(linear, left top, left bottom, from(#9dc3c3),   to(#13486d));  background: -moz-linear-gradient(top,  #9dc3c3,  #13486d);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9dc3c3', endColorstr='#13486d');
background-repeat:no-repeat;

1
Por favor, adicione algumas explicações sobre os principais aspectos da sua solução.
Rachcha

-1

foi o que eu fiz:

html, body {
height:100%;
background: #014298 ;
}
body {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5c9cf2), color-stop(100%,#014298));
background: -moz-linear-gradient(top, rgba(92,156,242,1) 0%, rgba(1,66,152,1) 100%);
background: -o-linear-gradient(top, #5c9cf2 0%,#014298 100%);

/*I added these codes*/
margin:0;
float:left;
position:relative;
width:100%;
}

antes de flutuar o corpo, havia uma lacuna na parte superior e mostrava a cor de fundo do html. se eu remover a cor bg do html, quando rolar para baixo, o gradiente será cortado. então eu flutuei o corpo e defini sua posição para relativa e a largura para 100%. trabalhou em safari, chrome, firefox, opera, internet expl .. oh espera. : P

O que é que vocês acham?


-4

em vez de 100%, eu apenas adiciono alguns pixxel consegui isso agora e funciona para a página inteira sem lacunas:

html {     
height: 1420px; } 
body {     
height: 1400px;     
margin: 0;     
background-repeat: no-repeat; }

3
e as páginas com mais de 1420 px de altura?
veritas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.