<?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[ Ivan L. Seibel - 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[ Ivan L. Seibel - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 26 May 2026 04:21:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/ivan/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como adicionar notificações push a uma aplicação em Flutter usando o Firebase Cloud Messaging ]]>
                </title>
                <description>
                    <![CDATA[ O Flutter rapidamente se tornou um dos frameworks mais populares para o desenvolvimento de aplicativos móveis multiplataforma. Ele ajuda os desenvolvedores a criar UIs nativas com suporte para diferentes tamanhos de dispositivos, densidades de pixels e orientações, criando uma bela e perfeita UI/UX. Neste tutorial, nós aprenderemos como adicionar notificações ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-adicionar-notificacoes-push-a-uma-aplicacao-em-flutter-usando-o-firebase-cloud-messaging/</link>
                <guid isPermaLink="false">621fd393fe38d304f5225fb1</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan L. Seibel ]]>
                </dc:creator>
                <pubDate>Wed, 08 Jun 2022 16:50:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/5fd0362ce6787e098393c56a.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-add-push-notifications-to-flutter-app/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Add Push Notifications to a Flutter App using Firebase Cloud Messaging</a>
      </p><p>O Flutter rapidamente se tornou um dos frameworks mais populares para o desenvolvimento de aplicativos móveis multiplataforma. Ele ajuda os desenvolvedores a criar UIs nativas com suporte para diferentes tamanhos de dispositivos, densidades de pixels e orientações, criando uma bela e perfeita UI/UX.</p><p>Neste tutorial, nós aprenderemos como adicionar <em>notificações</em> <em>push</em> (tipo de mensagem exibida automaticamente na tela do seu celular) em um aplicativo Flutter usando o serviço <em>Firebase Cloud Messaging</em> (em português Mensagens na Nuvem do Firebase). Este tutorial lidará com as configurações apenas para a <strong>plataforma Android</strong>.</p><h3 id="primeiro-o-que-s-o-notifica-es-push"><strong>Primeiro, o que são <em>notificações push</em>?</strong></h3><p>Notificações push são um tipo de <em>mensagens pop-up</em> (em português mensagens que "estouram" na tela) que alertam os usuários de aplicativos sobre o que está acontecendo no aplicativo. Elas também são uma forma importante de ampliar o engajamento dos usuários em seu aplicativo.</p><p>Por exemplo, digamos que um usuário esquece do aplicativo depois de instalado. Então, você pode usar notificações <em>push</em> como um mecanismo para recuperar e manter o interesse dos usuários. As notificações <em>push</em> também podem ajudar a direcionar tráfego para o aplicativo.</p><p>O <em>Firebase Cloud Messaging</em> é um serviço oferecido pela Firebase, que permite que você envie notificações para seus usuários. Você pode definir várias configurações para enviar diferentes notificações para públicos diferentes com base em tempo e rotina.</p><p>Por causa de todos esses benefícios, nós vamos usar esse serviço para enviar notificações para nosso aplicativo Flutter.</p><h2 id="passo-1-criar-um-projeto-do-flutter"><strong>Passo 1: criar um projeto do Flutter</strong></h2><p>Primeiro, vamos criar um projeto para o Flutter. Para isso, devemos ter o Flutter SDK instalado em nosso sistema. Você pode encontrar etapas simples para a instalação do Flutter na <a href="https://flutter.dev/docs/get-started/install">documentação oficial</a>.</p><p>Depois de instalar o Flutter com sucesso, você pode simplesmente executar o seguinte comando no diretório desejado para configurar um projeto Flutter completo:</p><pre><code class="language-bash">flutter create pushNotification
</code></pre><p>Depois de configurar o projeto, navegue dentro do diretório do projeto. Execute o seguinte comando no terminal para executar o projeto em um emulador disponível ou em um dispositivo real:</p><pre><code class="language-bash">flutter run
</code></pre><p>Após uma compilação bem-sucedida, você obterá o seguinte resultado na tela do emulador:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-69.png" class="kg-image" alt="image-69" width="325" height="665" loading="lazy"></figure><h2 id="passo-2-integrar-a-configura-o-do-firebase-ao-flutter">Passo 2: integrar a configuração do Firebase ao Flutter</h2><p>Nesta etapa, vamos integrar os serviços do Firebase ao nosso projeto Flutter. Mas primeiro, precisamos criar um projeto do Firebase. As diretrizes de configuração também são fornecidas na <a href="https://firebase.google.com/docs/flutter/setup?platform=android">documentação oficial do Firebase</a> para Flutter.</p><p>Para criar um projeto do <a href="https://firebase.google.com/">Firebase</a>, precisamos fazer login no Firebase e navegar até o console. Lá, podemos simplesmente clicar em 'Adicionar um projeto' (<em>Add a project</em>, em inglês) para iniciar nosso projeto.</p><p>Em seguida, uma janela aparecerá pedindo para inserir o nome do projeto. Aqui, mantive o nome do projeto como <code>FlutterPushNotification</code>, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-70.png" class="kg-image" alt="image-70" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-70.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-70.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-70.png 1350w" sizes="(min-width: 1200px) 1200px" width="1350" height="634" loading="lazy"></figure><p>Podemos continuar para a próxima etapa quando o projeto for criado. Após a configuração do projeto, obteremos um console de projeto, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-71.png" class="kg-image" alt="image-71" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-71.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-71.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-71.png 1288w" sizes="(min-width: 1200px) 1200px" width="1288" height="594" loading="lazy"></figure><p>Aqui, vamos configurar o Firebase para a plataforma Android. Portanto, precisamos clicar no ícone do Android exibido na captura de tela acima. Isso nos levará à interface para registrar o Firebase com nosso projeto de aplicativo Flutter.</p><h2 id="passo-3-registrar-o-firebase-no-seu-aplicativo-android"><strong>Passo 3: registrar o Firebase no seu aplicativo Android</strong></h2><p>Como o processo de registro é específico da plataforma, vamos registrar nosso aplicativo para a plataforma Android. Após clicar no ícone do Android, seremos direcionados para uma interface solicitando o nome do pacote Android (<strong>Android package name</strong> em inglês).</p><p>Como o processo de registro é específico da plataforma, vamos registrar nosso aplicativo para a plataforma Android. Após clicar no ícone do Android, seremos direcionados para uma interface solicitando o <strong>nome do pacote Android </strong>(ou <em>Android package name</em>, se a interface estiver em inglês).</p><p>Para adicionar o nome do pacote do nosso projeto Flutter, precisamos localizá-lo primeiro. O nome do pacote estará disponível no arquivo <strong>./android/app/build.gradle</strong> do seu projeto Flutter. Você verá algo assim:</p><pre><code class="language-jsx">com.example.pushNotification
</code></pre><p>Só precisamos copiá-lo e colá-lo no campo de entrada do nome do pacote Android, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-72.png" class="kg-image" alt="image-72" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-72.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-72.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-72.png 1346w" sizes="(min-width: 1200px) 1200px" width="1346" height="633" loading="lazy"></figure><p>Depois disso, podemos simplesmente clicar no botão 'Registrar aplicativo' ('Register app', em inglês). Isso nos levará à interface onde podemos obter o arquivo <strong>google-services.json</strong> que vinculará nosso aplicativo Flutter aos serviços do Firebase Google.</p><p>Precisamos baixar o arquivo e movê-lo para o diretório <strong>./android/app</strong> do nosso projeto Flutter. As instruções também são mostradas na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-73.png" class="kg-image" alt="image-73" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-73.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-73.png 876w" width="876" height="574" loading="lazy"></figure><h2 id="passo-4-adicionar-configura-es-do-firebase-a-arquivos-nativos-em-seu-projeto-flutter"><strong>Passo 4: adicionar configurações do Firebase a arquivos nativos em seu projeto Flutter</strong></h2><p>Agora, para habilitar os serviços do Firebase em nosso aplicativo Android, precisamos adicionar o <a href="https://developers.google.com/android/guides/google-services-plugin">plug-in do google-services</a> aos nossos arquivos Gradle.</p><p>Primeiro, em nosso arquivo Gradle de <strong>nível raiz (nível de projeto)</strong> (<strong>android/build.gradle</strong>), precisamos adicionar regras para incluir o plug-in do Gradle aos serviços do Google. Precisamos verificar se as seguintes configurações estão disponíveis ou não:</p><pre><code class="language-jsx">buildscript {
  repositories {
    // Verifique se você tem a seguinte linha (caso contrário, adicione-a):
    google()  // Repositório Google Maven
  }
  dependencies {
    ...
    // Adicione esta linha
    classpath 'com.google.gms:google-services:4.3.4'
  }
}

allprojects {
  ...
  repositories {
    // Verifique se você tem a seguinte linha (caso contrário, adicione-a):
    google()  // Repositório Google Maven
    ...
  }
}
</code></pre><p>Caso contrário, precisamos adicionar as configurações conforme mostrado no trecho de código acima.</p><p>Agora, em nosso arquivo Gradle do módulo (nível do aplicativo) (<strong>android/app/build.gradle</strong>), precisamos aplicar o plug-in do <strong>Gradle do Google Services</strong>.</p><p>Para isso, precisamos adicionar o trecho de código destacado no trecho de código a seguir ao arquivo <strong>./android/app/build.gradle</strong> do nosso projeto:</p><pre><code class="language-jsx">// Adicione a seguinte linha:
**apply plugin: 'com.google.gms.google-services'**  // Plug-in do Google Services

