<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Design responsivo - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Design responsivo - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 26 May 2026 10:15:54 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/design-responsivo/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como criar tabelas responsivas com CSS puro usando o Grid Layout ]]>
                </title>
                <description>
                    <![CDATA[ Versão resumida A maneira mais popular de exibir uma coleção de dados semelhantes é pelo uso de tabelas, mas a tabela do HTML têm a desvantagem de ser difícil de tornar responsivas. Neste artigo, eu uso o Grid Layout do CSS e suas propriedades (sem usar o JavaScript) para criar ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-tabelas-responsivas-com-css-puro-usando-o-grid-layout/</link>
                <guid isPermaLink="false">63e9264f58018c06027be980</guid>
                
                    <category>
                        <![CDATA[ Design responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Felipe Ribeiro Portela ]]>
                </dc:creator>
                <pubDate>Mon, 08 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_CthvMCprY75MLB_q8BygXg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/https-medium-com-nakayama-shingo-creating-responsive-tables-with-pure-css-using-the-grid-layout-module-8e0ea8f03e83/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to create responsive tables with pure CSS using Grid Layout Module</a>
      </p><h3 id="vers-o-resumida"><strong>Versão resumida</strong></h3><p>A maneira mais popular de exibir uma coleção de dados semelhantes é pelo uso de tabelas, mas a tabela do HTML têm a desvantagem de ser difícil de tornar responsivas.</p><p>Neste artigo, eu uso o Grid Layout do CSS e suas propriedades (sem usar o JavaScript) para criar tabelas que encapsulam colunas, dependendo da largura da tela, com ainda mais mudanças para um <em>card</em> baseado em layout para telas pequenas.</p><p>Para os impacientes, vejam no Codepen a seguir a implementação de um exemplo.</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_LMLeRZ" src="https://codepen.io/ShingoNakayama/embed/preview/LMLeRZ?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=LMLeRZ" title="Responsive tables with pure CSS using Grid Layout Module" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><h3 id="uma-pequena-hist-ria-sobre-as-tabelas-responsivas-do-html"><strong>Uma pequena história sobre as tabelas responsivas do HTML </strong></h3><p>Tabelas responsivas não são um novo tópico. Muitas soluções já foram propostas. <strong><a href="https://css-tricks.com/responsive-data-table-roundup/">Responsive Data Table Roundup</a> </strong>(Resumo sobre tabelas responsivas de dados, em português), publicado pela primeira vez em 2012 por Chris Coyier, faz um bom resumo de modo muito claro (incluindo uma atualização de 2018).</p><p><a href="https://css-tricks.com/responsive-data-table-roundup/"><strong>Really Responsive Tables using CSS3 Flexbox</strong></a> (Tabelas realmentes responsivas usando CSS3 Flexbox, em português) por Vasan Subramanian, mostra uma ideia de agrupar colunas, implementada com o Flexbox.</p><p>Embora muitas ideias interessantes tenham sido propostas, bibliotecas como &nbsp;o <a href="https://getbootstrap.com/docs/4.0/content/tables/#responsive-tables">Bootstrap</a> optam pela rolagem horizontal para telas pequenas.</p><p>Como agora temos o CSS Grid, penso que poderíamos ter uma alternativa comum para uma melhor rolagem horizontal.</p><h3 id="tabelas-em-html"><strong>Tabelas em HTML </strong></h3><p>Iniciando pelo básico, uma tabela no HTML é um formato de layout para mostrar uma coleção de itens através de uma matriz de linhas e colunas. Os itens são dispostos em linhas, com os mesmos atributos de dados nas mesmas colunas, com as linhas frequentemente ordenadas com um ou mais atributos ordenáveis. O formato oferece uma visão panorâmica para compreender e examinar rapidamente grandes quantidades de dados.</p><p>Por exemplo, aqui está uma tabela hipotética de detalhes do pedido de compra, que você pode ver em uma aplicação de compras.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_B78yFFUVc1X8uEp_gVLcNw.png" class="kg-image" alt="1_B78yFFUVc1X8uEp_gVLcNw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_B78yFFUVc1X8uEp_gVLcNw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_B78yFFUVc1X8uEp_gVLcNw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="57" loading="lazy"><figcaption>Detalhes de uma tabela de pedidos de compra</figcaption></figure><p>Um item, neste caso, é um detalhe do pedido de compra, que possui atributos como número da peça, descrição da peça etc.</p><p>Ao usar tabelas em HTML, o layout dos dados é codificado como linhas e colunas (<code>&lt;tr&gt;</code> e <code>&lt;td&gt;</code>, respectivamente). Isso pode ser suficiente para uso por uma tela que se encaixe em toda a largura da tabela, mas, na realidade, não se aplica aos inúmeros tipos de dispositivos que existem hoje. Em termos de <em>hacks</em>, você pode alterar a propriedade de exibição das tabelas e usar qualquer layout que possa fazer com CSS em geral, mas não parece semanticamente correto. &nbsp;</p><h3 id="tabelas-redefinidas-ou-uma-cole-o-de-itens-"><strong>Tabelas redefinidas (ou uma c</strong>oleção de itens<strong>)</strong></h3><p>Vamos iniciar redefinindo como os dados da tabela devem ser expressos em HTML.</p><p>Conforme falado anteriormente, como os dados da tabela são essencialmente uma coleção ordenada de itens, parece natural usar listas ordenadas. Além disso, como as tabelas são frequentemente usadas para gerar descrições textuais, parece natural incluir isso uma seção, mas isso pode depender do contexto de como os dados da tabela são usados.</p><pre><code class="language-html">&lt;section&gt;
 &lt;ol&gt;
  &lt;!-- O primeiro item da lista é o cabeçalho da tabela --&gt;
  &lt;li&gt;
   &lt;div&gt;#&lt;/div&gt;
   &lt;!-- Envolva atributos semanticamente semelhantes como uma hierarquia de divs --&gt;
   &lt;div&gt;
    &lt;div&gt;Número da peça&lt;/div&gt;
    &lt;div&gt;Descrição da peça&lt;/div&gt;
   &lt;/div&gt;
   ...
  &lt;/li&gt;
  &lt;!-- O resto dos itens da lista são os dados de fato --&gt;
  &lt;li&gt;
   &lt;div&gt;1&lt;/div&gt;
   &lt;!-- Informações relacionadas ao grupo de peças --&gt;
   &lt;div&gt;
    &lt;div&gt;100-10001&lt;/div&gt;
    &lt;div&gt;Descrição das peças&lt;/div&gt;
   &lt;/div&gt;
  ...
  &lt;/li&gt;
 ...
 &lt;/ol&gt;
&lt;/section&gt;</code></pre><p>As <code>&lt;div&gt;</code> "puras" são usadas para expressar atributos de itens, uma vez que o HTML5 não define uma tag apropriada para isso. A chave aqui é expressar semanticamente atributos similares como um hierarquia de <code>&lt;div&gt;</code>. Essa estrutura será usada ao definir como os dados devem ser dispostos. Voltarei nesse ponto na próxima seção de tópicos de estilos.</p><p>Quanto aos dados reais dentro do elemento <code>&lt;div&gt;</code>, o primeiro item da lista é o cabeçalho e o restante dos itens são os dados principais.</p><p>Agora, é o momento de falar sobre estilizar os itens de estilos com o CSS Grid.</p><h3 id="estilizando-cole-es-de-itens"><strong>Estilizando coleções de itens</strong></h3><p>A ideia básica aqui é exibir todos os atributos de itens como uma tabela normal, se a largura de exibição permitir. Esse layout ajuda a poder ver o máximo de itens (<em>linhas</em>) possíveis.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_6sZipUcqB3hru4Q5r0kORw.png" class="kg-image" alt="1_6sZipUcqB3hru4Q5r0kORw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_6sZipUcqB3hru4Q5r0kORw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_6sZipUcqB3hru4Q5r0kORw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="48" loading="lazy"><figcaption>Tabela completa</figcaption></figure><p>Quando a largura da exibição fica mais estreita, alguns atributos são empilhados verticalmente para economizar espaço horizontal. A escolha dos atributos empilhados deve ser baseada em:</p><ol><li>Os atributos fazem sentido quando estão empilhados ? </li><li>Quando empilhados verticalmente, o espaço horizontal é preservado? </li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_llLsnXzdnBBfMRPqoKNBmw.png" class="kg-image" alt="1_llLsnXzdnBBfMRPqoKNBmw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_llLsnXzdnBBfMRPqoKNBmw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_llLsnXzdnBBfMRPqoKNBmw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="110" loading="lazy"><figcaption>Agrupando a tabela 1: comece agrupando as colunas que precisam de pouca largura e dê espaço para as outras colunas</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_DdQ-n4VzeGU1EzhRKdHj8w.png" class="kg-image" alt="1_DdQ-n4VzeGU1EzhRKdHj8w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_DdQ-n4VzeGU1EzhRKdHj8w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_DdQ-n4VzeGU1EzhRKdHj8w.png 800w" sizes="(min-width: 720px) 720px" width="800" height="116" loading="lazy"><figcaption>Agrupando a tabela 2: agrupe "Part Description" (descrição da peça) para poder ver a descrição</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_ys0ukWXXtbWhVyXTD9E0Zw.png" class="kg-image" alt="1_ys0ukWXXtbWhVyXTD9E0Zw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_ys0ukWXXtbWhVyXTD9E0Zw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_ys0ukWXXtbWhVyXTD9E0Zw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="145" loading="lazy"><figcaption>Agrupando a tabela 3: agrupe ainda mais com "Vendor Name" (nome do fornecedor)</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_-ik1zA0LDXzWib7Ux-4EpQ.png" class="kg-image" alt="1_-ik1zA0LDXzWib7Ux-4EpQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_-ik1zA0LDXzWib7Ux-4EpQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_-ik1zA0LDXzWib7Ux-4EpQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="267" loading="lazy"><figcaption>Agrupando a tabela 4: envolva as informações relacionadas ao <em>"Vendor"</em> (fornecedor) em informações relacionadas à <em>"Part" (peça)</em></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_sEvQQjZoux7PEii3JQpCRg.png" class="kg-image" alt="1_sEvQQjZoux7PEii3JQpCRg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_sEvQQjZoux7PEii3JQpCRg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_sEvQQjZoux7PEii3JQpCRg.png 747w" sizes="(min-width: 720px) 720px" width="747" height="353" loading="lazy"><figcaption>Agrupando a tabela 5: tabela totalmente agrupada</figcaption></figure><p>Quando a largura diminui ainda mais para o tamanho de um dispositivo móvel, cada item é exibido como um <em>card</em>. Este layout tem redundância, pois os nomes dos atributos são exibidos repetidamente em cada <em>card </em>e tem a menor capacidade de visualização, mas isso não compromete a usabilidade (por exemplo, rolagem horizontal, texto muito pequeno etc).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_jI0hhzrpYpjbO3-fGh8IWA.png" class="kg-image" alt="1_jI0hhzrpYpjbO3-fGh8IWA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_jI0hhzrpYpjbO3-fGh8IWA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_jI0hhzrpYpjbO3-fGh8IWA.png 695w" width="695" height="485" loading="lazy"><figcaption>Layout de <em>card</em> de duas colunas</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_XCCcicUngRBcBaKyETC4vg.png" class="kg-image" alt="1_XCCcicUngRBcBaKyETC4vg" width="445" height="722" loading="lazy"><figcaption>Layout de <em>card</em> de uma coluna</figcaption></figure><p>Agora vamos aos detalhes.</p><h3 id="estiliza-o-passo-1-a-tabela-inteira">Estilização – passo 1: a tabela inteira</h3><p>Aqui está um resumo visual de como serão as alterações implementadas com o CSS Grid.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_uA9PfcQ9JCzY54mH7p_v-A.png" class="kg-image" alt="1_uA9PfcQ9JCzY54mH7p_v-A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_uA9PfcQ9JCzY54mH7p_v-A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_uA9PfcQ9JCzY54mH7p_v-A.png 755w" sizes="(min-width: 720px) 720px" width="755" height="344" loading="lazy"><figcaption>Contêineres do grid</figcaption></figure><p>Para fazer com que as colunas sejam agrupadas, vários <em>grid containers</em> são definidos como uma hierarquia. As caixas<em> </em>vermelhas são um tipo de <em>grid</em> <em>container</em> para cada linha e as caixas azuis são para cada grupo de colunas que é agrupado.</p><p>Vamos começar ajustando a lista como um <em>grid container</em>, definindo uma classe chamada <code>.item-container</code> e inserindo <code>&lt;li&gt;</code> (caixa vermelha).</p><pre><code class="language-css">.item-container {
    display: grid;
    grid-template-columns: 2em 2em 10fr 2fr 2fr 2fr 2fr 5em 5em;
}</code></pre><p>O número de colunas explícitas especificadas com &nbsp;<code>grid-template-columns</code> é igual a nove, que é o número de <code>&lt;div&gt;</code> de nível superior, diretamente aninhadas em &nbsp;<code>&lt;li&gt;</code>. </p><p>A largura da coluna é definida em comprimento relativo para fazer com que as colunas sejam agrupadas. A fração real deve ser ajustada com base no conteúdo.</p><p>As colunas que não foram encapsuladas são definidas em comprimento absoluto para maximizar o uso de largura para as colunas de quebra automática. No exemplo dos detalhes dos pedidos de compras (<em>purchase order details</em>), a segunda coluna é um ID de dois dígitos, então defino a largura para dobrar esse tamanho de 2 <em>em</em>. &nbsp; &nbsp;</p><p>Em seguida, definimos outro <em>grid container </em>chamado<em> </em><code>.attribute-container</code> e o aplicamos em todas as <code>&lt;div&gt;</code> intermediárias sob a lista (caixas azuis). </p><pre><code class="language-css">.attribute-container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(var(--column-width-min), 1fr));
    }</code></pre><p>A largura mínima da coluna para todos os itens do grid em <code>.attribute-container</code> é especificada com variável do CSS chamada <code>--column-width-min</code> &nbsp;(abordaremos isso mais tarde) usando a função <code>minmax</code>, com o máximo definido para ocupar o resto do espaço (exemplo: uma fração). Como <code>grid-template-columns</code> está definido como <code>repeat</code>, o espaço horizontal disponível será dividido ao número máximo de colunas que possa ocupar, pelo menos, <code>--column-width-min</code>. O restante das colunas vai para a próxima linha. A largura da coluna será esticada se houver excesso de espaço horizontal, pois o <code>repeat</code> está definido como <code>auto-fit</code>. </p><h4 id="estiliza-o-passo-2-agrupando-a-tabela"><strong>Estilização – passo 2: agrupando a tabela </strong></h4><p>Em seguida, <code>--column-width-min</code> precisa ser independentemente especificado para cada coluna, a fim de agrupá-las. Só para ficar claro, as variáveis precisam ser especificadas para que a tabela inteira também seja renderizada corretamente. Para fazer isso, a <em>class </em>é definida para cada <code>.attribute-container</code>. Uma <code>--column-width-min</code> diferente é especificada para cada escopo de <em>class. </em></p><p>Vamos dar uma olhada no HTML, onde <code>.part-id</code> é aplicado,</p><pre><code class="language-html">&lt;div class="attribute-container part-id"&gt;
    &lt;div&gt;Part Number&lt;/div&gt;
    &lt;div&gt;Part Description&lt;/div&gt;
