diff --git a/files/pt-br/learn/css/css_layout/responsive_design/index.md b/files/pt-br/learn/css/css_layout/responsive_design/index.md index 6f8a68c90fcc93..9f70f6df0a3487 100644 --- a/files/pt-br/learn/css/css_layout/responsive_design/index.md +++ b/files/pt-br/learn/css/css_layout/responsive_design/index.md @@ -5,46 +5,52 @@ slug: Learn/CSS/CSS_layout/Responsive_Design {{learnsidebar}}{{PreviousMenuNext("Learn/CSS/CSS_layout/Multiple-column_Layout", "Learn/CSS/CSS_layout/Media_queries", "Learn/CSS/CSS_layout")}} -Nos primórdios do web design, páginas eram criadas para serem visualizadas em um tamanho de tela específico. Se o usuário tivesse uma tela maior ou menor do que o esperado, os resultados iam de barras de rolagem indesejadas, tamanhos de linha excessivamente longos e uso inadequado do espaço. À medida que diferentes tamanhos de tela foram aparecendo, surgiu o conceito de web design responsivo (RWD), um conjunto de práticas que permite que páginas da Web alterem seu layout e aparência para se adequarem a diferentes larguras, resoluções, etc. É uma ideia que mudou a forma de como projetamos para a Web com múltiplos dispositivos e, neste artigo, ajudaremos você a entender as principais técnicas que você precisa conhecer para dominá-la. +Design Responsivo, também conhecido como Web Design Responsivo (RWD na sigla em inglês), é uma abordagem para o design e desenvolvimento de páginas web que tem por objetivo permitir uma boa renderização e usabilidade dessas páginas em todas as telas, independentemente de qual seja o tamanho ou a resolução da tela. + +Essa abordagem, atualmente tornada como o padrão de boas práticas no contexto do desenvolvimento web, mudou drasticamente a forma como se projetavam páginas web até então e nesse artigo apresentamos algumas técnicas para dominá-la e aplicá-la de maneira efetiva em projetos no decorrer do seu aprendizado. - +
Prerrequisitos:Pré-requisitos: - HTML básico (estude + noções de HTML básico (veja Introduction to HTML), e uma idea de como o CSS funciona (estude - CSS first steps e - CSS building blocksIntrodução ao HTML), e noções sobre como o CSS funciona (veja + CSS - Primeiros Passos e + CSS - Blocos de Construção.)
Objetivo: - Entender os conceitos fundamentais e a história do design responsivo. + Entender os conceitos fundamentais, um pouco da história do design responsivo e os recursos do CSS utilizados para implementá-lo.
-## História dos layouts de sites +## Antes do Design Responsivo + +Nos primórdios do web design, páginas eram criadas para serem visualizadas em um tamanho de tela específico, usualmente o de telas de computadores pessoais (PCs) do tipo desktop. Se o usuário tivesse uma tela maior ou menor do que o esperado, efeitos colaterais desse tipo de design estático poderiam variar desde barras de rolagem indesejadas, tamanhos de linha excessivamente longos até uso inadequado do espaço. + +À medida que diferentes tamanhos de tela foram aparecendo, surgiu o conceito de web design responsivo (RWD), um conjunto de práticas que permite que páginas da Web alterem seu layout e aparência para se adequarem a diferentes larguras, resoluções, etc. É uma ideia que mudou a forma de como projetamos páginas e aplicações para a Web levando em conta múltiplos dispositivos e, neste artigo, ajudaremos você a entender as principais técnicas necessárias para dominá-la. -Em algum ponto da história, você tinha duas opções ao criar um site: +Nesse ponto da história, você tinha duas opções principais ao criar um site: -- Você pode criar um site _líquido_, que se estenderia para preencher a janela do navegador -- ou um site de _largura fixa_, que seria um tamanho fixo em pixels. +- Você poderia criar um site _líquido_ ou _fluído_, que se estenderia para preencher a janela do navegador +- ou um site de _largura fixa_, no qual o layout seria montado com tamanho fixado das suas medidas em pixels. -Essas duas abordagens, geralmente, resultavam em um site com a melhor aparência na tela da pessoa que o projetava! O site líquido resultou em um design esmagado para telas menores (como visto abaixo) e comprimentos de linha muito longos em telas maiores. +Geralmente o que acontecia é que qualquer uma das duas formas resultava em um site com a melhor aparência somente na tela da pessoa que o projetava! O site líquido acabava por produzir um design esmagado para telas menores (como visto abaixo) e comprimentos de linha muito longos em telas maiores. ![A layout with two columns squashed into a mobile size viewport.](mdn-rwd-liquid.png) > [!NOTE] > Veja este layout líquido simples: [exemplo](https://mdn.github.io/css-examples/learn/rwd/liquid-width.html), [código-fonte](https://github.com/mdn/css-examples/blob/master/learn/rwd/liquid-width.html). Ao visualizar o exemplo, arraste a janela do navegador para dentro e para fora para ver como isso fica em tamanhos diferentes. -O site de largura fixa criava uma barra de rolagem horizontal em telas menores que a largura do site (como mostrado abaixo) e muito espaço em branco nas bordas do design em telas maiores. +Já o site de largura fixa criava uma barra de rolagem horizontal em telas menores que a largura do site (como mostrado abaixo) e muito espaço em branco nas bordas do design em telas maiores. ![A layout with a horizontal scrollbar in a mobile viewport.](mdn-rwd-fixed.png) @@ -52,35 +58,35 @@ O site de largura fixa criava uma barra de rolagem horizontal em telas menores q > Veja este layout simples de largura fixa: [exemplo](https://mdn.github.io/css-examples/learn/rwd/fixed-width.html), [código-fonte](https://github.com/mdn/css-examples/blob/master/learn/rwd/fixed-width.html). Observe novamente o resultado ao alterar o tamanho da janela do navegador. > [!NOTE] -> As capturas de tela acima foram tiradas usando o [Responsive Design Mode](/pt-BR/docs/Tools/Responsive_Design_Mode) no Firefox DevTools. +> As capturas de tela acima foram tiradas usando o [Responsive Design Mode](https://firefox-source-docs.mozilla.org/devtools-user/responsive_design_mode/index.html) no Firefox DevTools. -À medida que a Web para dispositivos móveis começava a se tornar realidade com os primeiros telefones com essas características, empresas que desejavam adotar os dispositivos móveis geralmente criavam uma versão mobile do seu site, com uma URL diferente (geralmente algo como m.exemplo.com ou exemplo.mobi) Isso significava que duas versões separadas do site tinham que ser desenvolvidas e mantidas atualizadas. +Outra variável que entrou na equação foi o fato que, à medida que o ambiente web para dispositivos móveis começava a se tornar bem mais presente com o lançamento dos primeiros smartphones, houve o surgimento de demanda por parte tanto de empresas que desejavam contemplar os usuários de dispositivos móveis quanto desses mesmos usuários. Para atender isso, muitas vezes era decidido que se criaria uma versão mobile do site, com uma URL diferente (geralmente algo como `m.exemplo.com` ou `exemplo.mobi`). Isso significava que duas versões separadas do site tinham que ser desenvolvidas e mantidas atualizadas, com as versões mobile frequentemente recebendo uma prioridade bem menor. Além disso, esses sites para celular geralmente ofereciam uma experiência muito restrita. À medida que os dispositivos móveis se tornaram mais poderosos e capazes de exibir sites completos, as limitações do design dos sites ficavam bem evidentes. -Além disso, esses sites para celular geralmente ofereciam uma experiência muito restrita. À medida que os dispositivos móveis se tornaram mais poderosos e capazes de exibir sites completos, os usuários de celular ficaram frustrados, pois, se viram presos na versão mobile do site e incapazes de acessar todas as informações que faziam parte da versão para desktop. +O meio-termo encontrado, antes do design responsivo tornar-se para a solução padrão para essa e outras situações, foi pensar os designs para que eles fossem mobile-friendly, isto é mais amigáveis com as particularidades presentes nos dispositivos móveis e essa forma de pensar recebeu ao longo do tempo outros nomes como web design mobile e desenvolvimento web mobile. Aqui encontramos ideias comuns que despontariam no design responsivo mais à frente, as principais diferenças entre essas duas abordagens tem a ver com os dispositivos envolvidos e as ferramentas de tecnologia disponíveis para construir as soluções. -## Layouts flexiveis antes do design responsivo +## Layouts flexiveis antes do Design Responsivo -Várias abordagens foram desenvolvidas para tentar resolver as desvantagens dos métodos de largura líquida ou largura fixa da construção de sites. Em 2004, Cameron Adams escreveu um artigo intitulado [Resolution dependent layout](http://www.themaninblue.com/writing/perspective/2004/09/21/), descrevendo um método para criar um design que pudesse se adaptar a diferentes resoluções de tela. Essa abordagem necessitava do JavaScript para detectar a resolução da tela e carregar o CSS correto. +Várias abordagens foram desenvolvidas para tentar resolver as desvantagens dos métodos de largura líquida ou largura fixa da construção de sites. Em 2004, Cameron Adams escreveu um artigo intitulado [Resolution dependent layout](https://www.themaninblue.com/writing/perspective/2004/09/21/), descrevendo um método para criar um design que pudesse se adaptar a diferentes resoluções de tela. Essa abordagem necessitava do JavaScript para detectar a resolução da tela e carregar o CSS correto. Zoe Mickley Gillenwater foi fundamental no [seu trabalho](http://zomigi.com/blog/voices-that-matter-slides-available/) de descrever e formalizar as diferentes maneiras pelas quais sites flexíveis poderiam ser criados, tentando encontrar um meio termo entre preencher a tela ou ter tamanho completamente fixo. -## Design Responsivo +## Introduzindo o Design Responsivo -O termo design responsivo foi [cunhado por Ethan Marcotte em 2010](https://alistapart.com/article/responsive-web-design/), e descreveu o uso de três técnicas combinadas. +O termo design responsivo foi [cunhado por Ethan Marcotte em 2010](https://alistapart.com/article/responsive-web-design/), e descreveu o uso de três técnicas combinadas para atingir uma página com design de boa responsividade. -1. A primeira foi a ideia de grids fluidas, que já estava sendo explorada por Gillenwater, e pode ser encontrada no artigo de Marcotte, [Fluid Grids](https://alistapart.com/article/fluidgrids/) (publicado em 2009 em A List Apart). -2. A segunda técnica foi a ideia de [imagens fluidas](http://unstoppablerobotninja.com/entry/fluid-images). Usando uma técnica muito simples que setava a propriedade `max-width` com `100%`, as imagens seriam reduzidas se a coluna que as continha se tornasse mais estreita que o tamanho intrínseco da imagem, mas nunca aumentariam. Isso permitiu que uma imagem fosse reduzida em tamanho para caber em uma coluna de tamanho flexível, em vez de transbordar, mas não aumentava e nem tornava-se pixelizada se a coluna fosse mais larga que a imagem. -3. O terceiro componente-chave foi a [media query](/pt-BR/docs/Web/CSS/Media_Queries). Media Queries habilitavam o tipo de opção de layout usando o JavaScript, que Cameron Adams havia explorado anteriormente, usando apenas CSS. Em vez de ter um layout para todos os tamanhos de tela, o layout podia ser alterado. As barras laterais podiam ser reposicionadas para a tela menor ou uma navegação alternativa podia ser exibida. +1. A primeira foi a ideia de grids flexíveis, que já estava sendo explorada por Gillenwater, e pode ser encontrada no artigo de Marcotte, [Fluid Grids](https://alistapart.com/article/fluidgrids/) (publicado em 2009 em A List Apart). +2. A segunda técnica foi a ideia de [imagens fluidas](https://unstoppablerobotninja.com/entry/fluid-images). Usando uma técnica muito simples que setava a propriedade `max-width` com `100%`, as imagens seriam reduzidas se a coluna que as continha se tornasse mais estreita que o tamanho intrínseco da imagem, mas nunca aumentariam. Isso permitiu que uma imagem fosse reduzida em tamanho para caber em uma coluna de tamanho flexível, em vez de transbordar, mas não aumentava e nem tornava-se pixelizada se a coluna fosse mais larga que a imagem. +3. O terceiro componente-chave foi a [media query](/pt-BR/docs/Web/CSS/CSS_media_queries). Media Queries habilitavam o tipo de opção de layout usando o JavaScript, que Cameron Adams havia explorado anteriormente, usando apenas CSS. Em vez de ter um layout para todos os tamanhos de tela, o layout podia ser alterado. As barras laterais podiam ser reposicionadas para a tela menor ou uma navegação alternativa podia ser exibida. -É importante entender que **o design responsivo não é uma tecnologia separada** — é um termo usado para descrever uma abordagem ao web design, ou um conjunto de melhores práticas, usado para criar um layout que possa _responder_ ao dispositivo que está sendo usado para visualizar o conteúdo. Na exploração original de Marcotte, isso significava grades flexíveis (usando floats) e media queries, no entanto, nos últimos 10 anos, desde que o artigo foi escrito, trabalhar de forma responsiva se tornou um padrão. Os métodos de layout CSS modernos são inerentemente responsivos, e temos coisas novas incorporadas à plataforma web para facilitar o design de sites responsivos. +É importante entender que **o design responsivo não é uma tecnologia separada** — é um termo usado para descrever uma abordagem ao web design, ou um conjunto de melhores práticas, usado para criar um layout que possa _responder_ de forma mais adequada ao dispositivo que está sendo usado para visualizar o conteúdo. Na exploração original de Marcotte, isso significava grids flexíveis fluídos (inicialmente construídos usando floats) e media queries, no entanto, nos últimos 10 anos, desde que o artigo foi escrito, trabalhar de forma responsiva se tornou um padrão. Os métodos de layout CSS modernos são inerentemente responsivos, e temos coisas novas incorporadas à plataforma web para facilitar o design de sites responsivos. -O restante deste artigo indicará os vários recursos da plataforma web que você pode usar ao criar um site responsivo. +O restante deste artigo indicará informações sobre esses recursos para que você possa usá-los ao criar um site responsivo. ## Media Queries -O Design Responsivo apenas foi capaz de emergir devido o recurse de media query. A especificação Media Queries Level 3 se tornou uma Recomendação de Candidato em 2009, significando que estava pronto para ser implementado nos browsers. Media Queries nos permitem executar uma série de testes (e.g. se a tela do usuário é maior que uma certa largura, ou uma certa resolução) e aplicar um CSS seletivamente para estilizar a página de acordo com as necessidades do usuário. +Media Queries nos permitem executar uma série de testes (e.g. se a tela do usuário é maior que uma certa largura, ou uma certa resolução) e aplicar um CSS seletivamente para estilizar a página de acordo com as necessidades do usuário e as capacidades da tela pela qual ele acessa a página. -Por exemplo, a seguinte media querie testa se a página atual está sendo exibida como mídia de tela (portanto, não é um documento impresso) e o viewport tem pelo menos 800 pixels de largura. O CSS para o seletor `.container` será aplicado apenas se essas duas condições forem verdade. +Por exemplo, a seguinte media query testa se a página atual está sendo exibida como mídia de tela (portanto, não é um documento impresso) e o viewport tem pelo menos `800px` ou `80 rem` de largura. O CSS para o seletor `.container` será aplicado apenas se essas duas condições forem verdade. ```css @media screen and (min-width: 800px) { @@ -92,50 +98,27 @@ Por exemplo, a seguinte media querie testa se a página atual está sendo exibid Você pode adicionar múltiplos media queries dentro de uma folha de estilo, ajustando inteiramente seu layout ou partes dele que melhor se adequem a vários tamanhos de tela. Os pontos em quem uma Media Query é introduzida e o layout alterado são conhecidos como _breakpoints_. -Uma abordagem comum ao utilizar Media Queries é criar um layout de única coluna para dispositivos de telas pequenas (e.g smartphones), então fazer a checagem para telas maiores e implementar um layout de múltiplas colunas quando houver largura suficiente. Esse design é frequentemente descrito como **mobile first**. - -Encontre mais detalhes na documentação MDN para [Media Queries](/pt-BR/docs/Web/CSS/Media_Queries). - -## Grids Flexíveis - -Sites responsivos não apenas mudam seu layout entre _breakpoints_, eles são construídos em grids flexíveis. Um grid flexível significa que não há necessidade de marcar todos os tamanhos possíveis existentes, e sim, construir um layout perfeito baseado em pixels que se adequa automaticamente à tela. Essa abordagem seria impossível dado o vasto número de dispositivos com tamanhos diferentes que existem e o fato de que, mesmo nos desktops, as pessoas nem sempre utilizam a janela do navegador maximizada. - -Com o uso de um grid flexível, não há necessidade de adicionar um _breakpoint_ e alterar o desing no ponto onde o conteúdo começa a parecer ruim em determinada tela. Por exemplo, se o comprimento da linha se torna ilegível à medida que o tamanho da tela aumenta, ou uma caixa se fica espremida com duas palavras em cada linha, conforme o tamanho diminui. - -Nos primórdios do design responsivo a única opção disponível para realizar layouts era utilizando [floats](/pt-BR/docs/Learn/CSS/CSS_layout/Floats). Layouts flexíveis flutuantes eram alcançados dando a cada elemento uma largura percentual, garantindo que em todo layout os totais não fossem maior que 100%. In his original piece on fluid grids, Marcotte detailed a formula for taking a layout designed using pixels and converting it into percentages. - -``` -target / context = result -``` - -For example if our target column size is 60 pixels, and the context (or container) it is in is 960 pixels, we divide 60 by 960 to get a value we can use in our CSS, after moving the decimal point two places to the right. +Uma abordagem comum ao utilizar Media Queries é criar um layout de única coluna para dispositivos de telas pequenas (e.g smartphones), então fazer a checagem para telas maiores e implementar um layout de múltiplas colunas quando houver largura suficiente. Esse design é frequentemente descrito como design **mobile first**. -```css -.col { - width: 6.25%; /* 60 / 960 = 0.0625 */ -} -``` +Ao utilizar _breakpoints_, é uma boa prática optar por definir esses breakpoints de media queries com medidas em unidades relativas de comprimento como as listadas em [unidades relativas](/pt-BR/docs/Learn/CSS/Building_blocks/Values_and_units#relative_length_units) em oposição das medidas absolutas em pixels de um dispositivo qualquer. -This approach will be found in many places across the web today, and it is documented here in the layout section of our [Legacy layout methods](/pt-BR/docs/Learn/CSS/CSS_layout/Legacy_Layout_Methods) article. It is likely that you will come across websites using this approach in your work, so it is worth understanding it, even though you would not build a modern site using a float-based flexible grid. +Existem também, diferentes abordagens para os estilos definados dentro do bloco de media query; variando desde utilizar as media queries com o elemento [``](/pt-BR/docs/Web/HTML/Element/link) para ligar-se com diferentes folhas de estilo com base nos intervalos de tamanho do navegador até incluir apenas variáveis com propriedades customizadas para armazenar valores associados com cada _breakpoint_. -The following example demonstrates a simple responsive design using Media Queries and a flexible grid. On narrow screens the layout displays the boxes stacked on top of one another: +Encontre mais detalhes sobre o assunto na documentação MDN para [Media Queries](/pt-BR/docs/Web/CSS/CSS_media_queries). -![A mobile view of the layout with boxes stacked on top of each other vertically.](mdn-rwd-mobile.png) +Media queries podem ajudar no design responsivo, mas não são obrigatórias. Grids flexíveis, unidades relativas e valores de unidade máximos e mínimos podem ser utilizados sem as queries. -On wider screens they move to two columns: +## Tecnologias de layout responsivo -![A desktop view of a layout with two columns.](mdn-rwd-desktop.png) +Sites responsivos são alicerçados em grids flexíveis, isso significa que não é mais necessário o esforço hercúleo de criar um layout com medidas absolutas perfeitas para cada dispositivo possível existente que é capaz de acessar a sua página. Essa abordagem seria impraticável mesmo se fosse possível dado o vasto número de dispositivos com tamanhos diferentes que existem e o fato de que, mesmo nos desktops, as pessoas nem sempre utilizam a janela do navegador maximizada. -> [!NOTE] -> You can find the [live example](https://mdn.github.io/css-examples/learn/rwd/float-based-rwd.html) and [source code](https://github.com/mdn/css-examples/blob/master/learn/rwd/float-based-rwd.html) for this example on GitHub. - -## Modern layout technologies +Ao utilizar um grid flexível, você pode mudar uma propriedade ou adicionar um _breakpoint_, para alterar o design onde quer que o conteúdo comece a ficar com exibição ruim. Por exemplo, para garantir que linhas não atinjam um comprimento em que ficam ilegivelmente longas à medida que o tamanho da tela aumenta, é possível usar `columns`; Se uma `box` fica esmagada com duas palavras por linha à medida que ela se estreita, você pode definir um _breakpoint_. -Modern layout methods such as [Multiple-column layout](/pt-BR/docs/Learn/CSS/CSS_layout/Multiple-column_Layout), [Flexbox](/pt-BR/docs/Learn/CSS/CSS_layout/Flexbox), and [Grid](/pt-BR/docs/Learn/CSS/CSS_layout/Grids) are responsive by default. They all assume that you are trying to create a flexible grid and give you easier ways to do so. +Diversos métodos de layout modernos como o [Multiple-column layout](/pt-BR/docs/Learn/CSS/CSS_layout/Multiple-column_Layout), [Flexbox](/pt-BR/docs/Learn/CSS/CSS_layout/Flexbox), and [Grid](/pt-BR/docs/Learn/CSS/CSS_layout/Grids) são, por padrão, responsivos. Todos eles presumem prontamente que você está tentando criar um grid flexível e oferecem maneiras mais fáceis para fazer isso. ### Multicol -The oldest of these layout methods is multicol — when you specify a `column-count`, this indicates how many columns you want your content to be split into. The browser then works out the size of these, a size that will change according to the screen size. +O mais antigo desses métodos de layout é o multicol - quando você especifica uma `colum-count`, indicando o número de colunas no qual você deseja que o seu conteúdo seja dividido. O navegador então calcula o tamanho dessas colunas, que mudará conforme o tamanho disponível na tela. ```css .container { @@ -143,7 +126,7 @@ The oldest of these layout methods is multicol — when you specify a `column-co } ``` -If you instead specify a `column-width`, you are specifying a _minimum_ width. The browser will create as many columns of that width as will comfortably fit into the container, then share out the remaining space between all the columns. Therefore the number of columns will change according to how much space there is. +Se, ao invés de especificar uma `column-count`, você escolher especificar uma `column-width` então você determina um valor _mínimo_ de largura para cada coluna. Com essa informação, o navegador criará o máximo de colunas possível com aquela largura e que caibam no container para daí dividir o espaço restante entre todas as colunas, separando-as. Portanto, o número de colunas muda conforme a quantidade de espaço disponível na tela. ```css .container { @@ -151,11 +134,13 @@ If you instead specify a `column-width`, you are specifying a _minimum_ width. T } ``` +Também é possível usar a propriedade abreviada `columns` para fornecer tanto o número máximo de colunas da `column-count` quanto a largura mínima por coluna da `column-width`. Dessa forma é possível assegurar que, caso o tamanho da tela aumente, os comprimentos de linha não fiquem longos demais a ponto de ficarem ilegíveis e, caso o tamanho da tela diminua, estreitas demais requerendo rolagem horizontal frequente a cada, digamos, um ou dois parágrafos. + ### Flexbox -In Flexbox, flex items will shrink and distribute space between the items according to the space in their container, as their initial behavior. By changing the values for `flex-grow` and `flex-shrink` you can indicate how you want the items to behave when they encounter more or less space around them. +No Flexbox, items flex apresentam o comportamento inicial de encolher e distribuir espaço entre si de acordo com o espaço disponível no seu container. Mudando os valores para `flex-grow` e `flex-shrink`, conseguimos manipular como esses items devem se comportar quando ocorre de haver mais ou menos espaço ao redor. -In the example below the flex items will each take an equal amount of space in the flex container, using the shorthand of `flex: 1` as described in the layout topic [Flexbox: Flexible sizing of flex items](/pt-BR/docs/Learn/CSS/CSS_layout/Flexbox#Flexible_sizing_of_flex_items). +No exemplo abaixo cada um dos items flex vai ocupar quantidades iguais de espaço no flex container, usando a propriedade abreviada `flex: 1` como está descrito no tópico de layout [Flexbox: Dimensionamento flexível de elementos flex](/pt-BR/docs/Learn/CSS/CSS_layout/Flexbox#flexible_sizing_of_flex_items). ```css .container { @@ -168,11 +153,13 @@ In the example below the flex items will each take an equal amount of space in t ``` > [!NOTE] -> As an example we have rebuilt the simple responsive layout above, this time using flexbox. You can see how we no longer need to use strange percentage values to calculate the size of the columns: [example](https://mdn.github.io/css-examples/learn/rwd/flex-based-rwd.html), [source code](https://github.com/mdn/css-examples/blob/master/learn/rwd/flex-based-rwd.html). +> Para exemplificar o layout responsivo simples mostrado acima foi refatorado, mas dessa vez utilizando flexbox. É perceptível que não é necessário utilizar valores percentuais arcanos para calcular o tamanho das colunas: [exemplo](https://mdn.github.io/css-examples/learn/rwd/flex-based-rwd.html), [código-fonte](https://github.com/mdn/css-examples/blob/master/learn/rwd/flex-based-rwd.html). ### CSS grid -In CSS Grid Layout the `fr` unit allows the distribution of available space across grid tracks. The next example creates a grid container with three tracks sized at `1fr`. This will create three column tracks, each taking one part of the available space in the container. You can find out more about this approach to create a grid in the Learn Layout Grids topic, under [Flexible grids with the fr unit](/pt-BR/docs/Learn/CSS/CSS_layout/Grids#flexible_grids_with_the_fr_unit). +No CSS Layout Grid, a unidade `fr` permite distribuir o espaço disponível ao longo das faixas do grid. O exemplo a seguir cria um grid container com três faixas iguais de tamanho fixado em `1fr`. Isto irá criar três faixas em formato de colunas, cada coluna tomando para si uma parte do espaço disponível no container. + +Você pode descobrir mais sobre como criar um grid com a unidade `fr` no tópico Aprenda Layout com Grids em [Grids Flexíveis com a unidade fr](/pt-BR/docs/Learn/CSS/CSS_layout/Grids#flexible_grids_with_the_fr_unit). ```css .container { @@ -182,31 +169,43 @@ In CSS Grid Layout the `fr` unit allows the distribution of available space acro ``` > [!NOTE] -> The grid layout version is even simpler as we can define the columns on the .wrapper: [example](https://mdn.github.io/css-examples/learn/rwd/grid-based-rwd.html), [source code](https://github.com/mdn/css-examples/blob/master/learn/rwd/grid-based-rwd.html). +> A versão do layout em grid é ainda mais simples pois podemos definir as colunas no `.wrapper`: [exemplo](https://mdn.github.io/css-examples/learn/rwd/grid-based-rwd.html), [código-fonte](https://github.com/mdn/css-examples/blob/master/learn/rwd/grid-based-rwd.html). -## Responsive images +## Imagens/mídias responsivas -The simplest approach to responsive images was as described in Marcotte's early articles on responsive design. Basically, you would take an image that was at the largest size that might be needed, and scale it down. This is still an approach used today, and in most stylesheets you will find the following CSS somewhere: +A abordagem considerada mais simples para garantir que mídias como imagens, vídeos e áudios nunca sejam maiores que o seu respectivo container responsivo é a seguinte: ```css -img { +img, +picture, +video { max-width: 100%: } ``` -There are obvious downsides to this approach. The image might be displayed a lot smaller than its intrinsic size, which is a waste of bandwidth — a mobile user may be downloading an image several times the size of what they actually see in the browser window. In addition, you may not want the same image aspect ratio on mobile as on desktop. For example, it might be nice to have a square image for mobile, but show the same scene as a landscape image on desktop. Or, acknowledging the smaller size of an image on mobile you might want to show a different image altogether, one which is more easily understood at a small screen size. These things can't be achieved by simply scaling down an image. +O que nós fizemos aqui foi escalonar as mídias para que elas nunca transbordem para fora de seus containers. Obviamente existem desvantagens ao utilizar essa abordagem como por exemplo quando temos uma única imagem grande e ao reduzi-la para que caiba em dispositivos menores resulta em desperdício significativo da largura de banda - o dispositivo faz o download do tamanho completo da imagem para e no final mostra uma fração bastante reduzida, mais adequada para caber na tela. Além disso, você pode querer que uma imagem tenha proporções de aspecto diferentes para dispositivos móveis e dispositivos desktop como por exemplo uma imagem que fica em formato quadrado para dispositivos móveis, mas que se transmuta para formato paisagem na versão desktop. + +Imagens responsivas são capazes de solucionar essas duas problemáticas, utilizando o elemento [``](/pt-BR/docs/Web/HTML/Element/picture) e os atributos `srcset` e `sizes` de [``](/pt-BR/docs/Web/HTML/Element/img) para permitir que imagens escolhidas a dedo para a viewport e a resolução do usuário sejam servidas. O elemento `` permite que múltiplos tamanhos sejam dados junto com "hints" ou "pistas" (metadados que descrevem o tamanho da tela e a resolução para os quais a imagem é mais adequada) e a partir dessas pistas, o navegador escolherá qual a imagem mais apropriada para cada dispositivo, garantindo que o usuário fará o download de uma imagem com tamanho apropriado para seu dispositivo. Usar `` em conjunto com `max-width` remove a necessidade de mensurar imagens com media queries, possibilitando direcionar imagens com diferentes proporções de aspecto para tamanhos de viewport diferentes. + +Também é possível utilizar o _art direction_ para imagens usadas em tamanhos diferentes, assim provendo um recorte diferente ou até mesmo uma imagem completamente distinta para tamanhos de tela diferentes. -Responsive Images, using the [``](/pt-BR/docs/Web/HTML/Element/picture) element and the [``](/pt-BR/docs/Web/HTML/Element/img) `srcset` and `sizes` attributes solve both of these problems. You can provide multiple sizes along with "hints" (meta data that describes the screen size and resolution the image is best suited for), and the browser will choose the most appropriate image for each device, ensuring that a user will download an image size appropriate for the device they are using. +Você pode encontrar um guia detalhado nesta seção de Aprenda HTML do MDN sobre [Imagens Responsivas](/pt-BR/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images). -You can also _art direct_ images used at different sizes, thus providing a different crop or completely different image to different screen sizes. +Outras dicas úteis são: -You can find a detailed [guide to Responsive Images in the Learn HTML section](/pt-BR/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images) here on MDN. +- Tenha certeza de sempre utilizar uma imagem de formato apropriado para as imagens que você planeja utilizar (como `.png` ou `.jpg`/`.jpeg`) e de otimizar o tamanho do arquivo com o auxílio de editores gráficos antes de colocar as imagens no seu website ou página web. +- Você pode fazer uso de recursos do CSS como [gradients](/pt-BR/docs/Web/CSS/CSS_images/Using_CSS_gradients) e [shadows](/pt-BR/docs/Web/CSS/box-shadow) para criar efeitos visuais sem o uso de imagens. +- Também é possível usar media queries dentro do atributo media de elementos [``](/pt-BR/docs/Web/HTML/Element/source) aninhados no interior de elementos [`