Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wig07

Como faço um background ajustável e fixo à resolução?

Recommended Posts

Olá amigos, estou bolando uma página de erro 404, para isso fiz uma imagem png, queria que ela se tornasse ajustável à qualquer dispositivo SEM QUE ELA DISTORÇA ou corte alguma parte dela.

 

Se existe algum método possível, seria até melhor fazer várias imagens de tamanhos diferentes de modo que quando aberta àquela resolução, abra-se a imagem correspondente. Como por exemplo para PC uma widescreen para celular uma "compacta" tamanho iPhone.

Enfim, estou usando isto:

 

<html><head><style>
body{
background-image:url(/sources/404b.png);
background-attachment:fixed;
background-size:100%;
background-repeat:no-repeat;
background-color:#000;
}



</style></head></html>

 

Quando abro no meu navegador está ok, no celular ele corta praticamente metade.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora no celular não abre nem 10% da página, como disse, seria possível abrir uma imagem específica para cada resolução? Eu crio uma adaptada para o tamanho padrão de um celular, uma outra para monitores "quadrados" e outra widescreen... conforme a resolução do dispositivo abrirá a imagem correspondente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem sim, com media query

 

Como está sua imagem? Em termos de dimensões?

Pode usar o

background-size: cover;
background-position: top center;

Compartilhar este post


Link para o post
Compartilhar em outros sites

A imagem é em jpg sob proporção de 1600x1000. Que funciona corretamente ao screen do computador mas no celular, que é o maior número de visitas, fica a desejar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejo que vc já tem um conhecimento, então é só estudar um pouco sobre que vc pega rápido.

 

No seu caso segue um exemplo de como faria, imaginando seu caso

body{
      
    background-image:url(/sources/bg-pequeno.png); 
    background-attachment:fixed;
    background-size:100%;
    background-repeat:no-repeat;
    background-color:#000;
    
}



@media (min-width : 320px) {

}

@media (min-width : 480px) {

}

@media (min-width : 768px) {

}

@media (min-width : 992px) {
    
    body{
        background-image:url(/sources/404b.png);
    }

}

@media (min-width : 1200px) {

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bem, vamos ver se consegui compreender, eu precisaria jogar este código no meu css que está linkado à página html (404.html), acrescentando isto:

    
    body{
        background-image:url(/sources/404b.png);
    }

}

à cada elemento @media substituindo "404b.png" por uma imagem de width igual ao valor emitido pelo @media?

 

Se entendi ficaria algo como:

body{
      
    background-image:url(/sources/bg-pequeno.png); 
    background-attachment:fixed;
    background-size:100%;
    background-repeat:no-repeat;
    background-color:#000;
    
}



@media (min-width : 320px) {
    
    body{
        background-image:url(/sources/404b-320.png);
    }

}

@media (min-width : 480px) {
    
    body{
        background-image:url(/sources/404b-480.png);
    }

}

@media (min-width : 768px) {
    
    body{
        background-image:url(/sources/404b-768.png);
    }

}

@media (min-width : 992px) {
    
    body{
        background-image:url(/sources/404b-992.png);
    }

}

@media (min-width : 1200px) {
    
    body{
        background-image:url(/sources/404b-1200.png);
    }

}


E por quê de no body temos um "../bg-pequeno.png"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Wig,

Vamos partir do principio, ok?

Você tem uma imagem 1600x1000 (que já é um absurdo de tamanho se formos falar de desempenho) e você quer que ela se adapte a todos os dispositivos... Vendo pelo seus comentários anteriores, você criou uma imagem baseada no tamanho do seu próprio monitor (o que é errado).

Quando você define uma imagem (tamanho / peso), você precisa entender que ela deverá servir para todos os dispositivos. Não é só fazer uma imagem, preencher todo o espaço possível e esperar que ela se adapte.

Entenda que essa sua imagem 1600x1000, ela passa a se comprimir a 350x650 (exemplo) e isso ferra com o Aspect Ratio (vale estudar) dela. Esse Aspect Ratio é o que você precisa preservar em todos os dispositivos (ou seja, deixar sua imagem visível e compreensível em qualquer tamanho de tela - sem que ele crie ruídos ou estoure a qualidade).

Agora vamos a algumas explicações:
Criar um monte de media queries vai fazer com que seu site fique mais lento, mas isso não é questão dos medias, é uma questão das imagens.

Pense o seguinte: Você tem uma imagem de fundo e ela precisa mudar a cada dispositivo. Lembre-se que esse código CSS está sendo lido e carregado pelo Browser, ou seja, você tem 5 media queries com 5 imagens diferentes. O seu site vai demorar mais tempo pra ler todos esses 5 media queries com essas 5 imagens diferentes. Entendeu? Ele não precisa perder todo esse tempo pra ficar lendo imagens. Estude por Progressive Enhancement.