android {
  // ...
}
</code></pre><p>Agora, precisamos executar o seguinte comando para que algumas configurações automáticas possam ser feitas:</p><pre><code class="language-jsx">flutter packages get
</code></pre><p>Com isso, integramos com sucesso as configurações do Firebase ao nosso projeto Flutter.</p><h2 id="passo-5-integrar-o-firebase-messaging-ao-flutter"><strong>Passo 5: integrar o Firebase Messaging ao Flutter</strong></h2><p>Primeiro, precisamos adicionar a dependência firebase-messaging ao arquivo <strong>./android/app/build.gardle</strong>. No arquivo, precisamos adicionar as seguintes dependências:</p><pre><code class="language-dart">dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.firebase:firebase-messaging:20.1.0'
}
</code></pre><p>Em seguida, precisamos adicionar uma <code>action</code> (ação) e uma <code>category</code> (categoria) como <code>intent-filter</code> (filtro de intenção) no arquivo <strong>./android/app/src/main/AndroidManifest.xml</strong>:</p><pre><code class="language-xml">&lt;intent-filter&gt;
    &lt;action android:name="FLUTTER_NOTIFICATION_CLICK" /&gt;
    &lt;category android:name="android.intent.category.DEFAULT" /&gt;
&lt;/intent-filter&gt;
</code></pre><p>Agora, precisamos criar um arquivo Java chamado <strong>Application.java</strong> no caminho <strong><strong>/android/app/src/main/java/&lt;app-organization-path&gt;</strong></strong>.</p><p>Em seguida, precisamos adicionar o código do seguinte trecho de código dentro dele:</p><pre><code class="language-java">package io.flutter.plugins.pushNotification;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
    @Override
    public void onCreate() {
        super.onCreate();
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
    }

    @Override
    public void registerWith(PluginRegistry registry) {
        FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    }
}
</code></pre><p>Agora, precisamos atribuir essa atividade <code>Application</code> à tag <code>application</code> do arquivo <strong>AndroidManifest.xml</strong>, conforme mostrado no snippet de código abaixo:</p><pre><code class="language-xml">&lt;application
        android:name=".Application"
</code></pre><p>Isso conclui nossa configuração do plug-in de mensagens do Firebase no código nativo do Android. Agora, vamos passar para o projeto Flutter.</p><h2 id="passo-6-instalar-o-pacote-firebase-messaging"><strong>Passo 6: instalar o pacote Firebase Messaging</strong></h2><p>Aqui, vamos usar o pacote <code>[firebase_messaging]</code>, que <a href="https://pub.dev/packages/firebase_messaging/">você pode encontrar aqui</a>. Para isso, precisamos adicionar o plug-in à opção de dependência do arquivo pubspec.yaml.</p><p>Precisamos adicionar a seguinte linha de código à opção de dependências:</p><pre><code class="language-yaml">firebase_messaging: ^7.0.3
</code></pre><h2 id="passo-7-implementar-uma-tela-de-iu-simples"><strong>Passo 7: implementar uma tela de IU simples</strong></h2><p>Agora, dentro da classe de widget com estado <code>MyHomePage</code> do arquivo <strong>main.dart</strong>, precisamos inicializar a instância <code>FirebaseMessaging</code> e algumas constantes, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">String messageTitle = "Empty";
String notificationAlert = "alert";

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
</code></pre><p>A variável <code>messageTitle</code> receberá o título da mensagem de notificação e <code>notificationAlert</code> receberá a ação que foi concluída assim que a notificação aparecer.</p><p>Agora, precisamos aplicar essas variáveis ​​à função de construção dentro do corpo do widget <code>Scaffold</code>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            Text(
              notificationAlert,
            ),
            Text(
              messageTitle,
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
    );
  }
</code></pre><p>Em seguida, precisamos executar o aplicativo Flutter executando o seguinte comando no terminal do projeto:</p><pre><code class="language-bash">flutter run
</code></pre><p>Vamos obter o resultado que você vê na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-74.png" class="kg-image" alt="image-74" width="325" height="665" loading="lazy"></figure><p>Por enquanto, o título da notificação está vazio e o alerta também está conforme definido. Precisamos atribuir um valor adequado a eles assim que recebermos a mensagem de notificação.</p><p>Portanto, precisamos configurar o código para receber a notificação e usar a mensagem de notificação para exibi-la na tela.</p><p>Para isso, precisamos adicionar o código do seguinte trecho de código na função <code>initiState</code>:</p><pre><code class="language-dart">@override
  void initState() {
    // TODO: implementar initState
    super.initState();

    _firebaseMessaging.configure(
      onMessage: (message) async{
        setState(() {
          messageTitle = message["notification"]["title"];
          notificationAlert = "New Notification Alert";
        });

      },
      onResume: (message) async{
        setState(() {
          messageTitle = message["data"]["title"];
          notificationAlert = "Application opened from Notification";
        });

      },
    );
  }