&lt;/div&gt;</code></pre><p>Vejamos também o CSS:</p><pre><code class="language-css">.part-id {
    --column-width-min: 10em;
}</code></pre><p>Esse grid container específico terá duas colunas, contanto que a largura disponível seja maior que 10 <em>em </em>para cada item do grid (exemplo: o <em>grid container </em>é mais largo do que 20 <em>em</em>).<em> </em>Uma vez que a largura do <em>grid container </em>se torne mais estreita do que 20 <em>em</em>, o segundo item <em>grid </em>passará para a próxima linha.</p><p>Quando combinamos as propriedades do CSS desse modo, precisaremos somente de um<em> grid container </em><code>.attribute-container</code>, com os detalhes alterados onde a <em>class</em> é aplicada.</p><p>Podemos ainda aninhar <code>.attribute-container</code>, para obter múltiplos níveis de agrupamento com diferentes larguras, como no exercício a seguir: </p><pre><code class="language-html">&lt;div class="attribute-container part-information"&gt;
    &lt;div class="attribute-container part-id"&gt;
        &lt;div class="attribute" data-name="Part Number"&gt;Número de peça&lt;/div&gt;
        &lt;div class="attribute" data-name="Part Description"&gt;Descrição da peça
    &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="attribute-container vendor-information"&gt;
        &lt;div class="attribute"&gt;Número do fornecedor&lt;/div&gt;
        &lt;div class="attribute"&gt;Nome do fornecedor&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