O site não tem a necessidade de carregar algo que não precisa utilizar, por isso, nesse caso os media queries estão fora de questão. Eles se tornam mais uma "gambiarra" pra você achar que resolveu tudo.

Vamos as possíveis soluções:

  1. Você pode substituir sua imagem por um .SVG - eles são mais carregados, porém são mais fáceis de serem manipulados. Eles podem sofrer mudanças drásticas de tamanho sem que percam seus Aspect Ratio's.
  2. Você pode criar uma nova imagem com um logo/personagem/imagem centralizado e com tamanho total de 350px (w/h). Você só precisa tornar uma única informação visível. Ou seja, priorizar o que realmente é importante ou se é importante.
  3. Quer continuar usando media queries? Então faça o seguinte: Separe eles em outros arquivos (fora do mesmo CSS do Desktop) e declare uma função que só permita o browser ler esse CSS se ele for dispositivo mobile.

 

Um exemplo de código do item 3:

<?php function isMobile(){return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);}
   if ( isMobile() ) :
?>
   <link rel="stylesheet" href="mobile.css">
<?php endif; ?>

Isso é em PHP, então deve servir.

Esse código vai definir o seguinte: Se for mobile, ele apresenta o mobile.css. Fim. Essa é uma das maneiras que você pode criar um monte de código sem afetar o desempenho dos outros dispositivos/plataformas.

Boa sorte e bons estudos!

Obs: Quando for salvar uma imagem, não esqueça de usar a opção "Salvar para a Web" - isso reduz o tamanho e melhora o desempenho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente Henrique, prezo muito por velocidade e, consequentemente pelo peso das imagens, esta imagem que estou utilizando de 1600x1000 tem 134kb, ou seja, não sei se de fato o media query iria influenciar em termos de velocidade já que, o html só se constitui da linkagem do css.

Para falar bem a verdade sou bem leigo no assunto de php, mas poderia criar um, linkar o css e/ou criar um css para leitura de dispositivos móveis e jogar em php.

 

Não seria uma grande dificuldade criar imagens adaptadas para cada proporção (que na minha opinião pode parecer mais otimizado para o internauta que ajustar o aspect ratio), o que precisaria era somente fazer com que o dispositivo leia o que é para ele ler (daí a dificuldade), ou seja, a sua proporção equivalente.

 

Portanto, deixe-me entender, com esse código do exemplo 3 um browser de celular não leria o "404.css" mas somente o "mobile.css" e vice-versa? Assim por meio de "mobile.css" poderia eu programar a leitura de um browser mobile? Como se constituiria assim o php com media-query com mobile.css?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hey cara, blzs?

Não caia na ilusão de exibir css pelo "HTTP_USER_AGENT" isso sim é gambiarra!

E outra, media query tem operadores lógicos como o "not"

 

Veja que no seu caso, vc tem apenas 1 problema ( um BG gigante ) isso é um elemento visual.

E lembrando que vc vai seguir o conceito de mobile first, comece pelo que realmente é relevante.

 

Não é só salva IMG para web, tudo precisa ser otimizado e para otimizar recomendo o https://tinypng.com/

 

Assim como seu CSS.

 

[ ]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo retorno, Wig.

Vamos lá... Como você disse, sua dificuldade está no em fazer com que o browser leia somente o que ele precise ler. Isso é um conceito e você não precisa entender de uma linguagem extra para aplica-lo. É só uma questão de organização de arquivos/pastas e quem pode e não pode chamar esses arquivos (ai entra o item 3).

Com essa função em PHP o browser não vai deixar de ler, a não ser que você adicione um !isMobile (ao invés de isMobile) no seu 404.css. Entendeu? Ele vai ler tudo e vai ler o adicional do mobile.css. O seu desktop não vai ler o mobile.css, pois ele está dentro de uma condição que ele descarta.

O que não precisa ser lido, recebe !isMobile. O que precisa ser lido, recebe isMobile (Sei que você não é leigo, mas como alguém pode ter uma dúvida semelhante, o uso da exclamação torna o uso negativo, ou seja, nãoIsMobile).

Faça um teste: Pegue os styles que você precisa exibir no mobile e adicione a função com o isMobile. Depois disso separe as que não precisa aparecer e nem carregar e adicione o !isMobile.

PWD: Entenda que isso é pra evitar que o browser leia o que não precisa ler. Você usando operadores lógicos como not ou media only é a mesma coisa que nada, já que ele está tendo que ler, puxar e interpretar o que o CSS deixou disposto - Sem contar que tem uma galera que adora ficar brincando de aumentar e diminuir a tela do browser.