</code></pre><p>Aqui, usamos o método <code>configure</code> fornecido pela instância <code>_firebaseMessaging</code> que, por sua vez, fornece os retornos de chamada <code>onMessage</code> e <code>onResume</code>. Esses retornos de chamada fornecem a notificação <code>message</code> como parâmetro. A resposta <code>message</code> manterá o objeto de notificação como um objeto de mapa.</p><p>A função <code>onMessage</code> é acionada quando a notificação é recebida enquanto estamos executando o aplicativo. A função <code>onResume</code> é acionada quando recebemos o alerta de notificação na barra de notificação do dispositivo e abre o aplicativo por meio da própria notificação <em>push</em>. Nesse caso, o aplicativo pode ser executado em segundo plano ou não ser executado.</p><p>Agora, estamos todos equipados com o aplicativo Flutter. Só precisamos configurar uma mensagem no Firebase Cloud Messaging e enviá-la para o dispositivo.</p><h2 id="passo-8-criar-uma-mensagem-a-partir-do-console-do-firebase-cloud-messaging"><strong>Passo 8: criar uma Mensagem a partir do console do Firebase Cloud Messaging</strong></h2><p>Primeiro, precisamos voltar ao console do Cloud Messaging no site do Firebase, conforme mostrado na imagem abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-75.png" class="kg-image" alt="image-75" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-75.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-75.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-75.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="575" loading="lazy"></figure><p>Aqui, podemos ver a opção 'Enviar sua primeira mensagem' (<em>Send your first message</em>, em inglês) na janela, pois não configuramos nenhuma mensagem antes. Precisamos clicar nele, o que nos levará à seguinte janela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-76.png" class="kg-image" alt="image-76" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-76.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-76.png 757w" width="757" height="599" loading="lazy"></figure><p>Aqui, podemos inserir o título, texto, imagem e nome da notificação. O título que definimos aqui será fornecido como título no objeto <code>message</code> nos retornos de chamada que definimos antes no projeto Flutter.</p><p>Depois de definir os campos obrigatórios, podemos clicar em 'Avançar' (<em>Next</em>, em inglês), o que nos levará à seguinte janela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-77.png" class="kg-image" alt="image-77" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-77.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-77.png 741w" width="741" height="356" loading="lazy"></figure><p>Aqui, precisamos fornecer nosso aplicativo de destino e clicar em 'Avançar' (Next).</p><p>Para Agendamento (Scheduling, em inglês) podemos manter a opção padrão:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-78.png" class="kg-image" alt="image-78" width="488" height="162" loading="lazy"></figure><p>Em seguida, aparecerá a janela Conversão (<em>Conversion</em>, em inglês), que também podemos manter como padrão, e clique no botão 'Avançar' (<em>Next</em>).</p><p>Por fim, aparecerá uma janela onde precisamos inserir os dados personalizados, na qual podemos definir o <code>title</code> e o <code>click_action</code>. Este evento de ação de clique é acionado sempre que clicamos na notificação que aparece na barra de notificação do dispositivo.</p><p>Depois de clicar na mensagem de notificação da barra de notificação, o aplicativo será aberto e o retorno de chamada <code>onResume</code> será acionado, definindo o <code>title</code> conforme atribuído nos dados personalizados na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-79.png" class="kg-image" alt="image-79" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-79.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-79.png 740w" width="740" height="592" loading="lazy"></figure><p>Agora, estamos prontos para enviar a primeira mensagem de notificação ao dispositivo. Primeiro, vamos tentar com o dispositivo rodando no emulador.</p><p>Ao clicar no botão 'Revisar' (<em>Review</em>, em inglês) e enviar a mensagem, obteremos o seguinte resultado no console do Cloud Messaging, bem como no emulador:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/pushGIF1.gif" class="kg-image" alt="pushGIF1" width="600" height="344" loading="lazy"></figure><p>Aqui, podemos ver que o título e o alerta de notificação na tela do emulador são atualizados assim que enviamos uma mensagem do console. Podemos ter certeza de que o retorno de chamada <code>onMessage</code> foi acionado no aplicativo após receber a mensagem de notificação.</p><p>Agora vamos tentar com o app rodando em segundo plano. Uma vez que enviamos a mensagem para o console, nós iremos receber o resultado conforme mostrado na demonstração abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/pushGIF2.gif" class="kg-image" alt="pushGIF2" width="600" height="345" loading="lazy"></figure><p>Aqui, assim que enviamos a mensagem, recebemos uma notificação <em>push</em> na barra de notificações do dispositivo. Então, à medida que arrastamos a barra de notificação, podemos ver o título e o texto da mensagem de notificação. E, clicando na mensagem de notificação, podemos iniciar o aplicativo e exibir os dados personalizados na tela. Isso garante que nosso retorno de chamada <code>onResume</code> foi acionado.</p><p>Terminamos! Adicionamos com sucesso um recurso de notificação por <em>push</em> em nosso aplicativo Flutter usando o Firebase Cloud Messaging.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>As notificações <em>push</em> são essenciais em qualquer aplicativo. Elas podem ser usadas ​​para alertar os usuários sobre o que está acontecendo no aplicativo e podem ajudar a atrair o interesse dos usuários de volta ao aplicativo.</p><p>Além disso, o Firebase Cloud Messaging torna o envio de alertas de notificação muito mais simples e fácil.</p><p>Neste tutorial, começamos configurando o aplicativo Firebase e, em seguida, passamos para a configuração e implementação da configuração de mensagens do Firebase no aplicativo Flutter. Por fim, conseguimos enviar alertas de notificação para o aplicativo usando o Firebase Cloud Messaging.</p><p>O tutorial foi feito para ser simples e fácil de entender. Espero que isso ajude você a adicionar notificações push aos seus aplicativos Flutter. Quer ver alguns exemplos de como você pode implementar tudo isso? Confira esses poderosos <a href="http://instaflutter.com/">modelos do Flutter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Erro 403 do HTTP - Proibido: o que significa e como resolvê-lo ]]>
                </title>
                <description>
                    <![CDATA[ Receber um código de erro enquanto estamos on-line pode ser uma experiência frustrante. Ao mesmo tempo em que estamos acostumados com páginas "404 Not Found" (Não Encontrado, em português), se tornou comum ver páginas de placeholder fofas [https://toggl.com/404] para nos entreter [https://weemss.com/page-not-found/] sempre que nos perdemos [http://www.limpfish.com/404]. Um dos mais ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/erro-403-do-http-proibido-o-que-significa-e-como-reseolve-lo/</link>
                <guid isPermaLink="false">6216ba349838eb04fbdf151a</guid>
                
                    <category>
                        <![CDATA[ http ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan L. Seibel ]]>
                </dc:creator>
                <pubDate>Tue, 01 Mar 2022 13:16:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/5f9c9eb4740569d1a4ca3e9f.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/http-error-403-forbidden-what-it-means-and-how-to-fix-it/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">HTTP Error 403 Forbidden: What It Means and How to Fix It</a>
      </p><p>Receber um código de erro enquanto estamos on-line pode ser uma experiência frustrante. Ao mesmo tempo em que estamos acostumados com páginas "404 Not Found" (Não Encontrado, em português), se tornou comum ver <a href="https://toggl.com/404">páginas de placeholder fofas</a> para nos <a href="https://weemss.com/page-not-found/">entreter</a> sempre que nos <a href="http://www.limpfish.com/404">perdemos</a>. Um dos mais erros mais intrigantes é a resposta "403 Forbidden" (Proibido, em português).</p><h2 id="o-que-isso-significa"><strong>O que isso significa?</strong></h2><p>Colocando de uma forma simples: o servidor determinou que você não está autorizado para acessar aquilo que você requisitou.</p><p>De acordo com o padrão <a href="https://tools.ietf.org/html/rfc7231#section-6.5.3">RFC 7231</a> (texto em inglês):</p><blockquote>O código de status 403 (Proibido) indica que o servidor entendeu a solicitação, mas se recusa a autorizá-la... Se as credenciais de autenticação foram fornecidas na solicitação, o servidor as considera insuficientes para conceder acesso.</blockquote><p>A resposta 403 pertence ao intervalo 4xx de respostas HTTP: Erros do client. Isso significa que você ou seu navegador fez algo errado.</p><p>Se você se deparar com esse erro, geralmente significa que você já se autenticou com o servidor, ou seja, você efetuou login, mas o recurso que você solicitou espera alguém com privilégios mais altos.</p><p>Mais comumente, você pode estar logado como usuário padrão, mas está tentando acessar uma página de administração.</p><h2 id="como-voc-corrige-isso"><strong>Como você corrige isso?</strong></h2><p>Como um usuário sem acesso ao servidor você terá apenas algumas poucas opções:</p><h3 id="se-autentique-com-uma-conta-mais-apropriada"><strong>Se autentique com uma conta mais apropriada</strong></h3><p>Novamente, de acordo com o padrão <a href="https://tools.ietf.org/html/rfc7231#section-6.5.3">RFC 7231</a> (texto em inglês):</p><blockquote>Se as credenciais de autenticação foram fornecidas na solicitação, o servidor as considera insuficientes para conceder acesso. O cliente NÃO DEVE repetir automaticamente a solicitação com as mesmas credenciais. O cliente PODE repetir o pedido com credenciais novas ou diferentes.</blockquote><p>Este é o único meio que lhe dá condições reais para corrigir o problema.</p><p>Se você tem várias contas em um site e está tentando fazer algo que normalmente pode fazer, mas desta vez está proibido de fazer, esta é a opção que você deve tentar. Faça login com sua outra conta.</p><p>Você pode descobrir que essa opção também requer a limpeza do cache ou dos cookies, caso o login de outro usuário não libere suficientemente os tokens de autenticação anteriores. Mas isso geralmente é desnecessário.</p><p>Como uma jogada desesperada, você também pode tentar desabilitar as extensões do navegador que possam estar interferindo no uso do site. No entanto, isso é improvável, pois um 403 indica que você está autenticado, mas não autorizado.</p><h3 id="notifique-o-dono-do-site-que-o-erro-403-est-sendo-retornado-quando-voc-esperaria-o-contr-rio"><strong>Notifique o dono do site que o erro 403 está sendo retornado quando você esperaria o contrário</strong></h3><p>Se você espera poder acessar o recurso em questão, mas ainda está vendo esse erro, é aconselhável informar a equipe responsável pelo site - isso pode ser um erro da parte deles.</p><p>Novamente, o padrão <a href="https://tools.ietf.org/html/rfc7231#section-6.5.3">RFC 7231</a> &nbsp;(texto em inglês) diz:</p><blockquote>No entanto, uma solicitação pode ser proibida por motivos não relacionados às credenciais.</blockquote><p>Uma causa comum para isso acontecer de forma não intencional é o fato de um servidor usar listas de permissão ou negação para endereços IP específicos ou regiões geográficas.</p><p>Eles podem ter um bom motivo para bloquear seu acesso fora de seus parâmetros estritamente definidos, mas também pode ser apenas um descuido.</p><h3 id="desistir"><strong>Desistir</strong></h3><p>Talvez você simplesmente não deveria mesmo ser capaz de acessar esse recurso. Acontece. A internet é grande e é razoável esperar que existam algumas áreas que estão além dos limites do que você pode acessar. </p><p>Você pode visitar <a href="https://http.cat/">http.cat</a> enquanto pensa sobre a razão para que sua solicitação original tenha sido <a href="https://http.cat/403">proibida</a>.</p><hr><p>Como leitor do freeCodeCamp News, você quase certamente não está proibido de seguir <a href="https://twitter.com/jacksonbates">@JacksonBates</a> no Twitter para mais conteúdo relacionado à tecnologia e à programação.</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[ Os melhores exemplos de HTML e HTML5 ]]>
                </title>
                <description>
                    <![CDATA[  ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/os-melhores-exemplos-de-html-e-html5/</link>
                <guid isPermaLink="false">61e751993ca86504f628fdf7</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan L. Seibel ]]>
                </dc:creator>
                <pubDate>Thu, 10 Feb 2022 12:56:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/01/html-examples.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/html-and-html5-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Best HTML Examples and HTML5 Examples</a>
      </p><p>O HTML fornece a estrutura para os sites da web. Aqui temos alguns exemplos de como usar a sintaxe do HTML para construir sites, incluindo alguns exemplos de novos recursos do HTML5.</p><h2 id="exemplo-de-atributo-a-href"><strong>Exemplo de atributo a<strong><strong> </strong></strong>h<strong><strong>ref</strong></strong></strong></h2><p>O atributo <code>&lt;a href&gt;</code> refere-se ao destino fornecido por um link. A tag <code>a</code> (âncora) é inútil sem o atributo <code>&lt;href&gt;</code>. Às vezes, no seu fluxo de trabalho, você não quer um link ativo ou você não sabe ainda o link de destino. Neste caso, será útil definir o atributo <code>href</code> como <code>"#"</code> para criar um link inativo. O atributo <code>href</code> pode ser usado para vincular a arquivos locais ou arquivos na internet.</p><p>Por exemplo:</p><pre><code class="language-html">&lt;html&gt; 
    &lt;head&gt; 
        &lt;title&gt;Exemplo do atributo href&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body&gt; 
        &lt;h1&gt;Exemplo do atributo href&lt;/h1&gt; 
        &lt;p&gt; 
            &lt;a href="https://www.freecodecamp.org/contribute/"&gt;A página de contribuição do freeCodeCamp&lt;/a&gt; 
            mostra para você como e onde você pode contribuir com a comunidade e com o crescimento do freeCodeCamp. 
        &lt;/p&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>O atributo <code>&lt;a href&gt;</code> é suportado por todos os navegadores.</p><h4 id="mais-atributos-"><strong>Mais atributos<strong><strong>:</strong></strong></strong></h4><p><code>hreflang</code>: Especifica o idioma do recurso vinculado. <code>target</code>: Especifica o contexto no qual o recurso vinculado será aberto. <code>title</code>: Define o título de um link, o qual será exibido para o usuário como uma dica.</p><h3 id="exemplos"><strong>Exemplos</strong></h3><pre><code class="language-html">&lt;a href="#"&gt;Este é um link inativo&lt;/a&gt; &lt;a href="https://www.freecodecamp.org"&gt;Este é um link para o freeCodeCamp&lt;/a&gt; &lt;a href="https://html.com/attributes/a-href/"&gt;mais com o atributo href&lt;/a&gt;</code></pre><h3 id="-ncoras-na-p-gina"><strong>Âncoras na página</strong></h3><p>Também é possível definir uma âncora para um certo local da página. Para fazer isso, você deve primeiro colocar uma tag <code>a</code> no local desejado na página e o atributo "name" com uma palavra-chave, como esta:</p><pre><code class="language-html">&lt;a name="top"&gt;&lt;/a&gt;</code></pre><p>A descrição entre as tags não é obrigatória. Depois disso, você pode adicionar um link que direcione para esta âncora em qualquer lugar da mesma página. Para fazer isso, você usará a tag <code>a</code> com o atributo "href" com o símbolo # (hashtag) e a palavra-chave da âncora, como vemos abaixo:</p><pre><code class="language-html">&lt;a href="#top"&gt;Vá para o início&lt;/a&gt;</code></pre><h3 id="links-de-imagem"><strong>Links de imagem</strong></h3><p>A tag <code>&lt;a href="#"&gt;</code> também pode ser aplicada a imagens e outros elementos HTML.</p><h3 id="exemplo">Exemplo</h3><pre><code class="language-html">&lt;a href="#"&gt; &lt;img itemprop="image" style="height: 90px;" src="https://bit.ly/fcc-relaxing-cat" alt="Um gato laranja fofo deitado de costas."&gt; &lt;/a&gt;</code></pre><h3 id="exemplos-de-a-target"><strong>Exemplos de a target</strong></h3><p>O atributo <code>&lt;a target&gt;</code> especifica onde abrir o documento vinculado a uma tag <code>a</code> (âncora).</p><p><strong>Exemplos<strong>:</strong></strong></p><p>Um atributo <code>target</code> com o valor <code>_blank</code> abre o documento vinculado a uma nova janela ou guia.</p><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/" target="_blank"&gt;freeCodeCamp&lt;/a&gt;</code></pre><p>Um atributo target com o valor <code>_self</code> abre o documento vinculado no mesmo frame onde o clique ocorreu (esse é o padrão e não é obrigatório que seja informado).</p><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/" target="_self"&gt;freeCodeCamp&lt;/a&gt;</code></pre><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp&lt;/a&gt;</code></pre><p>Um atributo target com o valor <code>_parent</code> abre o documento vinculado no frame pai.</p><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/" target="_parent"&gt;freeCodeCamp&lt;/a&gt;</code></pre><p>O atributo target com o valor <code>_top</code> abre o documento vinculado no corpo inteiro da janela.</p><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/" target="_top"&gt;freeCodeCamp&lt;/a&gt;</code></pre><p>Um atributo target com o valor <code>framename</code> abre o documento vinculado em um frame com o nome informado.</p><pre><code class="language-html">&lt;a href="https://www.freecodecamp.org/"  target="framename"&gt;freeCodeCamp&lt;/a&gt;</code></pre><h2 id="exemplo-do-atributo-background-do-elemento-body"><strong>Exemplo do atributo background, do elemento body </strong></h2><p>Se você quer adicionar uma imagem de fundo ao invés de uma cor, uma solução é usar <code>&lt;body background&gt;</code>. Assim. você especifica uma imagem de fundo para um documento HTML.</p><p>Sintaxe:</p><p><code>&lt;body background="URL"&gt;</code></p><p>Atributo:</p><p><code>background - URL para a imagem de fundo</code></p><p>Exemplo:</p><pre><code class="language-html">&lt;html&gt; 
    &lt;body background="https://assets.digitalocean.com/blog/static/hacktoberfest-is-back/hero.png"&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><h3 id="o-atributo-background-foi-descontinuado">O atributo background foi descontinuado</h3><p>O atributo background do elemento body não é mais suportado no HTML5. A forma correta de se estilizar a tag <code>&lt;body&gt;</code> é utilizando o CSS.</p><p>Há diversas propriedades CSS usadas para definir o conteúdo de fundo de um elemento. Eles podem ser usados ​​para definir o plano de fundo de uma página inteira.</p><h3 id="o-atributo-bgcolor-do-elemento-body">O atributo bgcolor, do elemento body</h3><p>Você pode usar <code>&lt;body bgcolor&gt;</code> para atribuir uma cor de fundo para um documento HTML.</p><p><strong>Sintaxe</strong>:</p><p><code>&lt;body bgcolor="color"&gt;</code> O valor da cor pode ser tanto um nome de cor (como <code>purple</code>) ou um valor hexadecimal (como <code>#af0000</code>).</p><p>Para adicionar uma cor de fundo a uma página da web você pode usar o atributo <code>&lt;body bgcolor="######"&gt;</code>. Ele especifica uma cor para o documento HTML a ser exibido.</p><p><strong>Por exemplo<strong><strong><strong>:</strong></strong></strong></strong></p><pre><code class="language-html">&lt;html&gt; 
    &lt;head&gt; 
        &lt;title&gt;Exemplo de body bgcolor&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body bgcolor="#afafaf"&gt; 
        &lt;h1&gt;Esta página tem fundo colorido.&lt;/h1&gt; 
    &lt;/body&gt; 
&lt;/html&gt; </code></pre><p>Você pode mudar a cor substituindo ###### por um valor hexadecimal. Para cores simples, você também pode usar a palavra, como “red” ou “black”.</p><p>Todos os navegadores principais suportam o atributo <code>&lt;body bgcolor&gt;</code>.</p><p><em>Observação<em>:</em></em></p><ul><li><code>&lt;body bgcolor&gt;</code> não é mais suportado no HTML 5. Para esse fim, use CSS. Como? Através do seguinte código: <code>&lt;body style="background-color: color"&gt;</code> Você também pode aplicar esse CSS em um documento separado ao invés de fazer isso "inline", logicamente.</li><li>Não use valores RGB no atributo <code>&lt;body bgcolor&gt;</code> porque <code>rgb()</code> é apenas para CSS, ou seja, não funcionará em HTML.</li></ul><h2 id="exemplo-de-atributo-align-do-elemento-div"><strong>Exemplo de atributo align, do elemento div</strong></h2><p><code>&lt;div align=""&gt;</code> é usado para alinhar o texto em uma tag <code>&lt;div&gt;</code> (à esquerda, à direita, ao centro ou justificado).</p><p>Por exemplo:</p><pre><code class="language-html">&lt;html&gt; 
    &lt;head&gt; 
        &lt;title&gt;Atributo div align&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body&gt; 
        &lt;div align="left"&gt; 
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
        &lt;/div&gt; 
        &lt;div align="right"&gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
        &lt;/div&gt; 
        &lt;div align="center"&gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
        &lt;/div&gt; 
        &lt;div align="justify"&gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
        &lt;/div&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><h2 id="importante-"><strong><strong><strong>Important</strong></strong>e<strong><strong>!</strong></strong></strong></h2><p>Este atributo não é mais suportado pelo HTML5. CSS é a forma recomendada para implementar esse tipo de alinhamento a partir de agora.</p><p>O atributo <code>div align</code> pode ser usado para alinhar horizontalmente o conteúdo contido em uma tag div. No exemplo abaixo, o texto será centralizado dentro da tag <code>&lt;div&gt;</code>.</p><pre><code class="language-html">&lt;div align="center"&gt; Esse texto será centralizado &lt;/div&gt;</code></pre><p>**Por não ter mais suporte em HTML5, recomenda-se utilizar a propriedade <code>text-align</code> do CSS.</p><h2 id="exemplo-do-atributo-color-do-elemento-font"><strong>Exemplo do atributo color, do elemento font</strong></h2><p>Esse atributo é usado para definir a cor do texto inserido dentro de uma tag <code>&lt;font&gt;</code>.</p><h3 id="importante--1"><strong>Importante!</strong></h3><p>Este atributo não é mais suportado pelo HTML5. No seu lugar, este artigo do freeCodeCamp especifica um método CSS que pode ser usado para obter o mesmo resultado.</p><h3 id="nota-"><strong>Nota:</strong></h3><p>Uma cor pode também ser definida usando um código hexadecimal ou um código RGB, ao invés de usar um nome.</p><h3 id="exemplo-"><strong>Exemplo:</strong></h3><p>1. Atributo <code>color</code> com nome de cor</p><pre><code class="language-html">&lt;html&gt; 
    &lt;body&gt; 
        &lt;font color="green"&gt;Exemplo de cor de fonte usando o atributo color com nome de cor&lt;/font&gt; 
    &lt;/body&gt; 
&lt;/html&gt; </code></pre><p>2. Atributo <code>color</code> com código hexadecimal</p><pre><code class="language-html">&lt;html&gt; 
    &lt;body&gt; 
        &lt;font color="#00FF00"&gt;Exemplo de cor de fonte usando o atributo color com código hexadecimal&lt;/font&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>3. Atributo <code>color</code> com código RGB</p><pre><code class="language-html">&lt;html&gt; 
    &lt;body&gt; 
        &lt;font color="rgb(0,255,0)"&gt;Exemplo de cor de fonte usando o atributo color com código RGB&lt;/font&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><h2 id="exemplo-do-atributo-size-do-elemento-font"><strong>Exemplo do atributo s<strong><strong>ize</strong></strong>, do elemento font</strong></h2><p>Este atributo define o tamanho da fonte como um valor numérico relativo. Valores numéricos variam entre <code>1</code> a <code>7</code> sendo <code>1</code> o menor e <code>3</code> o padrão. O tamanho pode também ser definido usando um valor relativo, como <code>+2</code> ou <code>-3</code>, &nbsp;que o definem de forma relativa ao valor do atributo <code>size</code> do elemento <code>&lt;basefont&gt;</code>, ou relativo a <code>3</code> (valor padrão), caso não exista.</p><p>Sintaxe:</p><p><code>&lt;font size="number"&gt;</code></p><p>Exemplo:</p><pre><code class="language-html">&lt;html&gt; 
    &lt;body&gt; 
        &lt;font size="6"&gt;Um texto qualquer&lt;/font&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>Nota : O atributo <code>size</code> de <code>&lt;font&gt;</code> não é suportado pelo HTML5. Use CSS no seu lugar.</p><h2 id="exemplo-de-atributo-align-do-elemento-img"><strong>Exemplo de atributo align, do elemento img</strong></h2><p>O atributo <code>align</code> de uma imagem especifica onde a imagem deve ser alinhada de acordo com o elemento HTML que a contém.</p><p>Valores possíveis:‌‌ <br><code>right</code> - Alinha a imagem à direita‌‌<br><code>left</code> - Alinha a imagem à esquerda‌ <br><code>top</code> - Alinha a imagem ao topo<br><code>‌bottom</code> - Alinha a imagem no rodapé <br><code>‌‌middle</code> - Alinha a imagem ao centro</p><p>Exemplo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt; 
&lt;html lang="pt-BR"&gt; 
    &lt;head&gt; 
        &lt;title&gt;img align&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body&gt; 
        &lt;p&gt; Este é um exemplo. 
            &lt;img src="image.png" alt="Image" align="middle" /&gt; 
            Mais texto aqui 
            &lt;img src="image.png" alt="Image" width="100" /&gt; 
        &lt;/p&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>Nós também podemos alinhar à direita, se assim desejarmos:</p><pre><code class="language-html">&lt;p&gt;Outro exemplo.&lt;img src="image.png" alt="Image" align="right" /&gt;&lt;/p&gt; </code></pre><p><strong>Observe que o atributo align não é suportado no HTML5. Você deve usar CSS no seu lugar. No entanto, ele continua suportado pelos principais navegadores.</strong></p><h2 id="o-atributo-width-do-elemento-img"><strong>O atributo width, do elemento img</strong></h2><p>O atributo HTML <code>width</code> se refere à largura de uma imagem. O valor entre aspas é o total de pixels.</p><p>Por exemplo, se você já tem um link para uma imagem definida pelo atributo <code>src</code> você pode adicionar o atributo <code>width</code> como demonstrado abaixo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt; 
&lt;html lang="pt-BR"&gt; 
    &lt;head&gt; 
        &lt;title&gt;img width&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body&gt; 
        &lt;img src="image.png" alt="Imagem" width="100" /&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>No trecho de código acima, há uma tag <code>img</code> e a imagem foi definida para uma largura de 100 pixels. <code>width="100"</code></p><h2 id="exemplo-do-atributo-src-do-elemento-img"><strong>Exemplo do atributo src, do elemento img</strong></h2><p><code>&lt;img src&gt;</code> se refere à origem da imagem que você quer mostrar. A tag <code>&lt;img&gt;</code> não exibe uma imagem sem o atributo <code>src</code>. Por outro lado, se você preencher o atributo <code>src</code> com o local onde uma imagem está salva na internet, você pode exibir qualquer imagem.</p><p>Há uma imagem da logomarca do freeCodeCamp localizada no url <code>https://avatars0.githubusercontent.com/u/9892522?v=4&amp;s=400</code></p><p>Você pode usar essa imagem através do atributo <code>src</code>.</p><pre><code class="language-html">&lt;html&gt; 
    &lt;head&gt; 
        &lt;title&gt;Exemplo de atributo img src&lt;/title&gt; 
    &lt;/head&gt; 
    &lt;body&gt; 
        &lt;img src="https://avatars0.githubusercontent.com/u/9892522?v=4&amp;s=400" /&gt; 
    &lt;/body&gt; 
&lt;/html&gt;</code></pre><p>O código acima é exibido como no exemplo a seguir:</p><!--kg-card-begin: html--> 
     
        <title>Exemplo de atributo img src</title> 
     
     
        <img src="https://avatars0.githubusercontent.com/u/9892522?v=4&amp;s=400" width="400" height="400" alt="9892522?v=4&amp;s=400" loading="lazy"> 
     
<p>O atributo <code>src</code> é suportado por todos os navegadores.</p><p>Você pode também usar arquivos salvos localmente como sua imagem.</p><p>Por exemplo, <code>&lt;img src="images/freeCodeCamp.jpeg&gt;</code> funcionaria se você tivesse uma pasta chamada <code>images</code> contendo o arquivo <code>freeCodeCamp.jpeg</code>, desde que a pasta <code>images</code> estivesse na mesma localização ou pasta do arquivo <code>index.html</code>.</p><p><code>../files/index.html</code></p><p><code>..files/images/freeCodeCamp.jpeg</code></p><h2 id="vis-o-geral"><strong>Visão geral</strong></h2><h3 id="o-que-s-o-entidades-html"><strong>O que são entidades <strong><strong>HTML?</strong></strong></strong></h3><p>Entidades HTML são caracteres usados para substituir caracteres reservados no HTML ou para caracteres que não estão presentes no seu teclado. Alguns caracteres são reservados no HTML. Se você usar os sinais "menor que" (&lt;) ou "maior que" (&gt;) no seu texto, o navegador poderá confundi-los com tags.</p><h3 id="qual-o-seu-uso"><strong>Qual é o seu uso?</strong></h3><p>Como mencionado acima, entidades HTML são usadas para substituir caracteres que são reservados pelo HTML.</p><h3 id="como-voc-as-usa"><strong>Como você as usa?</strong></h3><p>Uma entidade de caractere parece algo como o que você vê a seguir:</p><pre><code class="language-html">&lt;!-- &amp;[nome_entidade]; --&gt; 
&lt;!-- exemplo para o sinal "menor que" (&lt;) --&gt; 
&amp;lt;</code></pre><p>Ou</p><pre><code class="language-html">&lt;!-- &amp;#[número_entidade]; --&gt; 
&lt;!-- exemplo para o sinal "menor que" (&lt;) --&gt; 
&amp;#60;</code></pre><h2 id="guia-de-refer-ncia"><strong>Guia de referência</strong></h2><p>Esta não é, de forma alguma, uma lista completa, mas os links abaixo poderão fornecer mais entidades se os abaixo não funcionarem para suas necessidades.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Caractere</th>
<th>Nome entidade</th>
<th>Número entidade</th>
<th>Descrição</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td>&amp;#32;</td>
<td>Espaço em branco</td>
</tr>
<tr>
<td>!</td>
<td></td>
<td>&amp;#33;</td>
<td>Exclamação</td>
</tr>
<tr>
<td>”</td>
<td></td>
<td>&amp;#34;</td>
<td>Aspas duplas</td>
</tr>
<tr>
<td>#</td>
<td></td>
<td>&amp;#35;</td>
<td>Sinal numérico (hash)</td>
</tr>
<tr>
<td>$</td>
<td></td>
<td>&amp;#36;</td>
<td>Dólar</td>
</tr>
<tr>
<td>¢</td>
<td>&amp;cent;</td>
<td>&amp;#162;</td>
<td>Centavos</td>
</tr>
<tr>
<td>€</td>
<td>&amp;euro;</td>
<td>&amp;#8364;</td>
<td>Euro</td>
</tr>
<tr>
<td>£</td>
<td>&amp;pound;</td>
<td>&amp;#163;</td>
<td>Libras</td>
</tr>
<tr>
<td>¥</td>
<td>&amp;yen;</td>
<td>&amp;#165;</td>
<td>Yen</td>
</tr>
<tr>
<td>%</td>
<td></td>
<td>&amp;#37;</td>
<td>Percentual</td>
</tr>
<tr>
<td>&amp;</td>
<td>&amp;amp;</td>
<td>&amp;#38;</td>
<td>E comercial</td>
</tr>
<tr>
<td>’</td>
<td></td>
<td>&amp;#39;</td>
<td>Apóstrofe</td>
</tr>
<tr>
<td>(</td>
<td></td>
<td>&amp;#40;</td>
<td>Abre parênteses</td>
</tr>
<tr>
<td>)</td>
<td></td>
<td>&amp;#41;</td>
<td>Fecha parênteses</td>
</tr>
<tr>
<td>*</td>
<td></td>
<td>&amp;#42;</td>
<td>Asterisco</td>
</tr>
<tr>
<td>+</td>
<td></td>
<td>&amp;#43;</td>
<td>Sinal de mais</td>
</tr>
<tr>
<td>,</td>
<td></td>
<td>&amp;#44;</td>
<td>Vírgula</td>
</tr>
<tr>
<td>-</td>
<td></td>
<td>&amp;#45;</td>
<td>Hífen/sinal de menos</td>
</tr>
<tr>
<td>.</td>
<td></td>
<td>&amp;#46;</td>
<td>Ponto final</td>
</tr>
<tr>
<td>/</td>
<td></td>
<td>&amp;#47;</td>
<td>Barra</td>
</tr>
<tr>
<td>©</td>
<td>&amp;copy;</td>
<td>&amp;#169;</td>
<td>Copyright</td>
</tr>
<tr>
<td>®</td>
<td>&amp;reg;</td>
<td>&amp;#174;</td>
<td>Marca registrada</td>
</tr>
<tr>
<td>&gt;</td>
<td>&amp;gt;</td>
<td>&amp;#62;</td>
<td>Sinal "maior que"</td>
</tr>
<tr>
<td>&lt;</td>
<td>&amp;lt;</td>
<td>&amp;#60;</td>
<td>Sinal "menor que"</td>
</tr>
<tr>
<td>•</td>
<td>&amp;bull;</td>
<td>&amp;#8226</td>
<td>Bullet point</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h2 id="exemplo-de-formul-rio-html"><strong>Exemplo de formulário HTML</strong></h2><p>Basicamente, formulários são usados para coletar dados inseridos por um usuário e enviá-los ao servidor para posterior processamento. Eles podem ser usados para diferentes tipos de entradas de usuário, como nome, e-mail etc.</p><p>Formulários contêm elementos controlados, que são envolvidos pelas tags <code>&lt;form&gt;&lt;/form&gt;</code>, como o <code>input</code>, que possui os tipos listados a seguir:</p><ul><li><code>text</code></li><li><code>email</code></li><li><code>password</code></li><li><code>checkbox</code></li><li><code>radio</code></li><li><code>submit</code></li><li><code>range</code></li><li><code>search</code></li><li><code>date</code></li><li><code>time</code></li><li><code>week</code></li><li><code>color</code></li><li><code>datalist</code></li></ul><p>Exemplo de código:</p><pre><code class="language-html">&lt;form&gt; 
    &lt;label for="username"&gt;Nome de usuário:&lt;/label&gt; 
    &lt;input type="text" name="username" id="username" /&gt; 
    
    &lt;label for="password"&gt;Senha:&lt;/label&gt; 
    &lt;input type="password" name="password" id="password" /&gt; 
    
    &lt;input type="radio" name="gender" value="male" /&gt;Masculino&lt;br /&gt; 
    &lt;input type="radio" name="gender" value="female" /&gt;Feminino&lt;br /&gt; 
    &lt;input type="radio" name="gender" value="other" /&gt;Outro 
    &lt;input list="Options" /&gt; 
    &lt;datalist id="Options"&gt; 
        &lt;option value="Option1"&gt;&lt;/option&gt; 
        &lt;option value="Option2"&gt;&lt;/option&gt; 
        &lt;option value="Option3"&gt;&lt;/option&gt; 
    &lt;/datalist&gt; 
    &lt;input type="submit" value="Enviar" /&gt; 
    &lt;input type="color" /&gt; 
    &lt;input type="checkbox" name="correct" value="correct" /&gt;Correto &lt;/form&gt;</code></pre><p>Outros elementos que um formulário pode conter:</p><ul><li><code>textarea</code> - é uma caixa multilinhas que é frequentemente usada para adicionar algum texto, como por exemplo, comentários. O tamanho da tag <code>textarea</code> é definido pelo número de linhas e colunas.</li><li><code>select</code> - junto com as tags <code>&lt;option&gt;&lt;/option&gt;</code>, cria um menu de seleção suspenso.</li><li><code>button</code> - o elemento botão pode ser usado para definir um botão clicável.</li></ul><p>MAIS INFORMAÇÕES SOBRE FORMULÁRIOS HTML</p><p>Formulários HTML são requeridos quando você quer coletar dados de um visitante do site. Por exemplo, durante o registro do usuário você gostaria de coletar informações como o nome, endereço de e-mail, cartão de crédito etc.</p><p>Um formulário receberá as informações do visitante do site e, em seguida, as publicará em uma aplicação de back-end, como CGI, script ASP ou script PHP etc. A aplicação back-end executará o processamento necessário nos dados passados ​​com base na lógica de negócios definida dentro da aplicação.</p><p>Há vários elementos de formulário disponíveis como campos de texto, campos de área de texto, menus de seleção suspensos, botões de seleção, caixas de marcação etc.</p><p>A tag <code>&lt;form&gt;</code> é usada para criar um formulário HTML, com a seguinte sintaxe:</p><pre><code class="language-html">&lt;form action="Script URL" method="GET|POST"&gt;
    elementos de formulário como input, textarea etc.
&lt;/form&gt;</code></pre><p>Se o método do formulário não for definido então o padrão será “GET”.</p><p>A tag <code>form</code> pode também ter um atributo chamado <code>target</code>, o qual especifica onde o link será aberto. Ele pode ser aberto em uma aba do navegador, em um frame ou na janela atual.</p><p>O atributo <code>action</code> determina a ação que será executada quando o formulário é enviado. Normalmente, os dados do formulário são enviados para uma página da Web no URL do Script quando o usuário clica no botão enviar. Se o atributo de ação for omitido, a ação será definida para a página atual.</p><h2 id="exemplo-de-udio-html5"><strong>Exemplo de áudio <strong><strong>HTML5</strong></strong></strong></h2><p>Antes do HTML5, arquivos de áudio tinham que ser reproduzidos em um navegador usando um adaptador, como o Flash da Adobe.</p><p>O trecho de código a seguir adiciona um arquivo de áudio com o nome <code>tutorial.ogg</code> ou <code>tutorial.mp3</code>. O elemento <code>&lt;source&gt;</code> indica arquivos de áudio alternativos os quais o navegador pode escolher. O navegador utiliza o primeiro formato reconhecido.</p><h4 id="exemplo-1"><strong>Exemplo<strong><strong> 1</strong></strong></strong></h4><pre><code class="language-html">&lt;audio controls&gt; 
    &lt;source src="tutorial.ogg" type="audio/ogg" /&gt; 
    &lt;source src="tutorial.mp3" type="audio/mpeg" /&gt; 
    Seu navegador não suporta o elemento de áudio. 
&lt;/audio&gt;</code></pre><h4 id="exemplo-2"><strong>Exemplo<strong><strong> 2</strong></strong></strong></h4><pre><code class="language-html">&lt;audio src="https://s3.amazonaws.com/freecodecamp/simonSound1.mp3" controls loop autoplay&gt;&lt;/audio&gt;</code></pre><p>O atributo <code>controls</code> inclui controles de áudio como play, pause e volume. Se você não usar esse atributo, nenhum controle será exibido.</p><p>O elemento <code>&lt;source&gt;</code> permite que você indique arquivos alternativos de áudio dentre os quais o navegador poderá escolher. O navegador utiliza o primeiro formato reconhecido. O texto entre as tags <code>&lt;audio&gt;&lt;/audio&gt;</code> pode ser exibido na tela caso o navegador não suporte o elemento <code>&lt;audio&gt;</code> do HTML5.</p><p>O atributo <code>autoplay</code> reproduzir automaticamente o seu arquivo de áudio em segundo plano. É considerada uma prática recomendada deixar que os visitantes escolham se querem ou não reproduzir o áudio.</p><p>O atributo <code>preload</code> indica ao navegador o que ele deve fazer caso o <em>player</em> não esteja definido para autorreprodução.</p><p>O atributo <code>loop</code> vai reproduzir o arquivo de áudio em um laço contínuo de repetição, caso seja utilizado.</p><p>Por estarmos falando de HTML5, quando este artigo foi escrito (novembro de 2019), alguns navegadores não o suportam. Você pode verificar em <a href="https://caniuse.com/#search=audio">https://caniuse.com/#search=audio</a></p><h2 id="exemplo-de-elementos-sem-nticos-do-html5">Exemplo de elementos semânticos do HTML5</h2><p>Os elementos semânticos do HTML descrevem claramente seu significado de maneira legível por humanos e pelas máquinas. Elementos como <code>&lt;header&gt;</code>, <code>&lt;footer&gt;</code> e <code>&lt;article&gt;</code> são todos considerados semânticos porque eles, de forma assertiva, descrevem o propósito do elemento e o tipo de conteúdo que está inserido neles.</p><h3 id="uma-hist-ria-r-pida"><strong>Uma história rápida</strong></h3><p>O HTML foi originalmente criado como uma linguagem de marcação para descrever documentos no início da internet. À medida que a internet cresceu e foi adotada por mais pessoas, suas necessidades mudaram. Originalmente destinada ao compartilhamento de documentos científicos, agora as pessoas queriam compartilhar outras coisas na internet também. Muito rapidamente, as pessoas começaram a querer tornar a web mais bonita. Como a web não foi inicialmente construída para ser estilizada, os programadores usaram diferentes hacks para organizar as coisas de maneiras diferentes.</p><p>Ao invés de usar a tag <code>&lt;table&gt;&lt;/table&gt;</code> para descrever informações usando tabelas, os programadores a usavam para posicionar outros elementos em uma página. &nbsp;À medida que o uso de layouts visualmente estilizados progrediu, os programadores começaram a usar uma tag genérica “não-semântica” como <code>&lt;div&gt;</code>. Eles geralmente davam a esses elementos um atributo <code>class</code> ou <code>id</code> para descrever seu propósito. Por exemplo, ao invés de <code>&lt;header&gt;</code>, tivemos muitas vezes algo como <code>&lt;div class="header"&gt;</code>. Como o HTML5 ainda é relativamente novo, esse uso de elementos não semânticos ainda é muito comum nos sites atuais.</p><h4 id="lista-de-novos-elementos-sem-nticos"><strong>Lista de novos elementos semânticos</strong></h4><p>Os elementos semânticos adicionados no HTML5 são:</p><ul><li><code>&lt;article&gt;</code></li><li><code>&lt;aside&gt;</code></li><li><code>&lt;details&gt;</code></li><li><code>&lt;figcaption&gt;</code></li><li><code>&lt;figure&gt;</code></li><li><code>&lt;footer&gt;</code></li><li><code>&lt;header&gt;</code></li><li><code>&lt;main&gt;</code></li><li><code>&lt;mark&gt;</code></li><li><code>&lt;nav&gt;</code></li><li><code>&lt;section&gt;</code></li><li><code>&lt;summary&gt;</code></li><li><code>&lt;time&gt;</code></li></ul><p>Elementos como <code>&lt;header&gt;</code>, <code>&lt;nav&gt;</code>, <code>&lt;section&gt;</code>, <code>&lt;article&gt;</code>, <code>&lt;aside&gt;</code>, e <code>&lt;footer&gt;</code> agem mais ou menos como elementos <code>&lt;div&gt;</code>. Eles agrupam outros elementos juntos dentro de seções na página. No entanto, embora uma tag <code>&lt;div&gt;</code> pudesse conter qualquer tipo de informação, fica mais fácil de identificar que tipo de informação se encontra em uma região <code>&lt;header&gt;</code> (cabeçalho, em inglês).</p><p><strong><strong>Um exemplo de elemento</strong>s<strong> semântico</strong>s<strong> dado p</strong>elo site<strong><strong><strong> w3schools</strong></strong></strong>:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/01/img_sem_elements.gif" class="kg-image" alt="img_sem_elements" width="219" height="258" loading="lazy"></figure><h3 id="benef-cios-dos-elementos-sem-nticos"><strong><strong>Benefícios dos elementos semânticos</strong></strong></h3><p>Para ver os benefícios dos elementos semânticos, aqui estão dois trechos de código em HTML. O primeiro bloco usa elementos semânticos:</p><pre><code class="language-html">&lt;header&gt;&lt;/header&gt; 
&lt;section&gt; 
    &lt;article&gt; 
        &lt;figure&gt; 
            &lt;img /&gt; 
            &lt;figcaption&gt;&lt;/figcaption&gt; 
        &lt;/figure&gt; 
    &lt;/article&gt; 
&lt;/section&gt; 
&lt;footer&gt;&lt;/footer&gt;</code></pre><p>Já o segundo bloco de código usa elementos não semânticos:</p><pre><code class="language-html">&lt;div id="header"&gt;&lt;/div&gt; 
&lt;div class="section"&gt; 
    &lt;div class="article"&gt; 
        &lt;div class="figure"&gt; 
            &lt;img /&gt; 
            &lt;div class="figcaption"&gt;&lt;/div&gt; 
        &lt;/div&gt; 
    &lt;/div&gt; 
&lt;/div&gt; 
&lt;div id="footer"&gt;&lt;/div&gt;</code></pre><p>O primeiro é muito <strong>mais fácil de ler</strong>. Esta é provavelmente a primeira coisa que você notará ao olhar para o primeiro bloco de código usando elementos semânticos. Este é um pequeno exemplo, mas como programador você pode ler centenas ou milhares de linhas de código. Quanto mais fácil for ler e entender esse código, mais fácil será o seu trabalho.</p><p>Ele também tem <strong>maior acessibilidade</strong>. Você não é o único que acha os elementos semânticos mais fáceis de entender. Mecanismos de pesquisa e tecnologias assistivas (como leitores de tela para usuários com deficiência visual) também são capazes de entender melhor o contexto e o conteúdo do seu site, o que significa uma melhor experiência para seus usuários.</p><p>No geral, os elementos semânticos também levam a um <strong>código mais consistente</strong>. Ao criar um cabeçalho usando elementos não semânticos, diferentes programadores podem escrever isso como <code>&lt;div class="header"&gt;</code>, <code>&lt;div id="header"&gt;</code>, <code>&lt;div class="head"&gt;</code>, ou simplesmente <code>&lt;div&gt;</code>. &nbsp;Existem muitas maneiras de criar um elemento de cabeçalho e todas elas dependem da preferência pessoal do programador. Ao criar um elemento semântico padrão, fica mais fácil para todos.</p><p>Desde outubro de 2014, o HTML4 foi atualizado para HTML5, juntamente com alguns novos elementos “semânticos”. Até hoje, alguns de nós ainda podem estar confusos sobre o motivo de tantos elementos diferentes que parecem não mostrar grandes mudanças.</p><h4 id="section-e-article"><strong><strong><strong><code>&lt;section&gt;</code> </strong></strong>e<strong><strong> <code>&lt;article&gt;</code></strong></strong></strong></h4><p>“Qual é a diferença?”, você pode perguntar. Ambos os elementos são usados ​​para seccionar um conteúdo e, sim, eles definitivamente podem ser usados ​​​​de forma intercambiável. É uma questão de em qual situação. HTML4 oferecia apenas um tipo de elemento container, que era a <code>&lt;div&gt;</code>. Embora ele ainda seja usado no HTML5, o HTML5 nos forneceu <code>&lt;section&gt;</code> e <code>&lt;article&gt;</code> como forma de substituir a <code>&lt;div&gt;</code>.</p><p>Os elementos <code>&lt;section&gt;</code> e <code>&lt;article&gt;</code> são conceitualmente similares e intercambiáveis. Para decidir qual destes você deve escolher, tome nota do seguinte:</p><ol><li>Um <em>article</em> (artigo, em inglês) destina-se a ser distribuído ou reutilizável de forma independente.</li><li>Uma <em>section</em> (seção, em inglês) é um agrupamento temático de conteúdo.</li></ol><pre><code class="language-html">&lt;section&gt; 
    &lt;p&gt;Melhores histórias&lt;/p&gt; 
    &lt;section&gt; 
        &lt;p&gt;News&lt;/p&gt; 
        &lt;article&gt;História 1&lt;/article&gt; 
        &lt;article&gt;História 2&lt;/article&gt; 
        &lt;article&gt;História 3&lt;/article&gt; 
    &lt;/section&gt; 
    &lt;section&gt; 
        &lt;p&gt;Sport&lt;/p&gt; 
        &lt;article&gt;História 1&lt;/article&gt; 
        &lt;article&gt;História 2&lt;/article&gt; 
        &lt;article&gt;História 3&lt;/article&gt; 
    &lt;/section&gt; 
&lt;/section&gt;</code></pre><h4 id="header-e-hgroup"><strong><strong><strong><code>&lt;header&gt;</code> </strong></strong>e<strong><strong> <code>&lt;hgroup&gt;</code></strong></strong></strong></h4><p>O elemento <code>&lt;header&gt;</code> geralmente é encontrado na parte superior de um documento, uma seção ou um artigo e geralmente contém o título principal e algumas ferramentas de navegação e pesquisa.</p><p>O elemento <code>&lt;hgroup&gt;</code> deveria ser usado onde você deseja inserir um cabeçalho principal com um ou mais subcabeçalhos.</p><pre><code class="language-html">&lt;hgroup&gt; 
    &lt;h1&gt;Cabeçalho 1&lt;/h1&gt; 
    &lt;h2&gt;Subcabeçalho 1&lt;/h2&gt; 
    &lt;h2&gt;Subcabeçalho 2&lt;/h2&gt; 
&lt;/hgroup&gt;</code></pre><p>LEMBRE-SE: o elemento <code>&lt;header&gt;</code> pode conter qualquer conteúdo, mas o elemento <code>&lt;hgroup&gt;</code> pode somente conter outros cabeçalhos, que são as tags <code>&lt;h1&gt;</code> até <code>&lt;h6&gt;</code> e incluir outro <code>&lt;hgroup&gt;</code>.</p><h4 id="aside"><strong><strong><strong><code>&lt;aside&gt;</code></strong></strong></strong></h4><p>O elemento <code>&lt;aside&gt;</code> é destinado para conteúdo que não é parte do fluxo do texto no qual ele aparece, embora ainda seja relacionado a ele de alguma forma. Isto faz do <code>&lt;aside&gt;</code> uma barra lateral para o seu conteúdo principal.</p><pre><code class="language-html">&lt;aside&gt; 
    &lt;p&gt;Isso é uma barra lateral&lt;/p&gt; 
&lt;/aside&gt;</code></pre><p>Antes do HTML5, nossos menus eram criados com a combinação de várias tags <code>&lt;ul&gt;</code> e <code>&lt;li&gt;</code>. Agora, junto com eles, podemos separar nossos itens de menu com uma tag <code>&lt;nav&gt;</code> para navegação entre suas páginas. Você pode ter qualquer número de elementos <code>&lt;nav&gt;</code> em uma página. Por exemplo, é comum ter navegação global no topo (no elemento <code>&lt;header&gt;</code>) e navegação local na barra lateral (em um elemento <code>&lt;aside&gt;</code>).</p><pre><code class="language-html">&lt;nav&gt; 
    &lt;ul&gt; 
        &lt;li&gt;
            &lt;a href="/home"&gt;Início&lt;/a&gt;
        &lt;/li&gt; 
        &lt;li&gt;
            &lt;a href="/about"&gt;Sobre&lt;/a&gt;
        &lt;/li&gt; 
        &lt;li&gt;
            &lt;a href="/contact"&gt;Contate-nos&lt;/a&gt;
        &lt;/li&gt; 
    &lt;/ul&gt; 
&lt;/nav&gt; </code></pre><h4 id="footer"><strong><strong><strong><code>&lt;footer&gt;</code></strong></strong></strong></h4><p>Se há um elemento <code>&lt;header&gt;</code>, precisa existir também um <code>&lt;footer&gt;</code>. Um elemento <code>&lt;footer&gt;</code> é normalmente encontrado no rodapé de um documento, uma seção, ou um artigo. Exatamente como o <code>&lt;header&gt;</code>, o conteúdo é geralmente metainformação, como detalhes do autor, informações legais e/ou links para informações relacionadas. Também é aceitável incluir elementos <code>&lt;section&gt;</code> dentro de um rodapé.</p><pre><code class="language-html">&lt;footer&gt;&amp;copy;Empresa A&lt;/footer&gt;</code></pre><h4 id="small"><strong><strong><strong><code>&lt;small&gt;</code></strong></strong></strong></h4><p>O elemento <code>&lt;small&gt;</code> frequentemente aparece dentro de um elemento <code>&lt;footer&gt;</code> ou <code>&lt;aside&gt;</code>, o que normalmente conteria informações de direitos autorais ou isenções de responsabilidade legais e outras letras miúdas. No entanto, ele não se destina a tornar o texto menor. Ele está apenas descrevendo seu conteúdo, não prescrevendo apresentação.</p><pre><code class="language-html">&lt;footer&gt;
    &lt;small&gt;&amp;copy;Empresa A&lt;/small&gt; 
    Data
&lt;/footer&gt;</code></pre><h4 id="time"><strong><strong><strong><code>&lt;time&gt;</code></strong></strong></strong></h4><p>O elemento <code>&lt;time&gt;</code> permite que uma data inequívoca da ISO 8601 seja anexada a uma versão legível dessa data.</p><pre><code class="language-html">&lt;time datetime="2017-10-31T11:21:00+02:00"&gt;
    Terça-feira, 31 de Outubro de 2017
&lt;/time&gt;</code></pre><p>Por que se preocupar com <code>&lt;time&gt;</code>? Enquanto os humanos que podem ler o tempo podem compreender através do contexto normalmente, os computadores podem ler a data ISO 8601 e ver a data, hora e fuso horário.</p><h4 id="figure-e-figcaption"><strong><strong><strong><code>&lt;figure&gt;</code> </strong></strong>e<strong><strong> <code>&lt;figcaption&gt;</code></strong></strong></strong></h4><p><code>&lt;figure&gt;</code> serve para envolver seu conteúdo de imagem e <code>&lt;figcaption&gt;</code> serve para legendar sua imagem.</p><pre><code class="language-html">&lt;figure&gt; 
    &lt;img src="https://en.wikipedia.org/wiki/File:Shadow_of_Mordor_cover_art.jpg" alt="Shadow of Mordor" /&gt; 
    &lt;figcaption&gt;
        Arte da capa de Terra-média: Sombras de Mordor
    &lt;/figcaption&gt; 
&lt;/figure&gt;</code></pre><h2 id="exemplo-de-v-deo-html5">Exemplo de vídeo HTML5</h2><p>Antes do HTML5, para poder reproduzir um vídeo em uma página da internet, você precisaria usar um adaptador, como o Flash Player da Adobe. Com a introdução do HTML5, agora você pode colocá-lo diretamente dentro da própria página. </p><p>Para embutir um arquivo de vídeo em uma página da internet, apenas adicione esse trecho de código e mude o atributo <code>src</code> para a localização do seu arquivo de vídeo.</p><pre><code class="language-html">&lt;video controls&gt; 
    &lt;source src="tutorial.ogg" type="video /ogg" /&gt; 
    &lt;source src="tutorial.mp4" type="video /mpeg" /&gt; 
    Seu navegador não suporta o elemento de vídeo. Por favor, atualize-o para a versão mais recente.
&lt;/video&gt; </code></pre><p>O atributo <code>controls</code> inclui controles de vídeo similares ao play, pause e volume.</p><p>Este recurso é suportado por todos os navegadores modernos/atualizados. No entanto, nem todos suportam o mesmo formato de arquivo de vídeo. Minha recomendação para uma ampla gama de compatibilidade é o MP4, pois é o formato mais aceito. Há também dois outros formatos (WebM e Ogg) que são suportados no Chrome, Firefox e Opera.</p><p>O elemento permite indicar arquivos de vídeo alternativos que o navegador pode escolher. O navegador utilizará o primeiro formato reconhecido. Em HTML5, existem 3 formatos de vídeo suportados: MP4, WebM e Ogg.</p><p>O texto entre as tags só será exibido em navegadores que não suportam o formato de arquivo de vídeo.</p><p>Existem vários elementos diferentes relativos à tag de vídeo. Muitas dessas explicações são baseadas nos documentos da web da Mozilla (links abaixo). Há ainda mais se você clicar no link na parte inferior.</p><h4 id="autoplay"><strong><strong><strong>autoplay</strong></strong></strong></h4><p><code>autoplay</code> pode ser definido como verdadeiro ou falso. Você define como <code>true</code> adicionando-o na tag, se não estiver presente na tag, é configurado como <code>false</code>. Se definido como verdadeiro, o vídeo começará a ser reproduzido assim que o suficiente do vídeo for armazenado em buffer para que ele possa ser reproduzido. Muitas pessoas consideram os vídeos de reprodução automática perturbadores ou irritantes. Portanto, use esse recurso com moderação. Observe também que alguns navegadores móveis, como o Safari para iOS, ignoram esse atributo.</p><pre><code class="language-html">&lt;video autoplay&gt; 
    &lt;source src="video.mp4" type="video/mp4" /&gt; 
&lt;/video&gt;</code></pre><h4 id="poster"><strong><strong><strong>poster</strong></strong></strong></h4><p>O atributo <code>poster</code> é a imagem que aparece no vídeo até que o usuário clique para reproduzi-lo.</p><h4 id="controls"><strong><strong><strong>controls</strong></strong></strong></h4><p>O atributo <code>controls</code> pode ser definido como true ou false e dirá se controles como o botão reproduzir/pausar ou o controle deslizante de volume aparecerem. Você define como <code>true</code> adicionando-o na tag. Se não estiver presente na tag, é configurado como <code>false</code>.</p><pre><code class="language-html">&lt;video controls&gt; 
    &lt;source src="video.mp4" type="video/mp4" /&gt; 
&lt;/video&gt;</code></pre><p>Há muitos outros atributos opcionais que podem ser adicionados para personalizar o player de vídeo na página. Para saber mais, clique nos links abaixo.</p><h2 id="exemplo-de-armazenamento-na-web-html5">Exemplo de armazenamento na web HTML5</h2><p>O armazenamento na web permite que os aplicativos da web armazenem até 5 MB de informações no armazenamento do navegador por origem (por domínio e protocolo).</p><h3 id="tipos-de-armazenamento-na-web">Tipos de armazenamento na web</h3><p>Existem dois objetos para armazenar dados no cliente:</p><p><code>window.localStorage</code>: armazena dados sem data de validade e persiste até ser removido.</p><pre><code class="language-javascript">// Store Item localStorage.setItem("foo", "bar"); 
// Get Item localStorage.getItem("foo"); //returns "bar"</code></pre><p><code>window.sessionStorage</code>: armazena dados para uma sessão, onde os dados são descartados quando a guia do navegador é fechada.</p><pre><code class="language-javascript">// Store Item sessionStorage.setItem("foo", "bar"); 
// Get Item sessionStorage.getItem("foo"); //returns "bar"</code></pre><p>Como a implementação atual suporta apenas mapeamentos de string para string, você precisa serializar e desserializar outras estruturas de dados.</p><p>Você pode fazer isso usando JSON.stringify() e JSON.parse().</p><p>Para exemplificar, veja o JSON abaixo:</p><pre><code class="language-javascript">var jsonObject = { 'one': 1, 'two': 2, 'three': 3 };</code></pre><p>Primeiro, convertemos o objeto JSON em uma string e salvamos no armazenamento local:</p><pre><code class="language-javascript">localStorage.setItem('jsonObjectString', JSON.stringify(jsonObject));</code></pre><p>Para obter o objeto JSON a partir da string armazenada no armazenamento local:</p><pre><code class="language-javascript">var jsonObject = JSON.parse(localStorage.getItem('jsonObjectString'));</code></pre><h2 id="exemplo-de-links-mailto">Exemplo de links mailto</h2><p>Um link <code>mailto</code> é um tipo de hiperlink (<code>&lt;a href=""&gt;&lt;/a&gt;</code>) com parâmetros especiais que permitem que você especifique destinatários adicionais, uma linha para o assunto e/ou um texto para o corpo do e-mail.</p><h3 id="a-sintaxe-b-sica-com-um-destinat-rio-"><strong>A sintaxe básica com um destinatário é:</strong></h3><pre><code class="language-html">&lt;a href="mailto:friend@something.com"&gt;Um texto&lt;/a&gt;</code></pre><h3 id="mais-customiza-o-"><strong>Mais customização<strong><strong>!</strong></strong></strong></h3><h4 id="adicionando-um-assunto-ao-e-mail-"><strong>Adicionando um assunto ao e-mail<strong><strong>:</strong></strong></strong></h4><p>Se você quer adicionar um assunto específico ao e-mail é importante ter atenção e adicionar <code>%20</code> ou <code>+</code> em todo lugar que houver um espaço na linha do assunto. Uma forma fácil de garantir que o assunto está adequadamente formatado é usar um <a href="https://meyerweb.com/eric/tools/dencoder/">decoder/encoder de URL</a>.</p><h4 id="adicionando-o-texto-de-corpo-do-e-mail-"><strong>Adicionando o texto de corpo do e-mail<strong><strong>:</strong></strong></strong></h4><p>De forma semelhante, você pode adicionar uma mensagem específica na parte reservada ao corpo do e-mail: novamente, espaços devem ser substituídos por <code>%20</code> ou <code>+</code>. Depois do parâmetro <code>subject</code>, qualquer parâmetro adicional precisa ser precedido por <code>&amp;</code>.</p><p>Exemplo: digamos que você queira que os usuários enviem um e-mail para seus amigos sobre seu progresso no freeCodeCamp:</p><p>Endereço: vazio</p><p>Assunto: Grandes novidades</p><p>Corpo: Estou me tornando um desenvolvedor</p><p>Agora o link do seu html:</p><pre><code class="language-html">&lt;a href="mailto:?subject=Grandes%20novidades&amp;body=Eu%20estou%20me%20tornando%20um%20desenvolvedor"&gt;Enviar e-mail!&lt;/a&gt;</code></pre><p>Aqui, deixamos o parâmetro <code>mailto</code> vazio (<code>mailto:?</code>). Isso abrirá o cliente de e-mail do usuário e ele vai adicionar o endereço do próprio destinatário.</p><h4 id="adicionando-mais-destinat-rios-"><strong>Adicionando mais destinatários<strong><strong>:</strong></strong></strong></h4><p>Da mesma forma, você pode adicionar os parâmetros <code>Cc</code> e <code>Bcc</code>. Separe cada um desses endereços por uma vírgula!</p><p>Parâmetros adicionais deverão ser precedidos por um <code>&amp;</code>.</p><pre><code class="language-html">&lt;a href="mailto:primeiroamigo@endereco.com?subject=Great%20news&amp;cc=segundoamigo@endereco.com,terceiroamigo@endereco.com&amp;bcc=quartoamigo@endereco.com"&gt;Enviar e-mail!&lt;/a&gt;</code></pre><h2 id="obrigado-por-usar-esta-refer-ncia-de-html-feliz-programa-o-">Obrigado por usar esta referência de HTML<strong>. </strong><br>Feliz programação<strong>!</strong></h2><p></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