.part-information {
    --column-width-min: 10em;
}
.part-id {
    --column-width-min: 10em;
}
.vendor-information {
    --column-width-min: 8em;
}</code></pre><p>Todos os itens acima estão incluídos na <em>media query</em> abaixo. O <em>breakpoint </em>deve ser selecionado com base na largura necessária quando sua tabela é agrupada ao extremo.</p><pre><code>@media screen and (min-width: 737px) {
...
}</code></pre><h4 id="estiliza-o-passo-3-layout-de-cards"><strong>Estilização – passo 3: <em>layout </em>de <em>cards</em></strong></h4><p>O <em>layout </em>de <em>cards </em>será semelhante a um formulário típico, com nomes de atributos &nbsp;na primeira coluna e valores de atributos na segunda coluna.</p><p>Para fazer isso, uma <em>class</em> chamada <code>.attribute</code> é definida e aplicada para <em>todas as tags </em><code>&lt;div&gt;</code> <em>sob as </em><code>&lt;li&gt;</code>.</p><pre><code class="language-js">.attribute {
    display: grid;
    grid-template-columns: minmax(9em, 30%) 1fr;
}</code></pre><p>Os nomes dos atributos são obtidos de um atributo personalizado das <code>div</code> chamadas <code>data-name</code>, por exemplo &nbsp;<code>&lt;div class="atributo" data-name="Número da pela"&gt;</code> e um pseudoelemento é criado. O pseudoelemento estará sujeito ao layout do <em>grid container.</em></p><pre><code class="language-js">.atributo::before {
    content: attr(data-name);
}</code></pre><p>O primeiro item da lista é o cabeçalho e não precisa ser mostrado.</p><pre><code class="language-js">/* Não exiba o primeiro item, pois ele é usado para exibir o cabeçalho para layouts tabulares */
.collection-container&gt;li:first-child {
    display: none;
}</code></pre><p>Finalmente, os <em>cards</em> são expostos em uma coluna em dispositivos móveis, mas em duas para telas com um pouco mais de largura, mas não o bastante para mostrar uma tabela.</p><pre><code>/* 2 Colunas para o Card Layout */
@media screen and (max-width: 736px) {
    .collection-container {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-gap: 20px;
    }
...
}
/* 1  Coluna para Card Layout */
@media screen and (max-width:580px) {
    .collection-container {
        display: grid;
        grid-template-columns: 1fr;
    }
}</code></pre><h3 id="notas-finais"><strong>Notas finais</strong></h3><p>Acessibilidade é uma área que não foi considerada neste artigo e pode haver espaço para melhorias nesse quesito. Obrigado pela leitura.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Design responsivo para a web – como adaptar um site a celulares e tablets ]]>
                </title>
                <description>
                    <![CDATA[ Com a rápida evolução dos dispositivos conectados, o design responsivo continua a ser fundamental para o desenvolvimento para a web. Até pouco tempo atrás, a expressão "design responsivo para a web" sequer existia. Porém, hoje, muitos de nós precisaram adotar esse conceito de alguma maneira. De acordo com o site ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/design-responsivo-para-a-web-como-adaptar-um-site-a-celulares-e-tablets/</link>
                <guid isPermaLink="false">63f295b558018c06027bf8b9</guid>
                
                    <category>
                        <![CDATA[ Design responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Thu, 13 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/curve-design-futuristic-lines-911738.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/responsive-web-design-how-to-make-a-website-look-good-on-phones-and-tablets/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Responsive Web Design – How to Make a Website Look Good on Phones and Tablets</a>
      </p><p>Com a rápida evolução dos dispositivos conectados, o design responsivo continua a ser fundamental para o desenvolvimento para a web.</p><p>Até pouco tempo atrás, a expressão "design responsivo para a web" sequer existia. Porém, hoje, muitos de nós precisaram adotar esse conceito de alguma maneira.</p><p><a href="https://www.statista.com/statistics/275814/mobile-share-of-organic-search-engine-visits/">De acordo com o site Statistica</a> (em inglês), em 2019, 61% das pesquisas feitas no Google partiram de um dispositivo móvel. Em setembro de 2020, <a href="https://webmasters.googleblog.com/2020/03/announcing-mobile-first-indexing-for.html">a Google viria a mudar seu algoritmo de pesquisa</a> (texto em inglês) a fim de dar prioridade a sites que fossem compatíveis com dispositivos móveis.</p><p><strong>Neste artigo, serão abordados os seguintes tópicos:</strong></p><ul><li>O que é o design responsivo para a web?</li><li>A tag meta viewport e como ela funciona</li><li>Técnicas eficazes de design responsivo para a web para adaptar seu conteúdo a dispositivos móveis</li><li>Ferramentas para ajudar a simular e monitorar a experiência do usuário em celulares e tablets</li></ul><h2 id="o-que-o-design-responsivo-para-a-web"><strong>O que é o design responsivo para a web?</strong></h2><p>O design responsivo para a web é uma abordagem que tem como foco o ambiente do usuário do site. O ambiente do usuário dependerá do dispositivo que ele usa para se conectar à internet.</p><p>Existem diversos fatores que oferecem oportunidades para uma abordagem focada no usuário. Alguns desses fatores são:</p><ul><li>conexão de rede;</li><li>tamanho de tela;</li><li>tipo de interação (como tela sensível ao toque ou painel tátil);</li><li>resolução gráfica.</li></ul><p>Antes da popularização do design responsivo para a web, muitas empresas administravam um site à parte para receber tráfego encaminhado com base no agente do usuário.</p><p>Porém, no design responsivo para a web, o servidor sempre envia o mesmo código HTML para todos os dispositivos, enquanto o CSS é usado para alterar a renderização da página em cada dispositivo.</p><p>Independentemente dessas duas abordagens, a primeira etapa na criação de um site para celular ou tablet é garantir que o navegador conheça a intenção. É nesse ponto que a tag <em>meta viewport</em> entra em jogo.</p><h2 id="identificando-um-site-da-web-para-dispositivos-m-veis-com-a-tag-meta-viewport"><strong>Identificando um site da web para dispositivos móveis com a tag <em>meta viewport</em></strong></h2><p>A tag meta viewport faz o navegador se ajustar à largura da tela de cada dispositivo.</p><p>Sem o elemento <em>meta viewport</em>, os navegadores de dispositivos móveis exibirão páginas da web com configurações padrão para dispositivos desktop. O resultado disso é uma experiência não responsiva e com uma visualização bastante distanciada do conteúdo.</p><p>A seguir, temos uma implementação padrão:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;meta name="viewport" content="width=device-width,initial-scale=1"/&gt;</code></pre><figcaption>Exemplo da tag meta viewport</figcaption></figure><p>Agora que informamos ao navegador o que está acontecendo, que tal utilizarmos técnicas populares para tornar nosso site responsivo?</p><h2 id="media-queries-do-css-para-diferentes-tamanhos-e-orienta-es-de-tela"><strong>Media queries do CSS para diferentes tamanhos e orientações de tela</strong></h2><p>Se você é novo no design responsivo para a web, saiba que as <em>media queries</em> são o primeiro e mais importante recurso a ser aprendido. As <em>media queries</em> nos permitem estilizar os elementos com base na largura da <em>viewport</em>. Uma estratégia popular do CSS é estabelecer estilos com foco nos dispositivos móveis primeiro (técnica que, em inglês, chama-se <em>mobile first</em>) e, a partir deles, desenvolver estilos mais complexos e específicos para o desktop.</p><p>As <em>media queries</em> são uma parte importante do design responsivo para a web. Elas são comumente usadas para atributos como <em>grid layout</em>, <em>font-size</em>, <em>margin</em> e <em>padding</em> para que eles possam se comportar de maneira diferente, dependendo da tela do dispositivo.</p><p>Aqui, temos um exemplo bastante comum de estilo usando a técnica do <em>mobile first</em>. Nele, vemos que a largura da coluna será de 100% em telas pequenas e de 50% em telas maiores.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.column {
  width: 100%;
}

@media (min-width: 600px) {
  .column {
    width: 50%;
  }
}</code></pre><figcaption>Exemplo de CSS usando a técnica do <em>mobile first</em></figcaption></figure><p>O código acima pode ser simples, mas seu resultado é bem interessante.</p><ol><li>Considerando o <em>mobile first</em>, O elemento "<em>column</em>" é definido como tendo uma largura de 100%;</li><li>Usando uma <em>media query</em> com <code>min-width</code>, definimos estilos específicos para <em>viewports </em>que tenham a partir de <code>600px</code>. Assim, para <em>viewports </em>maiores que <code>600px</code>, nosso elemento "<em>column</em>" terá uma largura que é de 50% com relação ao seu elemento pai.</li></ol><p>Embora as <em>media queries</em> sejam essenciais para o design responsivo para a web, outros diversos recursos do CSS vêm sendo amplamente adotados e aceitos pelos navegadores. O <em>flexbox</em> é um desses novos e importantes recursos para o design responsivo para a web.</p><h2 id="o-que-o-flexbox"><strong>O que é o Flexbox?</strong></h2><p>Você pode estar se perguntando: "o que o Flexbox faz"? A pergunta mais adequada seria: "o que o Flexbox não faz"? Qual é a maneira mais fácil de centralizar um elemento verticalmente com CSS? Flexbox. Como criar um <em>grid layout</em> responsivo? Flexbox. Como conquistar a paz mundial? Flexbox.</p><p>O módulo de layout do Flexbox (Flexible Box) oferece um modo mais eficiente de dispor, alinhar e distribuir o espaço entre os itens em um contêiner; mesmo quando o seu tamanho é dinâmico (daí a palavra "flex").</p><p>No exemplo a seguir, combinamos as já mencionadas <em>media queries </em>para criar um <em>grid </em>responsivo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  main {
    background: #d9d7d5;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
  }

  div {
    background: #767775;
    flex-basis: 100%;
    height: 100px;
    margin-bottom: 0.5rem;
  }

  @media (min-width: 600px) {
    main {
      flex-wrap: nowrap;
    }

    div {
      flex-basis: 33%;
    }
  }
&lt;/style&gt;
&lt;main&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;/main&gt;</code></pre><figcaption>Exemplo do CSS Flexbox</figcaption></figure><p>Com esse código, nós:</p><ol><li>Estabelecemos um layout com Flexbox usando <code>display: flex</code> em nosso contêiner <code>main</code>.</li><li>Estilizamos seguindo a técnica do mobile first. Definimos o elemento <code>main</code> para <code>flex-wrap: wrap</code>, o que habilitará uma quebra de linha para os elementos filhos — conforme podemos ver na figura 1. Definimos um <code>flex-basis: 100%</code> em nossas <code>div</code>s para garantir que elas ocupem 100% da largura do elemento pai (também na figura 1).</li><li>Definimos um estilo para dispositivos maiores, como tablets e desktops. Utilizamos uma <em>media query </em>igual à do exemplo da seção anterior para declarar no contêiner <code>main</code> a propriedade <code>flex-wrap: nowrap</code>. Isso impede que os elementos filhos tenham uma quebra de linha, o que os mantêm lado a lado no mesmo eixo. Ao configurar na <code>div</code> um <code>flex-basis: 33%</code> para essa mesma <em>media query</em>, estabelecemos que as colunas tenham 33% da largura do elemento pai.</li><li>A mágica deste exemplo deve acontecer em dispositivos maiores — com a combinação das nossas regras de <em>media query</em> e o Flexbox. Por termos definido <code>display: flex</code> e por termos mantido essa regra na <em>media query</em>, pudemos criar um layout de Flexbox para celulares, tablets e desktops. A <em>media query </em>que herda o <code>display: flex</code> e define a regra <code>flex-basis: 33%</code> nos apresentará um layout do Flexbox conforme podemos observar na figura 2. Antigamente, para conseguirmos esse layout em colunas, teríamos o trabalho de escrever extensas regras de CSS.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-mobile-1.png" class="kg-image" alt="grid-mobile-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/grid-mobile-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/grid-mobile-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/grid-mobile-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-mobile-1.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="2250" loading="lazy"><figcaption>Figura 1: exemplo de grid com o Flexbox para dispositivos móveis</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-desktop.png" class="kg-image" alt="grid-desktop" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/grid-desktop.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/grid-desktop.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/grid-desktop.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-desktop.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="789" loading="lazy"><figcaption>Figura 2: exemplo de grid com o Flexbox para desktop</figcaption></figure><p>Graças ao Flexbox, porém, conseguimos ter layouts variados e fluídos. Em alguns casos, podemos não ter tanta liberdade no espaço vertical. Talvez seja necessário ajustar um elemento a uma altura fixa. Para isso, temos outra ferramenta à nossa disposição: a rolagem horizontal (do inglês, <em>horizontal scroll</em>).</p><h2 id="rolagem-horizontal-com-overflow-scroll"><strong>Rolagem horizontal com <em>overflow scroll</em></strong></h2><p>Em algum momento, você talvez se depare com conteúdo saindo da <em>viewport </em>e queira deixá-lo mais, digamos, elegante. Eis que temos <em>overflow scroll</em> para salvar o dia. Essa técnica pode ser aplicada para menus e tabelas com rolagem de conteúdo. Segue abaixo um exemplo de menu com essa característica.</p><!--kg-card-begin: html--><menu style="margin: auto; max-width: 826px; background: #d9d7d5; padding: 0.25rem; overflow-y: scroll; white-space: nowrap;">
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Design responsivo para a web</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Responsividade</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Menu responsivo</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Exemplo de overflow scroll</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">É muita coisa!</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Sim</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">temos</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">mais</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">um</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">item</span>
</menu><!--kg-card-end: html--><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  menu {
    background: #d9d7d5;
    padding: 0.25rem;
    overflow-y: scroll;
    white-space: nowrap;
  }

  span {
    background: #767775;
    color: #ffffff;
    display: inline-block;
    margin: 0.25rem;
    padding: 0.5rem;
  }
&lt;/style&gt;
&lt;menu&gt;
  &lt;span&gt;Design responsivo para a web&lt;/span&gt;
  &lt;span&gt;Responsividade&lt;/span&gt;
  &lt;span&gt;Menu responsivo&lt;/span&gt;
  &lt;span&gt;Exemplo de overflow scroll&lt;/span&gt;
  &lt;span&gt;É muita coisa!&lt;/span&gt;
  &lt;span&gt;Sim&lt;/span&gt;
  &lt;span&gt;temos&lt;/span&gt;
  &lt;span&gt;mais&lt;/span&gt;
  &lt;span&gt;um&lt;/span&gt;
  &lt;span&gt;item&lt;/span&gt;
&lt;/menu&gt;</code></pre><figcaption>Exemplo de menu de rolagem horizontal</figcaption></figure><p>Como fazemos isso? Vamos analisar mais de perto.</p><ul><li><code>overflow-y: scroll</code> é o ingrediente secreto da nossa receita. Com essa declaração, os elementos filhos terão uma rolagem no eixo horizontal.</li><li>Muita calma nessa hora, no entanto! Você pode pensar que o <code>overflow-y</code> seja suficiente, mas também precisamos dizer ao navegador para não envolver os elementos filhos com <code>white-space: nowrap</code>?</li></ul><p>Agora que temos algumas técnicas de layout do design responsivo para a web na manga, vamos dar uma olhada em dois elementos que nos trazem desafios específicos à sua natureza visual: imagens e vídeos.</p><h2 id="imagens-responsivas"><strong>Imagens responsivas</strong></h2><p>Usando atributos modernos das tags de imagem, podemos adaptar seu conteúdo a uma variedade de dispositivos e resoluções. Veja este exemplo de imagem responsiva:</p><pre><code class="language-html">&lt;style&gt;
  img {
    max-width: 100%;
  }
&lt;/style&gt;

&lt;picture&gt;
  &lt;source type="image/webp" srcset="https://my-image.com/my-image-100.webp 1x, https://my-image.com/my-image-200.webp 2x"&gt;
  &lt;source type="image/png" srcset="https://my-image.com/my-image-100.png 1x, https://my-image.com/my-image-200.png 2x"&gt;
  &lt;img alt="my image" src="https://my-image.com/my-image-200.png" loading="lazy" width="100" height="100"&gt;
&lt;/picture&gt;</code></pre><p>Essa estrutura faz muita coisa acontecer. Vamos por partes:</p><ol><li>Ao declarar <code>max-width: 100%</code>, a imagem será redimensionada para um tamanho maior ou menor dependendo da largura do contêiner.</li><li>Combinando as declarações das tags <code>picture</code>, <code>source</code> e <code>img</code>, vamos renderizar e carregar a imagem mais adequada ao dispositivo do usuário.</li><li><strong><strong>WebP</strong></strong> é um formato de imagem moderno, que fornece uma melhor compressão para imagens na web. Com a tag <code>source</code>, podemos referenciar uma imagem WebP para usá-la em navegadores que têm suporte a esse formato. Para os que não tem, usamos outra <code>source</code> que referencia uma imagem PNG.</li><li><code>srcset</code> é usado para informar ao navegador qual imagem usar com base na resolução do dispositivo.</li><li>Estabelecemos o <a href="https://web.dev/i18n/pt/browser-level-image-lazy-loading/">lazy loading nativo</a> ao declararmos <code>loading="lazy"</code>.</li></ol><h2 id="v-deos-responsivos"><strong>Vídeos responsivos</strong></h2><p>A responsividade de vídeos é outro assunto que levou à elaboração de inúmeros artigos e documentações.</p><p>Uma coisa fundamental para termos em mente quando o assunto são imagens, vídeos, iframes e outros elementos responsivos é o uso da proporção de tela (em inglês, <em>aspect ratio</em>). A "caixa" de proporção de tela já é uma técnica conhecida e também uma ferramenta bastante útil que o desenvolvedor para a web deve ter no seu arsenal.</p><p><a href="https://css-tricks.com/fluid-width-video/">Este artigo fornece uma demonstração sólida</a> de como se ter vídeos com largura "fluída" (texto em inglês). Vamos dar uma olhada no código a seguir e analisá-lo:</p><pre><code class="language-html">&lt;style&gt;
  .videoWrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    height: 0;
  }

  .videoWrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
&lt;/style&gt;

&lt;div class="videoWrapper"&gt;
  &lt;!-- Copy &amp; Pasted from YouTube --&gt;
  &lt;iframe width="560" height="349" src="http://www.youtube.com/embed/n_dZNLr2cME?rel=0&amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;</code></pre><p>No exemplo, temos a integração de um vídeo do YouTube em uma tag <code>iframe</code> dentro de uma <code>div</code> com a classe <code>videoWrapper</code>. Vamos ver o que esse nosso código faz:</p><ul><li>A declaração <code>position: relative</code> no contêiner faz os elementos filhos terem uma posição absoluta em relação a ele.</li><li><code>height: 0</code>, junto a <code>padding-bottom: 56.25%</code>, é a chave para estabelecer um comportamento dinâmico; reforçando a proporção de tela <code>16:9</code>.</li><li>As declarações <code>position: absolute</code>, <code>top: 0</code> e <code>left: 0</code> do <em>iframe </em>criam um comportamento no qual o elemento se posiciona de maneira absoluta em relação ao seu elemento pai, fixando-o no canto superior esquerdo.</li><li>Por fim, largura e altura (as propriedades <code>height</code> e <code>width</code>) de 100% fazem com que o <em>iframe</em> tenha 100% da largura e da altura do seu elemento pai, enquanto o <code>.videoWrapper</code> — o elemento pai — assume total controle em estabelecer a proporção de tela.</li></ul><p>Eu sei... é muita coisa. Podemos fazer ainda mais para que vídeos e imagens tenham a melhor adaptação possível para celulares e tablets. Inclusive, eu gostaria que você pesquisasse por conta própria por outras ferramentas para utilizar em conjunto com as já mencionadas.</p><p>Certo, agora que já dominamos o design responsivo para a web, como podemos testar tudo o que fizemos? Felizmente, temos uma série de ferramentas para simular e monitorar a experiência do usuário em uma variedade de dispositivos.</p><h2 id="ferramentas-para-simular-e-monitorar-sites-da-web-responsivos"><strong>Ferramentas para simular e monitorar sites da web responsivos</strong></h2><p>Há uma variedade de ferramentas úteis para nos ajudar a criar sites com o design responsivo para a web. Abaixo estão algumas que considero especialmente úteis.</p><h3 id="emula-o-de-dispositivos-m-veis-nas-ferramentas-do-desenvolvedor-do-google-chrome"><strong>Emulação de dispositivos móveis nas ferramentas do desenvolvedor do Google Chrome</strong></h3><p>As ferramentas do desenvolvedor do Google Chrome fornecem emulação de uma variedade de dispositivos móveis, como tablets e celulares. Ele também fornece uma opção "responsive ", que permite definir um tamanho de <em>viewport</em> personalizado.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.19.18-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png 718w" width="718" height="1282" loading="lazy"><figcaption>Figura 3: ferramentas do desenvolvedor do Chrome e a emulação de dispositivos móveis, como tablets e celulares</figcaption></figure><h3 id="monitorando-o-desempenho-de-um-site-da-web-para-dispositivos-m-veis-com-o-foo"><strong>Monitorando o desempenho de um site da web para dispositivos móveis com o Foo</strong></h3><p>O Lighthouse é uma ferramenta de código aberto que fornece uma maneira de analisar o desempenho de um site para um dispositivo específico.</p><p>O <a href="https://www.foo.software/lighthouse/">Foo usa o Lighthouse internamente para monitorar o desempenho de um site, fornecendo um feedback para análise</a>. Você pode configurar o monitoramento para dispositivos desktop e móveis para obter feedback contínuo sobre o nível de responsividade de seu site.</p><p>Por exemplo, um relatório do Lighthouse indicará se e quais imagens estão sendo carregadas incorretamente em algum dispositivo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.31.09-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1788w" sizes="(min-width: 720px) 720px" width="1788" height="748" loading="lazy"><figcaption>Figura 4: o relatório do Lighthouse com emulação de dispositivos móveis</figcaption></figure><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>O design responsivo para a web seguirá evoluindo rapidamente, mas — se ficarmos por dentro das tendências atuais — poderemos proporcionar a melhor experiência aos nossos usuários. Espero que as ferramentas e técnicas apresentadas aqui sejam úteis a você! Com elas, podemos agradar aos usuários dos nossos sites e ainda conseguir um melhor posicionamento nos mecanismos de busca.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de imagens responsivas em CSS: como tornar as imagens responsivas com o CSS ]]>
                </title>
                <description>
                    <![CDATA[ A maioria dos sites de hoje é responsiva. Se você precisar centralizar e alinhar imagens [https://www.freecodecamp.org/news/how-to-center-an-image-in-css/]  nesses sites (texto em inglês), precisará aprender a tornar as imagens fluidas ou responsivas com CSS. Eu postei um vídeo tutorial que explica como fazer um site responsivo passo a passo [https://youtu.be/rKtOarvKeZE] há ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/tutorial-de-imagens-responsivas-em-css-como-tornar-as-imagens-responsivas-com-o-css/</link>
                <guid isPermaLink="false">6216aea99838eb04fbdf1430</guid>
                
                    <category>
                        <![CDATA[ Design responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan L. Seibel ]]>
                </dc:creator>
                <pubDate>Thu, 24 Feb 2022 21:09:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/5f9c9879740569d1a4ca1a40.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/css-responsive-image-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">CSS Responsive Image Tutorial: How to Make Images Responsive with&nbsp;CSS</a>
      </p><p>A maioria dos sites de hoje é responsiva. Se você precisar <a href="https://www.freecodecamp.org/news/how-to-center-an-image-in-css/">centralizar e alinhar imagens</a> nesses sites (texto em inglês), precisará aprender a tornar as imagens fluidas ou responsivas com CSS.</p><p>Eu postei um vídeo tutorial que explica como fazer um <a href="https://youtu.be/rKtOarvKeZE">site responsivo passo a passo</a> há algumas semanas. No vídeo, fizemos uma imagem responsiva. Neste artigo, no entanto, eu gostaria de dar um pouco mais de detalhes sobre como tornar as imagens responsivas.</p><p>Você também vai aprender sobre alguns dos problemas comuns que podem ocorrer quando você está tentando tornar imagens responsivas - e eu tentarei explicar como resolvê-los.</p><h2 id="como-tornar-imagens-responsivas-com-css"><strong>Como tornar imagens responsivas com CSS</strong></h2><h3 id="devo-usar-unidades-relativas-ou-absolutas"><strong>Devo usar unidades relativas ou absolutas?</strong></h3><p>Tornar uma imagem fluida, ou responsiva, é bem simples. Quando você carrega uma imagem em seu site, ela tem largura e altura padrão. Você pode alterar ambos com CSS.</p><p>Para tornar uma imagem responsiva, você precisa dar um novo valor à sua propriedade de largura. Em seguida, a altura da imagem se ajustará automaticamente.</p><p>Uma coisa importante a se saber é que você deve usar sempre unidades relativas para a propriedade de largura, como porcentagem, ao invés de unidades absolutas como pixels.</p><pre><code class="language-css">img {
  width: 500px;
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized_large.gif" class="kg-image" alt="Animated-GIF-downsized_large" width="480" height="284" loading="lazy"></figure><p>Por exemplo, se você definir uma largura fixa de 500px, sua imagem não será responsiva – porque a unidade é absoluta.</p><pre><code class="language-css">img {
  width: 50%;
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized-1-.gif" class="kg-image" alt="Animated-GIF-downsized-1-" width="480" height="284" loading="lazy"></figure><p>É por isso que você deve atribuir uma unidade relativa, como 50%. Essa abordagem tornará suas imagens fluidas e elas poderão se redimensionar independentemente do tamanho da tela.</p><h3 id="devo-usar-media-queries"><strong>Devo usar media queries?</strong></h3><p>Uma das perguntas que mais recebo é se você deve ou não usar <code>media queries</code>.</p><p>Uma <code>media query</code> é outro recurso importante do CSS que ajuda a tornar um site responsivo. Não entrarei em mais detalhes aqui, mas você pode ler <a href="https://www.freecodecamp.org/news/css-media-queries-breakpoints-media-types-standard-resolutions-and-more/">meu outro artigo</a> (texto em inglês) mais tarde para aprender a usar consultas de mídia com mais detalhes.</p><p>A resposta para essa pergunta é: “depende”. Se você quer que a sua imagem tenha diferentes tamanhos de um dispositivo para outro, então você precisará utilizar <code>media queries</code>. Caso contrário, não.</p><p>Agora, para este exemplo, sua imagem tem 50% de largura para qualquer tipo de tela. Mas quando você deseja deixá-la em tamanho real para dispositivos móveis, precisará obter ajuda das <code>media queries</code>:</p><pre><code class="language-css">@media only screen and (max-width: 480px) {
  img {
    width: 100%;
  }
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized-2-.gif" class="kg-image" alt="Animated-GIF-downsized-2-" width="480" height="284" loading="lazy"></figure><p>Portanto, com base na regra da <em>media query</em> (consulta de mídia, em inglês), qualquer dispositivo menor que 480px terá o tamanho total da largura da tela.</p><p>Você também pode assistir a versão em vídeo deste artigo abaixo:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/5MeogG-ZFs8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h3 id="por-que-a-propriedade-max-width-n-o-ideal"><strong>Por que a propriedade max-width não é ideal?</strong></h3><p>Outra maneira que os desenvolvedores podem usar para criar imagens responsivas é a propriedade <code>max-width</code>. No entanto, esse nem sempre é o melhor método a ser usado, pois pode não funcionar para todos os tipos de tamanho de tela ou dispositivo.</p><p>A primeira coisa a entender antes de prosseguirmos com um exemplo é o que exatamente a propriedade <code>max-width</code> faz.</p><p>A propriedade max-width define uma largura máxima para um elemento, o que não permite que a largura desse elemento seja maior que seu valor <code>max-width</code> (mas pode ser menor).</p><p>Por exemplo, se a imagem tiver uma largura padrão de 500px e se o tamanho da sua tela tiver apenas 360px, você não poderá ver a imagem completa porque não há espaço suficiente:</p><pre><code class="language-css">img {
  max-width: 100%;
  width: 500px;  // suponha que esse seja o tamanho padrão
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized-3-.gif" class="kg-image" alt="Animated-GIF-downsized-3-" width="480" height="284" loading="lazy"></figure><p>Portanto, você pode definir uma propriedade <code>max-width</code> para a imagem e configurá-la para 100%, o que reduz a imagem de 500px para o espaço de 360px. Assim, você poderá ver a imagem completa em uma tela de tamanho menor.</p><p>A parte boa é que, como você está usando uma unidade relativa, a imagem será fluida em qualquer dispositivo menor que 500px. </p><p>Infelizmente, o tamanho da tela ficará um pouco maior que 500px, mas a imagem não, porque tem uma largura padrão de 500px. Essa abordagem quebrará a capacidade de resposta da imagem.</p><p>Para corrigir isso, você precisa usar a propriedade largura novamente, o que torna a propriedade max-width inútil.</p><h3 id="e-as-alturas"><strong>E as alturas?</strong></h3><p>Outro problema comum que você pode encontrar tem a ver com a propriedade <code>height</code> (altura, em inglês). Normalmente, a altura de uma imagem se redimensiona automaticamente, então você não precisa atribuir uma propriedade <code>height</code> às suas imagens (porque isso acaba distorcendo um pouco a imagem).</p><p>Mas, em alguns casos, você pode ter que trabalhar com imagens que devem ter uma altura fixa. Portanto, quando você atribuir uma altura fixa à imagem, ela ainda será responsiva, mas não terá uma boa aparência.</p><pre><code class="language-css">img {
  width: 100%;
  height: 300px;
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized-4-.gif" class="kg-image" alt="Animated-GIF-downsized-4-" width="480" height="284" loading="lazy"></figure><p>Felizmente, existe outra propriedade que o CSS oferece para corrigir esse problema…</p><h3 id="solu-o-a-propriedade-object-fit"><strong>Solução: a propriedade object-fit</strong></h3><p>Para ter mais controle sobre suas imagens, o CSS fornece outra propriedade chamada <code>object-fit</code>. Vamos usar a propriedade <code>object-fit</code> e atribuir um valor, que fará com que sua imagem fique com uma melhor apresentação:</p><pre><code class="language-css">img {
  width: 100%;
  height: 300px;
  object-fit: cover;
  object-position: bottom;
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/Animated-GIF-downsized-5-.gif" class="kg-image" alt="Animated-GIF-downsized-5-" width="480" height="284" loading="lazy"></figure><p>Se necessário, você também pode usar a propriedade <code>object-position</code> (além de <code>object-fit</code>) para focar em uma parte específica da imagem. Muitas pessoas não estão cientes da propriedade <code>object-fit</code>, mas ela pode ser útil para corrigir esses tipos de problemas.</p><p>Espero que este artigo tenha ajudado você a entender e resolver seus problemas com imagens responsivas. Se você quiser saber mais sobre desenvolvimento para a web, fique à vontade para conferir o <a href="https://www.youtube.com/channel/UC1EgYPCvKCXFn8HlpoJwY3Q">canal do autor do texto no Youtube</a>.</p><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de media queries do CSS – resoluções padrão, breakpoints em CSS e tamanhos de telefone ]]>
                </title>
                <description>
                    <![CDATA[ No passado, criar um site da web era muito mais simples. Hoje, um layout de site deve estar adaptado não apenas aos computadores, mas também a tablets, dispositivos móveis e até TVs. Fazer um site da web com um layout adaptável é chamado de Design responsivo para a web. As ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/tutorial-de-media-queries-do-css-resolucoes-padrao-breakpoints-do-css-e-tamanhos-de-telefone/</link>
                <guid isPermaLink="false">61a6c26d3515f60519008bf7</guid>
                
                    <category>
                        <![CDATA[ Design responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Wed, 01 Dec 2021 02:05:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/5f9c9bb5740569d1a4ca2d74.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/css-media-queries-breakpoints-media-types-standard-resolutions-and-more/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Media Query CSS Tutorial – Standard Resolutions, CSS Breakpoints, and Target Phone Sizes</a>
      </p><p>No passado, criar um site da web era muito mais simples. Hoje, um layout de site deve estar adaptado não apenas aos computadores, mas também a tablets, dispositivos móveis e até TVs.</p><p>Fazer um site da web com um layout adaptável é chamado de Design responsivo para a web. As media queries do CSS são uma das partes mais importantes do design responsivo. Neste artigo, vamos dar uma olhada mais de perto nas media queries e em como usá-las em CSS.</p><p>Se você preferir, pode assistir à versão em vídeo abaixo:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/P_vkS4UJNDk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="o-que-uma-media-query"><strong>O que é uma media query?</strong></h2><p>Uma media query é um recurso do CSS3 que faz com que uma página da web se adapte ao seu layout para tamanhos de tela e tipos de mídia diferentes.</p><h3 id="sintaxe"><strong>Sintaxe</strong></h3><pre><code class="language-css">@media tipo de mídia and (condição: breakpoint) {
  // regras de CSS
}</code></pre><p>Podemos visar tipos de mídia diferentes sob uma variedade de condições. Se a condição e/ou tipos de mídia coincidirem, as regras dentro da media query serão aplicadas, o que não ocorre em outras circunstâncias.</p><p>A sintaxe pode parecer complicada de início, então vamos explicar cada parte em detalhes…</p><h3 id="regra-de-media"><strong>Regra de @Media</strong></h3><p>Começamos definindo media queries com a regra @media e, depois, incluímos as regras de CSS dentro das chaves. A regra de @ media também é usada para especificar os tipos de mídia de destino.</p><pre><code class="language-css">@media () {
  // regras de CSS
}</code></pre><h3 id="par-nteses"><strong>Parênteses</strong></h3><p>Dentro dos parênteses, definimos uma condição. Por exemplo, queremos aplicar um tamanho de fonte maior para dispositivos móveis. Para fazer isso, precisamos definir uma largura máxima, que é verificada em comparação com a largura de um dispositivo:</p><pre><code class="language-css">.text {
  font-size: 14px;
}

@media (max-width: 480px) {
  .text {
    font-size: 16px;
  }
}</code></pre><p>Normalmente, o tamanho do texto será de 14px. No entanto, como aplicamos uma media query, ele mudará para 16px quando um dispositivo tiver a largura máxima de 480px ou menos.</p><p><strong><strong>Important</strong>e<strong>: </strong>sempre coloque suas<strong> media queries </strong>ao final do arquivo <strong>CSS.</strong></strong></p><h3 id="tipos-de-m-dia"><strong>Tipos de mídia</strong></h3><p>Se não aplicarmos um tipo de mídia, a regra de @media selecionará todos os tipos de dispositivo por padrão. Do contrário, os tipos de mídia vêm logo após a regra de @media. Há muitos tipos de dispositivos, mas podemos agrupá-los em 4 categorias:</p><ul><li>all — para todos os tipos de mídia</li><li>print — para impressoras</li><li>screen — para telas de computador, tablets e smartphones</li><li>speech — para leitores de tela que “leem” a página em voz alta</li></ul><p>Por exemplo, quando eu desejo selecionar apenas as telas, usarei a palavra-chave screen logo após a regra de @media. Também concatenarei as regras com a palavra-chave “and”:</p><pre><code class="language-css">@media screen and (max-width: 480px) {
  .text {
    font-size: 16px;
  }
}</code></pre><h3 id="breakpoints"><strong>Breakpoints</strong></h3><p>Breakpoints são, talvez, o termo mais comum que você ouvirá e usará ao falarmos de media queries. Um breakpoint é uma chave para determinar o momento de mudar o layout e adaptá-lo às novas regras dentro das media queries. Vamos voltar ao nosso exemplo do início:</p><pre><code class="language-css">@media (max-width: 480px) {
  .text {
    font-size: 16px;
  }
}</code></pre><p>Aqui, o breakpoint é 480px. Agora, a media query sabe quando definir ou sobrescrever a nova classe. Basicamente, se a largura de um dispositivo for inferior a 480px, a classe text será aplicada. Do contrário, isso não acontece.</p><h4 id="breakpoints-comuns-existe-uma-resolu-o-padr-o"><strong>Breakpoints comuns: existe uma resolução padrão?</strong></h4><p>Uma das perguntas que é feita com maior frequência é “Qual é o breakpoint que eu devo usar?”. Há milhares de dispositivos no mercado. Assim, não podemos nem devemos definir breakpoints fixos para cada um deles.</p><p>É por isso que não podemos dizer que exista uma resolução padrão para dispositivos, mas há alguns breakpoints normalmente usados na programação do dia a dia. Se você estiver usando um framework de CSS (como o Bootstrap, o Bulma etc.), você também pode usar seus breakpoints.</p><p>Vamos ver agora alguns breakpoints comuns em termos de larguras dos dispositivos:</p><ul><li>320px — 480px: dispositivos móveis</li><li>481px — 768px: iPads, tablets</li><li>769px — 1024px: telas pequenas, laptops</li><li>1025px — 1200px: desktops, telas grandes</li><li>1201px e acima —  telas muito grandes, TVs</li></ul><p>Como dito anteriormente, esses breakpoints podem diferir e não há um padrão definido com exatidão, mas a lista acima compreende os que são usados normalmente.</p><h2 id="para-encerrar"><strong>Para encerrar</strong></h2><p>Usar o design responsivo é uma obrigação nos campos de design e desenvolvimento para a web nos dias de hoje. Media queries são uma das partes mais importantes na criação de layouts responsivos. Espero que este artigo tenha sido útil para você no sentido de entender como as media queries funcionam.</p><p><strong>Se quiser saber mais sobre desenvolvimento para a <strong>web, </strong><a href="https://www.youtube.com/channel/UC1EgYPCvKCXFn8HlpoJwY3Q?view_as=subscriber"><strong>s</strong>e inscreva no canal do autor</a>.</strong></p><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