E desde quando HTTP_USER_AGENT virou gambiarra? O.o Se você está evitando que o dispositivo carregue o que não precisa, isso é ser gambiarra? Ou é fazer com que o usuário carregue e fique perdendo mais tempo com coisas que não pertencem ao dispositivo utilizado? O User agent só é considerado ruim quando tem alternativas que solucionam tudo, mas não é o caso dos media-queries, já que eles estão tendo de ser interpretados pelo browser mesmo sem sua utilização.

Isso é um benefício para o usuário e quem desenvolve pra web deve pensar primeiro neles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pwd pela dica, desconhecia este site, ele poderá ajudar bastante no quesito velocidade. Agora Henrique, acho que você ficou sabe errado (kkk), eu não sou nível avançado em css, foi ano passado que comecei a utilizar mais códigos que interfaces, mas hoje, meu serviço de hospedagem só me permite trabalhar por códigos html que, basicamente não é um bicho de sete cabeças, mas css é um pouquinho ainda, conheci o media query recentemente quando instalei uma galeria em meu website (Gamma Gallery) que acho que usa este mesmo sistema, cada dispositivo abre as imagens conforme a resolução mais próxima. A ideia é que em nenhum dispositivo a imagem se torne distorcida. Consegui instalar esta galeria com sucesso, mas meu projeto agora é outro, é fazer mais ou menos isto mas com um background que preenche a screen sem alterar drasticamente a velocidade do site (já que é apenas uma página de erro 404).

 

Agora vejamos, minha página de 404.html está assim constituída:

<html>
    <!DOCTYPE html>
<html lang="en"><!--<![endif]-->
<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
	<title>404 ERROR</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport" />
	<link href="/sources/404.css" rel="stylesheet" type="text/css" />

E o css:

body {
background-image: url(/sources/404.jpg);
background-repeat: no-repeat;
-moz-background-size: 100% 100%;
-webkit-background-size: 100% 100%;
background-size: 100% 100%;
}

Agora, partindo do ponto prático, preciso deletar tudo (html e css) e criar um php, jogar aquele código adaptado que escrevi completo de media query (resposta #9) e acrescentar o !isMobile na linha 12 para que o browser (de pc) pare de ler e não leia o media query, é isso?

 

Desculpe pelas perguntas, estou aqui aprendendo também, é meio novo para mim esta linguagem de programação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Negativo, o browser de PC só para de ler se for isMobile. A exclamação antes do isMobile nega a função dele, ou seja:

  • isMobile = É mobile;
  • !isMobile = Não é mobile.

O que não for mobile, ele executa, o que for, ele não executa. Trazer todo o HTML para PHP não é difícil, seria até interessante que você começasse um projeto com PHP pra ir entendendo e aprendendo.

Lembrando que você não precisa criar uma propriedade pra cada elemento do background, você pode substituir só pela propriedade background. Exemplo:

body {
   background: url('/sources/404.jpg') no-repeat center center;
   background-size: 100% 100%;
}

O no-repeat remete ao background-repeat e o center center remete ao background-position.

Ah, eu não sei se copiou errado ou o que aconteceu, mas você está abrindo a tag <html> duas vezes no arquivo. Ele deve sempre iniciar assim:

<!DOCTYPE html> <!-- HTML5 -->
<html>
   <head></head>
   <body></body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é nem tinha percebido a duplicação da tag, mas o navegador estava lendo hehe

 

Então, segundo o que entendi, não precisarei mexer com css, só abrir um ficheiro .php com o seguinte código?(originalmente enviado pelo pwd com adaptações da propriedade inicial (e única) de background que vc me enviou agora)

 

Segue:

<?php

body {
background: url('/sources/404.jpg') no-repeat center center;
background-size: 100% 100%;
}
     
     isMobile
     
    @media (min-width : 320px) {

}

    @media (min-width : 480px) {

}

    @media (min-width : 768px) {

}

    @media (min-width : 992px) {

       body{
       background-image:url(/sources/404b.png);
    }

}

    @media (min-width : 1200px) {

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se tirar as outras propriedades de background como associará os diferentes tamanhos? Ou você fala de outros componentes/propriedades?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por 4Unknow
      Boa tarde pessoal. Como vocês estão?
       
      Criei este tópico a fim de encontrar ajuda para colocar áudio de fundo no meu site. Mas calma ai, sei que é pesado rodar arquivos de áudio.
      Mas existe alguma maneira de colocar um link externo, como por exemplo do youtube, e rodar apenas o áudio dele de fundo?

      Obrigado a todos da comunidade.
    • Por LucasLV
      Olá.
      Tenho um site onde as imagens são geradas através de um arquivo PHP - utilizo esse método para retornar imagens webp ou jpg - e vi que o navegador não utiliza, ou não salva em cache, as imagens geradas dessa forma.
      Já as onde informo o caminho completo da imagem com a extensão, aparecem como utilizadas do cache.

      Esse comportamento é normal quando as imagens são geradas desse jeito ou é por não ter feito nenhuma configuração de cache no arquivo PHP que gera as imagens?
       
      Coloquei uma imagem do resultado exibido no navegador.

    • Por leonardorafaeldev
      Boa noite pessoal estou com um problema que o icone do meu site não aparece no mobile segue uma foto do problema o meu codigo esta assim
       
      <!-- icones -->   <link href="icones/favicon.ico" rel="icon">   <link href="icones/favicon.ico" rel="shortcut icon">    <link rel="apple-touch-icon" sizes="57x57" href="icones/apple-icon-57x57.png">   <link rel="apple-touch-icon" sizes="60x60" href="icones/apple-icon-60x60.png">   <link rel="apple-touch-icon" sizes="72x72" href="icones/apple-icon-72x72.png">   <link rel="apple-touch-icon" sizes="76x76" href="icones/apple-icon-76x76.png">   <link rel="apple-touch-icon" sizes="114x114" href="icones/apple-icon-114x114.png">   <link rel="apple-touch-icon" sizes="120x120" href="icones/apple-icon-120x120.png">   <link rel="apple-touch-icon" sizes="144x144" href="icones/apple-icon-144x144.png">   <link rel="apple-touch-icon" sizes="152x152" href="icones/apple-icon-152x152.png">   <link rel="apple-touch-icon" sizes="180x180" href="icones/apple-icon-180x180.png">   <link rel="icon" type="image/png" sizes="192x192"  href="icones/android-icon-192x192.png" >   <link rel="icon" type="image/png" sizes="36x36" href="icones/android-icon-36x36.png">   <link rel="icon" type="image/png" sizes="48x48" href="icones/android-icon-48x48.png">   <link rel="icon" type="image/png" sizes="96x96" href="icones/android-icon-96x96.png">   <link rel="icon" type="image/png" sizes="144x144" href="icones/android-icon-144x144.png">   <link rel="icon" type="image/png" sizes="72x72" href="icones/android-icon-72x72.png">   <link rel="icon" type="image/png" sizes="32x32" href="icones/favicon-32x32.png">   <link rel="icon" type="image/png" sizes="96x96" href="icones/favicon-96x96.png">   <link rel="icon" type="image/png" sizes="16x16" href="icones/favicon-16x16.png">   <link rel="manifest" href="icones/manifest.json">   <meta name="msapplication-TileColor" content="#ffffff">   <meta name="msapplication-TileImage" content="icones/ms-icon-144x144.png">   <meta name="theme-color" content="#ffffff">   <meta charset="utf-8">   <meta content="width=device-width, initial-scale=1.0" name="viewport">
    • Por Sapinn
      Fala galera existe algum meio que eu possa usar para saber automaticamente o tamanho da tela usando apenas javascript????
       
      Eu sei como saber o tamanho da tela usando:
       
      if (window.matchMedia("(max-width:800px)").matches) {         console.log('Menos que 800')       } else {         console.log('Mais que 800')       }  Ainda assim, preciso atualizar a pagina para conseguir obter o resultado, existe alguma maneira de fazer isso sem atualizar a página.
           
    • Por ernestovm
      Seguinte. Eu não, mas acho que TODOS os desenvolvedores estão no mato sem cachorro no que se refere a esse problemão, que é a atualização do site lá no browser do seu usuário/visitante. Seja no acesso pelo computador e, pior ainda, pelo celular.
      Quando altero o arquivo stylo.css ou alguma imagem o browser, principlmente o Google Chrome NÃO ATUALIZA. No computador, só atualiza se eu teclar CTRL+F5, mas se pensarmos no visitante não dá né? "Nivelando por baixo", imagine aquele visitante do seu site que não entende bulufas... Vou ter que colocar no site um aviso pra todo mundo apertar CTRL+F5 para atualizar a página? Quando? Sempre? Um INFERNO.
      E quanto ao acesso do visitante pelo celular? Pior ainda.
      Então estou à procura de uma solução transparente ao usuário. No que se refere às imagens, encontrei soluções razoáveis, mas quanto ao arquivo CSS, nada encontrei.
      Se alguém souber de alguma "mágica" que resolva esse problema, compartilhe. TODOS os demais desenvolvedores agradecem.
      Obrigado
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.