Curso Web Design Completo: HTML5, CSS3 e JS + 5 Projetos

Módulo JavaScript

Aula 164 - O que são variáveis e tipos de dados

Iniciando com Javascript. A tag <script>, script interno, os comandos alert e prompt, criação de variáveis com var, atribuição de valores em variáveis com '=' e concatenação com '+'.
Tipos de variáveis: texto, numero, booleano, array, objeto, null, undefined e NaN.

Aula 165 - Conversão entre tipos

Identificando o tipo dos valores com typeof, utilizando o comando parseInt() e parseFloat() para converter string para numero.

Aula 166 - Exercício proposto

Exercício.

Aula 167 - Resolução do exercício.

Solução do exercício. Explica como utilizar a concatenação entre string e uma operação matemática. No meu exercício eu criei variáveis para fazer a operação, na solução ele fez os cálculos diretamente na saída do alert.

Aula 168 - Operadores aritméticos.

Operadores aritméticos, precedencia de operações.

Aula 169 - Mais operadores aritméticos.

Operadores aritméticos, '%' (módulo), '**' (exponenciação), '++' (incremento) e '--' (decremento). Lembre que a posição do operador de incremento e decremento em relação a variável influencia no resultado.

Aula 170 - Exercício proposto.

Exercício

Aula 171 - Resolução do exercício proposto.

Solução do exercício. Praticando os operadores e entendendo melhor a concatenação.

Aula 172 - Operadores de comparação.

Operadores de comparação, '==' (igualdade valor), '!=' (diferença valor), '===' (igualdade valor e tipo), '!==' (diferença valor e tipo), '>' (maior), '<' (menor), '>=' (maior ou igual), '<=' (menor ou igual).

Aula 173 - Operadores de comparação - parte 2.

Solução do exercício proposto na aula anterior.

Aula 174 - Controle de decisões.

Utilização de if else.

Aula 175 - Exercício proposto.

Utilização da função Math.random() para gerar números aleatórios entre 0 e 1. Explicação do enunciado do exercício.

Aula 176 - Resolução do Exercício.

Resolução do exercício anterior. Meu programa ficou igual ao do professor com a diferença da forma de seleção.

Aula 177 - Operadores lógicos.

Operadores lógicos '!' (not), '&&' (and) e '||' (or).

Aula 178 / Aula 179 - Exercício proposto. / Resolução do execrcício.

Exercício com operadores lógicos.

Aula 180 / Aula 181 - Exercício proposto. / Resolução do execrcício.

Exercício com operadores lógicos.

Aula 182 - Switch...case

Utilizando o operador switch...case. (Não esquecer o break

Aula 183 - Repetindo ações

Criando laços de repetição com while. Aqui foi utilizada a função document.write() para imprimir os dados na tela.

Aula 184 - Tipos de loops

Laços do tipo do...while e for.

Aula 185 / Aula 186 - Exercício Proposto / Resolução do Exercício

Laços do tipo do...while e for.

Aula 187 / Aula 188 - Exercício Proposto / Resolução do Exercício

Exercícios com laços.

Aula 189 / Aula 190 - Exercício Proposto / Resolução do Exercício

Exercícios com laços.

Aula 191 - Breve introdução à inserção de conteúdo HTML

Para selecionarmos elementos em HTML através do Javascript devemos atribuir a uma variável a função document.querySelector('elemento_selecionado') onde elemento_selecionado pode ser qualquer elemento HTML (tag, id, class). Com essa variável atribuida podemos inserir os dados utilizando o comando nome_da_variável.innerHTML = 'valor_a_ser_inserido'.

Aula 192 - Atrelando funções à eventos disparados por elementos no HTML

Utilizando o evento onclick na tag <button> para chamar uma função.
Criando funções com o comando function. A sintaxe é function nomeDaFuncao(){ código a ser executado }.
Podemos chamar a função a qualquer momento do código invocando seu nome ou através do evento onclick='nomeDaFuncao()'.

Aula 193 - Função void: Reaproveitamento de códigos

Implementando as funções dos botões para executar uma tabuada e para limpar os resultados apresentados.
Rever essa aula.

Aula 194 - Exercício Proposto

Criar uma calculadora de operações básicas utilizando funções e manipulação HTML.

Aula 195 - Resolução do Exercício

Resolução do exercício calculadora. Nesse exercício foi criada uma função para exibir os resultados, que eu não fiz na minha solução. No mais tudo igual.

Aula 196 - Funções que recebem parâmetros

Passando parametros em funções para realizar operações.

Aula 197 / Aula 198 - Exercício proposto / Resolução do exercício proposto

Para a execução deste exercício foi utilizado o switch para interpretar a string do operador matemático e executar a operação matemática.

Aula 199 - Funções que retornam valores

Criação de uma rotina para cálculo de área. Aqui passamos as variáveis para dentro da função dos botões, assim passa a ser necessário passar os valores na função de cálculo da área pois as veriáveis passam a ser locais e não mais globais.

Aula 200 - Exemplo: melhorando a nossa mini calculadora

Mudança das variáveis no script da calculadora.

Aula 202 - Bloco try...catch (erro)

Utilizando a função isNaN(). Criando um lógica para verificar os dados inseridos.
Aplicando a fução throw new Error('mensagem') retorna uma mensagem no console e para a execução da função..
Já com o código try...catch podemos fazer uma verificação (try) diretamente na função, retornando em erro (catch) caso a função não possa ser executatda. Podemos aplicar um return no bloco catch para retornar a execução do script sem fazer nada (apenas mostrar o erro caso ele seja tratado).

Aula 203 - Exercício proposto

Exercício proposto

Aula 204 - Resolução do exercício proposto

Resolução do exercício proposto. Na resolução foi feito o tratamento em caso de não ser digitado nenhum valor (valores undefined).
Outra coisa é que o retorno da função deve ficar fora do bloco try...catch. Foi atribuido o valor de 'e' (variável de erro) para o resultado da operação (variável 'area'), assim a mensagem de erro aparece no resultado da função.

Aula 205 - Arrays

Criando conjunto de variáveis com var nomeDaArray = new Array(). Para inserir dados na array podemos utilizar o indice da Array atravé de nomeDaArray[i] = valor a ser incluido ou com o método nomeDaArray.push('valor a ser incluido').

Aula 206 - Iterar sobre arrays

Criando uma array com var nomeDaArray = new Array(), adicionando itens na array com nomeDaArray.push() e mostrando os itens da array na tela com strings separadas utilizando um laço for, a propriedade nomeDaArray.length para saber o tamanho da array e concatenando os dados para apresentação no loop utilizando nomeDaArray[i].

Aula 207 / Aula 208 - Exercício Proposto / Resolução do exercício proposto

Usando a função var nomeDaVariavel = new Date() para receber a data atual e o método nomaDaVariavel.getDay() para receber o numero do dia da semana (de 0 - domingo a 6 - sábado).

Aula 209 - Exercício Proposto

Exercício proposto, fazer a soma dos números pares de um array.

Aula 210 - Resolução do exercício proposto

Resolução do exercício do modo normal. Depois foi convertida a resolução através de função.

Aula 211 - Objetos e propriedades de objetos

Utilizando objetos com a sintaxe literal. Criamos primeiro o objeto, depois atribuimos as propriedades do objeto. da seguinte forma:
var nomeDoObjeto = new Object(). depois atribuimos as propriedades nomeDoObjeto.nomeDaPropriedade=valor.

Aula 212 - Exercicio proposto - Resolução e explicação sobre o que são métodos de um objeto.

Criando um objeto com tres propriedades (nome, preco e estoque).
Em seguida foi criada um método com uma função produto que apresenta no console a mensagem 'comprou caneta'. Em seguida utilizou-se a palavra chave this.propriedade para se referir ao objeto.

Aula 213 - Grande quantidade de dados - array de objetos.

Para criar arrays em Javascript podemos utilizar duas formas:
var nomeDoArray = new Array(); ou:
var nomeDoArray = ['primeiroItem', 'segundoItem'].
Para objetos da mesma forma podemos utilizar:
var nomeDoObjeto = {'propriedade1': 'valorDaPropriedade1', 'propriedade2': 'valorDaPropriedade2'}.
Podemos chamar os itens do objeto da seguinte forma:
nomeDoObjeto.propriedade1. Podemos por fim criar uma array de objetos da seguinte forma: var nomeDaArray = [{'propriedade1': 'valorDaPropriedade1', 'propriedade2': 'valorDaPropriedade2'},{'propriedade1': 'valorDaPropriedade1', 'propriedade2': 'valorDaPropriedade2'}]
Nesse caso chamamos os objetos pelo indice do array da seguinte forma:
nomeDaArray[i] para chamar o objeto inteiro ou nomeDaArray[i].propriedade1 para mostrar apenas o valor da propriedade no indice selecionado.

Aula 214 - Exercício proposto.

Exercício sobre arrays

Aula 215 - Resolução do Exercício proposto.

Na resolução do exercício foi utilizada a criação das arrays de modo formal. O loop foi feito com while e não com for.

Aula 217 / 225 - Javascript

Introdução ao javascript, história; sintaxe; case-sensitive; tipos de variáveis (var, let, const); arrays, objetos; declaração de variáveis e atribuição de valores; tipos de valores primitivos (string, número, boolean, Null, NaN, undefined, Infinity (valores entre -ne308 e ne308)); escape (utilizar a '\' para utilizar caracteres reservados); objeto 'global' (window, global) e this.
Ferramentas para debug de código: console.log(). Utilizando break point no developer tools do chrome (Sources). A palavra reservada debugger (para a execução do código no browser).
Orientação a objetos: método = funções; propriedade = variáveis

Aula 226 - Funções literais, de primeira classe e callbacks.

Criando funções literais, utilizando funções como objeto de primeira classe (atribuindo propriedade como se fosse um método), criando funções anonimas e chamndo a função através do nome da variável.
Podemos passar uma função como parametro de outra função. Podemos utilizar o parametro nomeDaFuncao.name para saber o nome da função.

Aula 227 - Escopo local

Entendendo a variável dentro e fora do escopo da função. Se atribuimos uma variável global (fora do escopo da função) e atribuirmos um valor para ela dentro da função com o valor precedido pela palavra var o valor atribuido tem escopo local (apenas na função) não repercutindo fora dela. Já se simplesmente atribuirmos o valor diretamente na variável, seu valor passa a ser considerado globalmente. Já se criarmos uma variável dentro de uma função sem ser precedida pela palavra var essa variável e seu valor ficam com escopo global.

Aula 228 - Funções autoexecutáveis e propriedade arguments

Devemos evitar utilizar variáveis no escopo global. Podemos criar funções autoexecutáveis com a seguinte sintaxe:
(function(){ var isValid = false; })();
As funções autoexecutáveis tem como propósito "encapsular" as variáveis de modo que elas não sejam declaradas no escopo global.
Quando queremos restringir o uso incorreto de variáveis dentro de funções podemos utilizar a string 'use strict'. Com essa string a função não vai aceitar variáveis sem declaração de tipo. Não devemos usar o 'use strict' fora da função pois ele var ser aplicado em todas as variáveis, inclusive de códigos de terceiros.
Podemos passar vários parametro para uma função através de um array, mas podemos utilizar também propriedade arguments. A propriedade arguments funciona como se fosse uma variável do tipo array, sem precisarmos declarar como array.

Aula 229 - IIFE - Exercício proposto

Texto explicando a necessidade de utilizar as funções auto-invocáveis. Segundo o texto elas só são ncessárias quando desenvolvemos o Javascript para ser executado diretamente no browser diretamente no objeto window, Se desenvolvemos para NodeJS ela não é necessária.
Aqui está minha resolução do exercício calcular média.

Aula 230 - Problema: Calcular média

Resolução do exercício Calcular média pelo professor. Nesta resolução foi utilizado o loop while e não o for como eu utilizei. Aqui utilizando o loop while ocorreu um problema. Como o while faz o teste diretamente no valo do argument, quando este valor é '0' ele retorna 'false' para o while, parando a execução do loop. Foi utilizado um type of arguments[x] === 'number' para forçar o while a interpretar o '0' como número e não como 'false'.

Aula 231 - Resolução do desafio.

Minha resolução para o exercício está correta, entretanto foi feita uma resolução de outro modo.
Na solução do professor foi criada uma função de 'callback' para chamar a função que retorna a string de classificação do imc.
Para este exemplo ver o código resolvido e se necessário reassistir a aula a partir de 11:23

Aula 232 - DOM - parte 1

Introdução ao DOM (Document Object Model) e elementos que o compõe.

Aula 233 / Aula 234 - DOM - parte 2 / DOM - parte 3

Todas essas propriedades foram trabalhadas diretamente no navegador com o DevTools.
Todos os elementos do HTML estão contidos em um objeto chamado document. Podemos acessar os elementos através desse objeto, por exemplo:
document.getElementById('nomeDaId') (seleciona o elemento pelo id)
document.getElementById('nomeDaId').textContent = 'novo texto' (altera o conteúdo do elemento selecionado)
document.getElementsByClassName('nomeDaClasse) (seleciona o elemento pela classe mas nesse caso em uma "array" de elementos, portanto deve ser chamado cada elemento pelo indice independente de ter apenas um elemento)
document.getElementsByClassName('nomeDaClasse)[i].textContent = 'novo texto' (altera o conteudo do elemento selecionado no indice selecionado).
document.getElementsByTagName('nomeDaTag') (funciona da mesma forma que o getElementsByClassName).
querySelector e querySelectorAll utilizam a mesma sintaxe de seletores e seletores avançados do CSS. O querySelector seleciona apenas 1 elemento mesmo que tenha mais elementos iguais. Já o querySelectorAll se comporta como o getElementsByClass e necessita do valor de indice.

Aula 235 - Manipular o DOM numa página HTML

Aqui demonstra-se por que não devemos utilizar o <script> no início do HTML. Como a leitura do documento HTML é feita de forma sequencial caso utilizemos o script antes da execução do HTML se manipularmos algum elemento do DOM antes dele ser interpretado o resultado será null.

Aula 236 - DOM - problema 1

Problema para exibir uma mensagem na tela. Atenção para as sintaxes (utilização de parenteses, aspas, pontuação e concatenação).

Aula 237 - DOM - problema 2

Quando utilizamos a propriedade textContent inserimos no documento texto puro, dessa forma se inserirmos uma tag dentro do valor a ser apresentado teremos a tag escrita na tela.
Para renderizarmos código HTML na saída devemos utilizar a propriedade innerHTML.

Aula 238 - DOM - problema 3

Não devemos utilizar nomes de variáveis iguais ao nome de id quando estamos trabalhando com o DOM pois os consoles podem considerar a id e não a variável.
Algumas considerações sobre declaração de variáveis:
Quando declaramos uma variável dentro de uma função (no caso um IFFE) esta variável não pode ser acessada fora da função. Para que ela possa ser acessasda fora podemos utilizar três maneiras. Uma delas é declarando a variável diretamente fora da função, tornando a variável de escopo global. A segunda forma é não declarar com var mas sim com window.nomeDaVariável. A terceira forma é declarar a variável fora da função sem atribuir nenhum valor e posteriormente atribuir o valor dentro da função utilizando a propriedade 'use strict' dentro da função para o valor ficar restrito a função.
Utilização do atributo value das variáveis. Neste exemplo retiramos a função IFFE para simplificar o código. Atenção para o posicionamento correto das variáveis nas funções, de acordo com o momento que precisamos utilizar os valores.

Aula 239 / Aula 242 - DOM - problema 4 / DOM - problema 4 - parte II

É uma boa prática quando se manipula o DOM atribuir variáveis para as referencias aos objetos. Quando fazemos esse tipo de referencia podemos utilizar o caractere '$' no início do nome da variável.
A propriedade value recupera e insere novo valor em campos de formulário.
Portanto as propriedades textContent, innerHTML e value podem tanto coletar como inserir informações nos campos. Para isso basta no caso de recuperar a informação utilizar a sintaxe:
var nomeDaVariável = document.querySelector('#idSelecionada').textContent (ou value ) Para setar o valor utilizamos: document.querySelector('#idSelecionada').querySelector = novoValor (ou value).
Na parte II deste exercício foi utilizada a propriedade disabled atribuida pelo código Javascript. Para isso a sintaxe é:
document.querySelector('#idSelecionada').disabled = true / false Podemos também utilizar a propriedade readOnly da seguinte forma:
document.querySelector('#idSelecionada').readOnly = true / false Ver texto da Aula 242 para informações sobre a diferença de sintaxe nas propriedades HTML / Javascript.

Aula 244 / Aula 245 - DOM - problema 5 / DOM - problema 5 - parte II

Criação da tabela utilizando o Bootstrap. Para a estilização da tabela foi utilizada apenas a classe class=table na div <table>.
Parte do Javascript:
Aqui o negócio começa a pegar!!!
Consegui entender a execução do código, mas preciso como pensar nessa lógica.
Foi reutilizada a função de média da Aula 229, aproveitada em um arquivo .js externo chamado 'beluga.js'.
Na lógica foi primeiramente criada uma variável chamada 'trs' que recebe os dados selecionados pela classe '.js-table tbody .aluno'. Esse seletor pega com a propriedade querySelectorAll todos os dados da tabela(classe '.js-table') dentro da div <tboby> (não pega os dados da div <thead>) na classe '.aluno' (podia ser a div <tr>) e armazena na variável trs. Após isso percorremos cada linha da tabela com um loop for(no exemplo o professor utilizou o while).
Com isso temos isoladas cada linha da tabela no 'array' de dados da variável 'trs'. Essas linhas são atribuidas a variável 'linhaAluno'
. Em seguida foram criadas as variáveis de notas ('n1', 'n2', 'n3' e 'n4') e de média ('media').
Criamos então uma variável 'tds' que vai isolar cada item de 'linhaAluno' em uma 'array' de dados indexada para cada item da linha.
Cada variável de nota (n1 a n4) vai receber o valor através de uma função que converte (string em número) os valores obtidos na variável 'tds' nos indices correspondentes a cada nota (indice 1 até 4 pois no indice 0 fica o nome do aluno).
Por fim armazenamos na variável 'media' o valor retornado pela função calculaMedia() (que está no arquivo beluga.js) que recebe como parametro os valores das variáveis n1 a n4. Esse valor é enviado para a tabela através de linhaAluno.querySelector('.aluno-media').textContent = media.

Aula 246 - DOM - problema 5 - parte III

Nesta aula foi feita uma otimização do código para que a recuperação dos dados de notas ficasse dinamico, ou seja, recupera as notas independente da quantidade de valores que estejam nas tabelas.
Foram apresentados aqui as propriedades push (para inserir dados em uma array), this (referencia um objeto), call (chama uma função), apply (chama uma função passando uma array como parâmetro).

Aula 247 / Aula 248 - Desafio / Resolução do desafio

Desafio de alteração de texto no DOM. Não esquecer de utilizar a função auto-invocável.

Aula 249 - Objetos Nativos

Demonstra alguns dos objetos nativos (ou primitivos) do Javascript como: String(), Number(), Boolean(), Object(), Array(). Todos eles podem ser instanciados com o comando new.

Aula 250 - Sintaxe literal, sintaxe formal e de ambientes de hospedagem

Objetos do ambiente são os objetos relativos ao meio de execução, no caso window ou document, onde podem ser invocados métodos como o alert.

Aula 251 - Construtores, o operador new e objetos passados por referência

Podemos instanciar os ojetos nativos do Javascript. Para instaciarmos objetos utilizamos o operador new. Quando instanciamos um objeto em uma variável, estamos gravando uma cópia deste objeto na variável. Uma vez que o objeto esteja instanciado podemos chamar seus métodos a partir do nome da variável.

Aula 252 - Objetos customizados, propriedades e métodos.

Não entendi essa aula. Preciso rever para tentar entender aonde ele quis chegar.

Aula 253 / Aula 254 - Criar um objeto customizado utilizando uma função construtora / O problema de não utilizar o operador new e como impedir que ele ocorra

Funções que criam instancias de objetos (construtoras) por convenção começam com letra maiuscula.
Criando objetos construtores com propriedades privadas utilizando var e com propriedades e métodos públicos (acessíveis) com o this.
Quando criamos uma instancia de um objeto sem utilizar a palavra reservada new passamos as propriedades do objeto diretamente para o window pois o this não fará referencia ao objeto utilizado mas sim ao objeto pricipal do meio.
Para evitarmos que a referencia principal dos elementos sejam a window podemos utilizar a função auto-invocável e o 'use-strict'. Dessa forma o que estiver dentro dessa função não fará referencia direta ao objeto principal. Entretanto os objetos ficarão restritos ao escopo da função. Para corrigir isso devemos atribuir o window para o objeto da função construtora e passa-lo como parametro para a função auto-invocável. Com isso não podemos instanciar novos objetos sem o new mas poderemos acessar o objeto no escopo global.

Aula 255 - Problema

Criando objetos de forma literal e apresentando os objetos no console. Referenciando o objeto utilizando a window[nomeDoObjeto] através da atribuição do nome do objeto a uma variável.

Aula 256 - Desafio

Criando um array com os objetos do problema e apresentando os nomes no console.

Aula 257 - DOM Level 0

Eventos Javascript podem ser acessados pelo usuário ou pelo navegador. Podem ocorrer de maneira padrão ou executados através de um Event Handler que é a função que é executada quando ocorre determinado evento. Temos dois tipos de event hadler de acordo com o DOM. Os events no DOM Level 0 e no DOM Level 2. As pricipais diferenças são na sintaxe. Na sintaxe no DOM level 0 os enventos iniciam com o prefixo 'on' (ex: onclick). Eventos no DOM Level 0 tem alguns problemas. Quando utilizamos o DOM level 0 não podemos chamar a função diretamente no código pois a função será executada antes da ação conforme se ve no exemplo.

Aula 258 - DOM Level 2

Quando utilizamos o DOM level 2 a sintaxe passa a utilizar o addEventListener('evento', função). Este handler pode ser utilizado mais de uma vez para o mesmo evento. Quando utilizamos o DOM level 0 isso não é possível.

Aula 259 - Propagação de eventos

Propagação de eventos é a capacidade de um evento de percorrer todos os elementos do body do documento. Quando criamos um addEventListener o evento será replicado, por padrão, para todos os elementos pais em ordem ascendente. No exemplo, ao clicarmos na span que está dentro de uma div que está no document, ela irá executar a função da span, a função da div e a função do document. Podemos mudar a ordem dessa propagação inserindo um último parametro true no addEventListener. Quando selecionado true a ordem de propagação será invertida.

Aula 260 - Objeto Event

Quando inserimos um objeto dentro da função do evento este objeto passa a ter varias propriedades e alguns métodos do evento que foi executado. Alguns exemplos de propriedades que podem ser acessadas podem ser vistas no exemplo. Entre os métodos que podem ser acessados está o stopPropagation() que para a propagação do evento estudada acima.

Aula 261 - Delegação de eventos

Ao criarmos uma variável para selecionar vários elementos iguais com querySelectorAll criamos uma NodeList de elementos desta forma não podemos acessar os elementos individuais com o addEventListener. Para resolver esse problema, podemos criar um loop para percorrer todos os elementos do NodeList. Podemos também aplicar o addEventListener na variável que referencia a <ul> e nesse caso utilizar a propriedade target. No exemplo vemos que as propriedades this e currentTarget retornam a <ul> inteira com toadas as <li> contidas nela. Já a propriedade target retorna só o elemento clicado.
Podemos utilizar a propriedade target.nodeName para pegar o nome do elemento HTML que foi clicado. Assim podemos fazer a lógica necessária para o problema.

Aula 262 - Problema - Validar formulário de login ao clicar no botão enviar.

Criar um formulário para entrada de usuário e senha e um botão para validar a entrada de dados. O botão vai ser ativado através de um addEventListener que vai executar uma função com um if que irá testar se as variáveis atribuidas aos campos de entrada de dados estão vazias (nada foi digitado nos inputs). Esse teste deve ser feito na propriedade value das duas variáveis e não apenas na variável.
Aqui uma coisa interessante: Quando criamos a expressão $txtUser.value === '' estamos dizendo que se o valor da string for vazio deve retornar um valor booleano true ou false. Acontece que qualquer valor de string que não seja vazio retorna true. Portanto podemos fazer uma negação do valor da variável como teste para o if. Caso seja negativo (não haja valor) o resultado será falso.

Aula 263 - Problema - Validar formulário de login no submit do form.

Aqui fizemos a alteração do <button type="button"> para <button type="submit">.
Quando utilizamos o type='submit' ao invés do type='button' o código faz o envio dos dados do formulário (lembrando, podemos ver as informações na barra de endereço).
No exemplo o que se tenta mostrar é que o evento está vinculado ao click do botão e não ao evento de enviar o formulário. O problema é que alguns browsers podedm não interpretar, por exemplo a tecla ENTER pressionada. Para evitar esse tipo de problema ao invés de monitorarmos com o addEventListener o botão, monitoramos o evento submit no formulário (variável que recebe o querySelector('form')).
Como no type='submit' as informações são enviadas na URL, mesmo que tenhamos false na verificação de um dos campos as informações serão enviadas por default após a mensagem de alerta. Para evitar o comportamento padrão devemos informar um evento na função e utilizar o método preventDefault(). Com isso caso a verificação seja false nenhuma informação será passada por padrão.
Lembrando mais uma coisa. Para evitar que as informações sejam passadas na URL quando utilizamos o submit devemos incluir no <form method='POST'>.

Aula 264 / Aula 265 - Problema - Contador de caracteres de um textarea - parte 1 / parte 2

Neste exemplo faremos a contagem de caracteres utilizando eventos de teclado utilizando keypress, keyup e keydown. Note que neste exemplo não utilizamos a função anonima no addEventListener mas sim funções nominais separadass. O resultado é o mesmo.
As diferenças entre esses eventos é: O keypress só é verificado quando pressionamos caracteres, ou seja não monitora teclas como shift, ctrl, alt, etc.
O problema de utilizar esses eventos para contar caracteres é que ele só funciona se o texto for digitado. Se copiarmos e colarmos um texto no <textarea> não serão contados os caracteres (quando selecionamos o texto colado e apertamos a tecla Delete o retorno do keydown é o texto deletado). .
Para contornar esse problema podemos utilizar o evento input que irá retornar o conteúdo do <textarea> independente da forma que foi inserido no campo. (retorna uma string do que foi digitado ou inserido).

Aula 266 / Aula 267 - Problema - Contador de caracteres de um textarea - parte 3 / parte 4

Limpeza do código anterior utilizando o evento input para aquisição dos dados. Criação das variáveis e da função para contagem dos caracteres utilizando as propriedades value e length.
Para limitar a quantidade de caracteres no valor do indicado na variável máxima pensei em criar uma rotina if, mas foi utilizado apenas a propriedade HTML maxlength diretamente na tag <textarea>. Em seguida para automatizar o processo foi alterado valor da variável maxima de um valor fixo para a propriedade maxlenght utilizada no HTML. Atribuimos o valor dessa variável utilizando var maxima = nomeDaVariavelAtribuidaAoElemento.maxLength lembrando que a propriedade em HTML é toda em minuscula e no Javascript é em 'camel case'.
A seguir temos o conceito de 'Progressive Enhancement', que é garantir um código funcional (primeiramente em HTML puro) para depois incluir pouco a pouco as outras melhorias, evitando que o código quebre caso não rode o CSS ou o Javascript. Para isso primeiro ocultamos o contador com o style = "display: none;". Em seguida criamos a variável de referencia no documento para a id do elemento que foi ocultado e reexibimos o elemento via Javascript utilizando a propriedade style.display com o comando nomeDaVariavelAtribuidaAoElemento.style.display = 'block';.

Aula 268 - Problema - Contador de caracteres de um textarea - parte 5

Algumas otimizações no código. Criação de uma função para substituir a apresentação e cálculo de caracteres. Conversão dos valores recebidos nas variáveis maxima e numeroLetrasDigitadas para inteiros com parseInt(), pois apesar de o Javascript fazer a conversão e o cálculo, por padrão os dados adquiridos vem como string. Por fim criada uma função para mostrar o texto de resta caracteres.

Aula 269 - Problema - impedir o envio de formulário sem aceitar os termos do contrato

Para resolver esse problema, primeiramente fizemos uma lógica com if. Entretanto conforme pode ser visto nos comentários do código podemos resumir esse procedimento utilizando apenas a lógica e objetos.
O segundo problema levantado é que a lógica só funciona depois da mudança (change) pois o botão estava setado para estar 'disabled' por padrão. Resolvemos isso vinculando o estado do botão ao estado do checkbox.
Por fim criada uma função para fazer o teste do checkbox e habilitação do botão. Essa função foi criada de duas formas. Retornando o estado do checkbox e fazendo a atribuição no código ou sem retorno fazendo a atribuição dentro da função.

Aula 270 - Problema - atribuir eventos a uma nodeList

Criar uma coleção de botões, fazer uma nodeList com os botões através do getElementByTagName e recuperar o conteudo das tags <button> com um loop e a propriedade addEventListener e uma função que mostra o textContent do objeto 'this'.

Aula 271 - Problema - Lista de tarefas - parte 1

Neste exemplo criamos uma lista fixa com três elementos e queremos ter a opção de adicionar elementos em um input após clicar um botão. Fizemos um addEventListener no botão para receber o valor digitado no <input>. Esse valor foi atribuido a uma variável que concatena a seguinte string ' "<li>" + variávelDoInput.value + "</li>" '. Essa string é adicionada a <ul> com o método innerHTML entretanto se for atribiudo o valor diretamente ele sobreescreve a lista inicial. Podemos solucionar isso somando a variável que recebe o valor da string com o conteudo do innerHTML que já está na <ul>. Feito isso atribuimos um valor vazio para a variável de input para limpar seu conteúdo após o evento e colocamos o foco novamente nele com o método focus().

Aula 272 - Problema - Lista de tarefas - parte 2

Retirando a função de adicionar tarefas na lista de dentro addEventListener. Em seguida vamos monitorar com o addEventListener o evento keyup do <input>. Para isso criamos uma função para verificar que tecla foi pressionada e vamos monitorar a propriedade keyCode.
A propriedade keyCode, retorna o código da tecla pressionada.
Com isso fazemos um teste para monitorar o valor da tecla pressionada. Se o valor for igual ao valor de ENTER (13), chamamos a função de adicionar tarefas.

Aula 273 - Problema - Lista de tarefas - parte 3

Criando uma função para monitorar o clique nos itens das <li>.
Para inserir o atributo de checked nos itens vamos cirar uma classe para quando o item for clicado. Para isso utilizaremos o método classList. Esse método pode ter as propriedades add, remove e toggle. A propriedade toggle alterna o estado do método (add / remove). Sempre verificar a compatibilidade dos navegadores com esse método.
Utilizando esse método, são adicionadas classes em cada item que passa a ser manipulado através de um estilo CSS.

Aula 274 - Problema - Lista de tarefas - parte 4

O problema de utilizarmos o innerHTML é que quando ele atua no DOM ele faz com que se percam os 'listeners' ou seja, quando ele adiciona um elemento no HTML ele o está reescrevendo, perdendo a referencia. Desse modo o innerHTML não é mais usado.
Outra forma de adicionar elementos no HTML é com os métodos createElement('nomeDoElemento') que cria novas tags no DOM e com createTextNode(origemDoTextoASerInserido). Estes métodos criam os novos elementos na memória. Para inclui-los no DOM utilizamos o método appendChild(elementoCriado), onde o elementoCriado são os elementos criados com os métodos createTextNode e createElement.

Aula 275 - Problema - Lista de tarefas - parte 5

Criada um nova função para adicionar as <li> no addEventListener. Essa função substitui também a instrução que cria a nodeList no loop for.
O problema agora fica com a performance, pois para cada item adicionado criamos um novo 'listener' que ficará na memória.

Aula 276 - Problema - Lista de tarefas - parte 6

Para resolver o problema acima utilizaremos a delegação de eventos. Não vamos mais utilizar os 'listeners' nas <li> mas sim na <ul>.
Criamos então o listener na variável que aponta para a <ul> e fazemos um teste para verificar se o elemento clicado foi realmente uma <&ligt.

Aula 277 - Problema - Lista de tarefas - parte 7

Aqui foi criada uma nova função para excluir o valor da <li> ao invés de riscar o item. Assim não precisamos mais incluir uma classe ao evento. Para excluir o valor da <li> devemos seleciona-la no elemento pai com a propriedade parentNode. Feito isso, removemos o item com o método removeChild().

Aula 278 / Aula 279 - Desafio - Explicação / Resolução

Esse desafio possui os arquivos html e css prontos. O objetivo é apenas criar um pequeno código Javascript para mostrar o menu hamburgger quando seu icone for apresentado (através da media query já definida). Não consegui nem começar. Fiquei focado no html e css e a solução é mais simples. Para resolver esse desafio basta criar as variáveis para o querySelector da tag <html> e da classe .header-nav__hamburgger (classe definida para o elemento button).
Feito isso fazemos a leitura do 'click' no button com o addEventListener e passamos uma função para adicionar a classe menu-opened na tag <html> com o classList.toggle.
Por fim o desafio era apenas incluir a classe na tag html.
Explicação extra: Na tag <html> do exercício tem uma classe chamada js. Essa classe na verdade era para ser no-js que é feita para ser utilizada quando o arquivo Javascript não for carregado pela página. Quando isso ocorre o menu aparece de forma automática e sem maipulação. Quando o arquivo Javascript é carregado normalmente essa classe é alterada para js e ativa através das classes todas as propriedades css relacionadas. Essa parte eu acertei sozinho.

Aula 280 - Usar Javascript para melhorar a acessibilidade do hamburguer menu

Nesta aula fizemos o set de uma propriedade chamada aria-expanded através do aria-controls (as duas propriedades estão contidas na documentação da W3C nesse link W3C Web Accessibility Initiative - Accessible Rich Internet Aplications e pelo visto tem relação com padrões para acessibilidade para pessoas com defeciencia).
A propriedade foi acessada com o método getAttribute e foi inserida nas tags/ids com o método setAttribute.

Aula 281 - Strings - Métodos e propriedades

As strings podem ser atribuidas de modo literal (diretamente com a sintaxe var nomeDaString = 'string'; ou pelo modo formal (como um objeto pela sintaxe var nomeDaString = new String('String');.
As string possuem métodos e propriedades: length, replace(), indexOf(), lastIndexOf(), slice(), substring(), split(), toLowerCase(), toUpperCase(), valueOf().

Aula 282 - Strings - Problema: formatar nome completo

Separar nomes compostos e reescrever no padrão 'Sobrenome, Pre-Nome' utilizando os métodos e propriedades de string. Exixtem outra maneiras mais fáceis de fazer isso (talves utilizando o split().

Aula 283 - Strings - Desafio - resolução

Na minha resolução utilizei o innerText o correto seria utilizar o innerHTML pois o primeiro ignora as tags internas do parágrafo caso existam.

Aula 284 - Number - Métodos e propriedades

Os numeros podem ser atribuidos de modo literal (diretamente com a sintaxe var meuNum = 123; ou pelo modo formal (como um objeto pela sintaxe var meuNum = new Number('123');.
Os numbers possuem métodos e propriedades: MAX_VALUE, MIN_VALUE, toFixed(), toPrecision(), toString() e toExponential(). MAX_VALUE e MIN_VALUE são propriedades estáticas e apresentam os números máximo e mínimo que o Javascript consegue manipular. Não pode ser utilizada com variáveis, apenas com o objeto 'Number'.

Aula 285 - Number - Desafio - resolução

Utilizando o método toFixed() para fazer o arredondamento do cálculo de média.

Aula 286 - Math - Métodos e propriedades

Utilizando o objeto Math. Alguns métodos são: min(), max(), round(), floor(), ceil(), pow(), sqrt() e random(), além de outros.

Aula 287 - Math - Problema - Função sortear

Nesse problema eu utilizei a propriedade Math.random() e .toFixed() para fazer o arredondamento. Na solução do problema foi utilizado o método Math.floor() para fazer o arredondamento para baixo.

Aula 288 - Math - Problema - Função sortear

No desafio utilizei a mesma lógica, porém apliquei a imagem em uma <div> dentro da página como uma <img>. Na solução do desafio foi utilizado o estilo background para colocar a imagem no fundo da tela. Uma das soluções propostas para quando tivermos numeros variáveis de imagens é criar um array com os nomes das imagens e consultar o lenght desse array para passar como parametro para a função.
Lembrete sobre style em Javascript. Quando utilizamos estilos CSS no Javascript devemos alterar o nome da propriedade para camel-case por exemplo: CSS = background-image; JS = backgroundImage / CSS = margin-top; JS = marginTop.

Aula 289 - Arrays - Métodos parte 1

Métodos de arrays:
Nesta aula: length, every(), some(), filter(), forEach(), indexOf(), lastIndexOf().

Próximas aulas: map(), concat(), join(), pop(), push(), reduce() e reduceRight(), reverse(), shift(), slice(), splice(), unshift(), toString()

Aula 290 - Arrays - Métodos parte 2

Métodos de arrays:
Aula anterior: length, every(), some(), filter(), forEach(), indexOf(), lastIndexOf().

Nesta aula: map(), concat(), join(), toString().

Próximas aulas: pop(), push(), reduce() e reduceRight(), reverse(), shift(), slice(), splice(), unshift()

Aula 291 - Arrays - Métodos parte 3

Métodos de arrays:
Aulas anteriores: length, every(), some(), filter(), forEach(), indexOf(), lastIndexOf(), map(), concat(), join(), toString().

Nesta aula: pop(), push(), shift(), unshift().

Próximas aulas: reduce() e reduceRight(), reverse(), slice(), splice()

Aula 292 - Arrays - Métodos parte 4

Métodos de arrays:
Aulas anteriores: length, every(), some(), filter(), forEach(), indexOf(), lastIndexOf(), map(), concat(), join(), toString(), pop(), push(), shift(), unshift().

Nesta aula: reduce() e reduceRight(), reverse().

Próximas aulas: slice(), splice()

Aula 293 - Arrays - Métodos parte 5

Métodos de arrays:
Aulas anteriores: length, every(), some(), filter(), forEach(), indexOf(), lastIndexOf(), map(), concat(), join(), toString(), pop(), push(), shift(), unshift(), reduce() e reduceRight(), reverse().

Nesta aula: slice(), splice().

Aula 294 - Arrays - Problema - Reprovar aluno se tirou ao menos uma nota zero.

Foi utilizado o programa de médias da aula 246 para aplicar a resolução do problema.
Fizemos o teste das notas utilizando o método some() na array de notas de cada aluno e retornando true quando nota === 0.
Feito essa verificação primeiro utilizamos um if/else para incluir a string reprovado em caso de nota 0 ou calcular a média caso não tenham notas 0. Em seguida refatoramos algumas expressões do código e por fim substituimos tudo por um código ternário.
Para lembrar:
Código ternário faz o teste utilizando a seguinte sintaxe:
variavel = expressão ? bloco verdade : bloco mentira

Aula 295 - Spoiler 1 - Spread Operator

Utilizando o spread operator para passar os valores de um array com parametros para a função. Sem o spread operator precisamos utilizar o métodoapply() para poder passar o array.

Aula 296 - Spoiler 2 - Arrow function

Podemos reduzir a sintaxe da função retirando o nome function, as chaves e o return utilizando uma arrow function ' => '.

Aula 297 - Desafio - Mostrar somente 10 palavras

Minha resolução do desafio.

Aula 298 - Desafio - Resolução

Importante. Aqui o professor fala que precisa colocar o addEventListener quando o script está no <head> do HTML, não é necessário quando está no final.
Importante. Quando utilizamos o innerHTML com o Prettier temos problema na aquisição dos espaçamentos aplicados na formatação do código. Preciso verificar como resolver isso.

Aula 299 - Resolução do desafio Aula 299 - Resolução do desafio (professor)

Apesar de eu ter utilizado a propriedade className na minha resolução, aqui ele apresenta essa propriedade. A propriedade className substitui a classe que já está no HTML ou caso seja utilizado com o operador '+=' concatena a string digitada com o nome da classe já existente.
Na resolução ele utiliza o método indexOf diretamente no laço que cria a array. Para fazer o teste é utilizado o operador ternário (tinha penasdo nisso na minha resolução) e utiliza o método toLowerCase para universalizar o filtro (também ia fazer isso).

Aula 300 - Date - Métodos

Métodos de Date:
getDay(), getFullYear(), getHours(), getMilliseconds(), getMinutes(), getMonth, getSeconds, getTime(), setDate(), setDay().
Os valores apresentados com os métodos de Date são considerados quando o objeto Date é instanciado. Assim se instanciarmos o Date e não recarregarmos o objeto os valores apresentados podem estar atrasados.

Aula 301 - Date - Problema: contagem regressiva para meu aniversário

Neste problema fiz de um jeito um pouco diferente sem muitos detalhes como a resolução final, mas a idéia ficou bem parecida.

Aula 302 / Aula 303 - Date - Desafio / Resolução

Resolução do desafio.

Aula 304 - Temporizadores - Adiando execução e entendendo a natureza single thread do Javascript

Métodos de temporizadores:
setTimeout(fn, ms), clearTimeout(id), setInterval(fn, ms), clearInterval(id).
Importante: esses métodos só funcionam na execução no browser. Eles não funcionam em nodeJS.
Podemos utilizar o setTimeout e o setInterval diretamente no código. Entretanto se atribuirmos esse métodos a variáveis essas variáveis vão receber um valor identificador. Esse identificador pode ser utilizado como parametro dos métodos clearTimeout() e clearInterval().
Em seguida é feito um loop para travar a execução do Javascript para mostrar que ele é single tread, ou seja, ele executa um processo por vez.

Aula 305 - Temporizadores - Problema banner popup

Foi criado um banner simples com position: absolute e utilizando um box-shadow para encobrir a tela.
A apresentação do banner é feita alterando a propriedade display: none para display: block chamado na função mostraBanner. Foram utilizados dois setTimeout uma para a função mostraBanner e outro para a função escondeBanner. O setTimeout da função escondeBanner foi incluido na função mostraBanner para evitar que a fila de execução anterior a esta função atrapalhe o tempo de execução.

Aula 306 - Temporizadores - Desafio

O ponto que eu não consegui pensar nesse desafio foi que a função que devemos utilizar no setTimeout() é uma função anonima que, esta sim, vai chamar a função que mostra a hora. Desse modo a cada 1000ms a função anonima definida em setInterval() chama a função mostraHora() que atualiza o valor de tempo.

Aula 307 - Temporizadores - Desafio 2

Neste exemplo o setInterval sozinho poderia fazer a contagem de tempo do cronometro, entretanto o single thread do Javascript pode gerar falhas na contagem de tempo, portanto devemos utilizar o objeto Date().
Minha resolução (falta refatorar).

Aula 308 / Aula 309 - Temporizadores - Desafio 2 - Parte 1 / Parte 2

Criação da função de iniciar o cronometro e formatação dos valores para o padrão mm:ss:ccc.

Aula 310 a 312 - Temporizadores - Desafio 2 - Parte 3 a 5

Criação das funções dos botões pausar e limpar(parar). Ajustes nas funções de parar, iniciar e limpar para funcionarem de forma correta.

Aula 313 - Temporizadores - Desafio 2 - Parte 6 - Refatoração

Aqui criamos novas variáveis para a função de formatação do tempo.
Utilizamos também uma função recursiva, ou seja, uma função que chama ela mesma para simplificar a formatação de minutos e segundos.

Aula 314 - Temporizadores - Desafio 2 - Corrigindo um pequeno bug

Aula 315 - BOM - parte 1

O BOM são propriedades e métodos relativos ao Browser(Browser Object Model), diferente do DOM (Document Object Model). Não está descrito na ECMA Script
Métodos BOM:
innerWidth / innerHeight: Demonstra o valor disponível para visualização do documento na tela no momento (alterando conforme o dimensionamento do browser).
outerWidth / outerHeight: Demonstra o tamanho total da janela do browser (somando por exemplo a área utilizada pelo DevTools se ativado).
opener
pageXOffset / pageYOffset: Mostra a posição da tela quando temos barras de rolagem.
screenX / screenY: Mostra a posição do navegador em relação a tela total do computador.
Objeto history:
history.lenght: Mostra quantas páginas foram visitadas no histórico.
history.go(): Avança ou volta páginas do histórico (quando colocamos (-1) volta uma página).
history.back() / history.forward(): Retorna ou avança uma página do histórico.
Objeto location: Mostra diversas propriedades da localização da página.
location.href: mostra o endereço da página.
Temos também outras propriedades como location.protocol, location.hash (verificar as propriedades no console do objeto).
Métodos do objeto location:
location.reload(): recarrega a página.
location.assign(endereço_da_página): Abre uma nova página alterando o length do histórico.
location.replace(endereço_da_página): Abre uma nova página sem alterar o length do histórico.
Objeto navigator: Mostra diversas informações sobre o navegador que está acessando a página.
navigator.userAgent: mostra os dados do navegador do usuário.
navigator.cookieEnabled: mostra se os cookies estão habilitados.
Objeto screen: Mostra o tamanho da tela (varia conforme a resolução. Apresenta o valor real, ou seja se a propriedade de vídeo estiver configurada para texto com zoom vai apresentar a resolução alterada).

Aula 316 - BOM - parte 2

Métodos:
alert(), confirm(), prompt.
open(): Abre uma nova aba com o site selecionado. Nesse caso quando utilizamos o método opener() ele mostra qual objeto chamou o método open(). Podemos passar como parametros 'nome_da_janela', 'width=XXX, height=XXX'.
close(): fecha a janela (apenas quando utilizamos o método open() para abrir a janela).
scrollTo(X, Y): move até o ponto (x, y) e scrollBy(X, Y): move o valor (X, Y).
print(): imprime a página selecionada.

Aula 317 - BOM - parte 3 - Eventos

Eventos:
load e DOMContentLoaded: ocorre quando carregamos a página.
resize: ocorre quando redimensionamos a janela.
scroll: ocorre quando rolamos a página.
unload e beforeunload: ocorrem quando fechamos ou descarregamos a página.

Aula 318 - BOM - Desafio

Minha resolução do desafio.

Aula 319 - BOM - Desafio - Resolução

Resolução do desafio. Foram utilizadas funções específicas para cada operação (uma para atribuir a classe no menu e outra para receber o pageYOffset).
Para melhorar as manipulações no DOM foi criada uma outra função para verificar se tem ou não a classe atribuida. Assim não precisamos acessar o DOM a cada scroll da tela. Para isso foi utilizado o operador !! que transforma 'qualquer?' valor em booleano. Com isso o retorno de document.querySelector('.fx') deixa de ser null caso não exista a classe e passa a ser false e no caso oposto true. Com esse resultado podemos utilizar o operador && no comparador que verifica se o valor do scroll é ou não maior que o valor definido, manipulando-se o DOM apenas quando não for atendida a comparação.

Aula 320 - Recuperar propriedades visuais

Quando tentamos acessar estilos através da propriedade style em Javascript não conseguimos acessar os estilos passados a menos que eles estejam declarados de forma 'inline'.
Para manipular os estilos atribuidos externamente devemos utilizar a propriedade getComputedStyle(variável_atribuida_ao_elemento).propriedade_a_ser_manipulada.
Para localizarmos um elemento em relação ao documento utilizamos o nome atribuido no elemento na variável do Javascript seguido de uma das seguintes propriedades: var.offsetHeight / var.offsetWidth (largura e altura), var.offsetTop / var.offsetLeft (posição relativa ao topo / esquerda).
Para verificar a posição de um elemento em relação a viewport utilizamos o método getBoundingClientRect(). Com esse método obtemos a posição do elemento de acordo com a posição que ele está na viewport, alterando-se este valor conforme a sua posição no momento.

Aula 321 / 322 - Problema - Mostrar link ativo em uma single page

Problema para selecionar os links conforme for rolando a tela. Foi utilizado aqui os métodos getBoundingClientRect().top para selecionar apenas o valor da posição de cima do elemento em relação a viewport. Obtendo essa posição podemos definir qual a <li> que está ativa no momento.
Fiz o código CSS de qualquer jeito apenas para fazer o JS funcionar. Não utilizei o código fornecido pelo professor pois ele não foi mostrado na aula, apenas disponibilizado para download.

Aula 323 - Saltos. Return vs break vs continue

Utilização em funções do return, break e continue.
Quando utilizamos return temos o fim da execução da função e o retorno do valor informado, saindo da função.
Já o break para a execução do comando mas continua a execução da função.
Quando utilizamos o continue apenas saltamos a opção no loop, continuando a execução de onde parou.
Um exemplo da utilização do break é no seletor switch.

Aula 325 / 326- Preparar o projeto com pequenos ajustes / Melhorar acessibilidade de nosso título

Explicação da base do projeto final. Explicando as metatags, explicando a utilização do Font Awesome, Google Fonts, fontes escolhidas para o projeto e tamanhos de fontes incluidas no link.
Fazendo alguns ajustes no código HTML. Algumas palavras do projeto estavam escritas em maiúsculas. Ocorre que leitores de conteúdo podem ler palavras em maiúsculas como se fossem siglas, portanto devemos escrever as palavras no HTML sempre com o case correto e se necessário ajustar no CSS.
Explicação da semântica utilizada no HTML e da sequencia de elementos.
Aplicando a tag <abbr> na sigla WP(Wordpress).

Aula 327 - Inicio do CSS

Inserção do link para o CSS no HTML.
Aplicação da fonte principal no <body> e ocultar o botão de menu com display: none (aplicado inline) para tratamento posterior.
Criação de uma classe no-js na tag <body> para trabalhar sem Javascript no código. Quando o Javascript estiver habilitado mudamos essa classe para js.
Criação das classes do <header> e aplicando os estilos nas classes header, logo-text e header__nav. Utilizamos inicialmente um display: inline-block no logo e no nav, entretanto alteramos para display: block com float: left para manter o logotipo a esquerda. Após isso limpamos o fluxo a esquerda com clear: left para posicionar o menu abaixo do logo. Essa formatação foi utilizada para, em caso de não estar habilitado o Javascript o menu ser apresentado de forma fixa na tela, na mesma posição em que será apresentado com o menu hamburguer só que fixo.

Aula 328 - CSS - Efeito hover

Aqui aplicamos o hover nos links <a> do menu. Entretanto como esta a área abrangida pelo efeito será apenas a parte em que está o texto. Para aumentarmos a área do efeito para toda a área do elemento mudamos o display dos links <a> para display: block. Em seguida tranferimos o padding para a classe do link <a> para que toda a área do item no menu seja clicável. Por fim foi aplicado um transition para suavizar o efeito.

Aula 329 - CSS - hero

Criação das classes da primeira <section>. Para evitar que as imagens fiquem maiores que a tela de trabalho (fiquem responsivas) colocamos um estilo nas tags <img> de max-width: 100% garantindo que as imagens não excedam o viewport.
Em seguida, para alinharmos o texto no centro da tela no sentido vertical, aplicamos o display: flex. Como o display: flex ordena por padrão os elementos em linha precisamos alterar a direção utilizando o flex-direction: column. Por fim, aplicamos o justify-content: center para que os elementos fiquem alinhados ao centro do elemento na vertical. Em seguida foi feita a estilização dos elementos da seção com especial atenção para o botão. Para o botão precisamos aplicar um display: inline-block para que o elemento <a> que faz referencia ao botão não ficasse ocupando toda a linha. Entretanto a formatação só funcionou depois que aplicamos a propriedade align-items: center na classe que contém o display: flex.

Aula 330 - CSS - desenhar setas com folhas de estilo

Fazer uma seta na página utilizando CSS.
Para fazer a seta utilizamos a propriedade liner-gradient para criar o efeito na tela junto com o background (background-image) Aplicamos à propriedade a cor desejada (no caso white e transparent) e fazemos a configuração para criar dois triangulos (utilizando 45deg e -45deg). Em seguida fazemos o posicionamento no bottom e center. O posicionamento em center não coloca o efeito na posição correta, desse modo alteramos a posição para left e utilizamos a propriedade calc(50% + 20px) para posicionar o line-gradient em 50% (center) + e - 20px. O tamanho das imagens ficará background-size: 40px 40px, 40px 40px, cover (40 x 40 nas duas setas e cover para a imagem de fundo).

Aula 331 - CSS - cards

Criando as classes e os estilos dos cards.
Para ajustar a imagem dos avatares que são duplicadas utilizamos o overflow: hidden e definimos o width e o height em 88px (o tamanho da imagem original é 88px x 176px).
Foi criada uma <div> com a classe container com definições de margin-left/right: auto e padding-left/right: 1em para a <section> dos cards que define um padding afastado para o conteudo. Essa classe será utilizada em outras partes da página.

Aula 332 - CSS - hover nos cards

Neste projeto quando passamos o mouse sobre os cards inserimos uma borda no card e na imagem do avatar. A borda do avatar utiliza a metade de baixo da imagem.
Se utilizarmos a propriedade border cada vez que aplicarmmos o hover teremos o redimensionamento do card. Para resolver esse problema utilizamos a propriedade outline do mesmo modo que o border. Neste caso para manter a imagem fixa e apenas a borda com o outline móvel aplicamos a propriedade outline-offset: -5px (onde o valor é o tamanho da linha da borda).
Para aplicar a borda na imagem do avatar utilizamos a propriedade transform: translateY(-50%) de modo a trocar para a imagem de baixo do avatar (pre configurada na imagem original e oculta com o overflow: hidden). Podiamos utilizar como valor para o translateY o tamanho da metade da imagem em pixels (-88px) porém caso mudassemos o tamanho da imagem teríamos também que mudar o translateY.

Aula 333 - CSS - content e buttons

Aqui incialmente aplicamos a <div class="container"> para ajustar as laterais da <section>.
Aplicadas as classes e feitos os ajustes de cores, utilizamos a propriedade word-spacing para aumentar a distancia entre as palavras.
Por fim foi feita a formatação dos botões e aplicado o hover e a transition.

Aula 334 - CSS - Last articles

Foram criadas duas <div> para isolar o título dessa seção e aplicar as formatações. Entre as classes utilizadas está a class= "container".
Em seguida foi feita a formatação do texto do título.
Para as imagens utilizamos o display: grid para a <div> principal e o display: block para as imagens.
Com as imagens definidas em display: grid formatamos o grid utilizando grid-template-columns: repeat(auto-fill, minmax(25px, 1fr)) para definir o tamanho das imagens, grid-auto-columns: auto e grid-gap: 0 para que as linhas sejam definidas automaticamente de acordo com a quantidade de imagens.
Para ajustar os espaços entre as imagens definimos o width delas em 100%.

Aula 335 - CSS - carousel sem Javascript

Para a seção do carousel primeiramente trabalhamos o conteúdo sem o Javascript. Para isso, como o conteúdo não será dinamico retiramos os ícones das setas (anterior e próximo) aplicando um style="display: none" nas <span> que contém as setas. Essa propriedade display será alterada pelo Javascript, assim caso ele estaja disponível ele será o responsável por habilitar a exibição das setas.
Em seguida criamos as classes das <div> da seção. Para as imagens não ficarem em bloco alteramos a propriedade display para inline-block. Com isso as imagens irão se ajustar uma ao lado da outra e abaixo conforme o tamanho da viewport. Para que as imagens fiquem necessariamente em apenas uma liinha utilizamos a propriedade white-space: nowrap. Essa propriedade não deixa que o conteúdo mude de linha criando uma barra de rolagem inferior no browser. Para que a barra de rolagem fique apenas na seção que está na linha aplicamos a propriedade overflow: auto. Com isso a barra de rolagem ficará apenas nas imagens do carosel.

Aula 336 - CSS - quotes

Primeiramente aplicamos o estilo inline "display: none;" para ocultar as setas(botões) de next e previous caso o Javascript esteja desabilitado.
Criação das classes e definição de estilos de fonte e background.
Aqui foi criado um margin-top para ser aplicado com duas condições:
Primeira: apenas quando o Javascript estiver desabilitado. Para isso utilizamos no seletor a classe no-js que foi criada na tag <body> para ser desabilitada quando o Javascript estiver habilitado.
Segunda: a propriedade margin-top só deve ser aplicada a partir do segundo elemento (no caso do segundo <figure>). Para isso utilizamos o operador '+' que indica que a propriedade só deve ser aplicada na tag que aparace após a tag indicada. No caso utilizamos figure + figure ou seja apenas o figure que esteja após outro figure.

Aula 337 - CSS - footer

Criação das classes e inclusão da <div> container.
Aplicadas as formatações de estilo do rodapé. Neste ponto finaliza-se a aboradagem mobile first. A seguir iniciaremos os ajustes para telas maiores, utilizando as media-queries e reajustando as dimensões e posicionamentos.

Aula 338 - CSS Responsivo - menu

Criação da primeira media-querie para o menu inicial. Essa media-querie transforma o menu superior em position: fixed para que ele fique fixo no topo da página, redimensiona o logo no menu para 25% e aplica um novo display none no elemento <button> do menu que só deverá ser apresentado quando for habilitado o menu hamburguer. Até esse momento aplicamos o display: none inline na tag do botão pois consideramos o Javascript desabilitado (classe no-js). Entretanto se o Javascript estiver habilitado a propriedade inline será removida, desse modo devemos aplicar o display na media-querie.
Em seguida aplicamos ao <nav> o width de 75% para complementar o espaço do logo e a propriedade float: left, além de limpar o clear: left que havia sido utilizado com clear: none. Até esse momento não conseguimos posicionar o menu a esquerda.
O problema com o posicionamento do menu a esquerda foi porque aplicamos um padding no logo de 20px. Esse padding adicionava 20 px a direita e a esquerda do logo fazendo com que ao width: 25% fosse somado 40px. Dessa forma os 25% mais os 75% mais os 40px excediam 100%. Para evitar esse problema se ter que alterar as porcentagens do width utilizamos a propriedade box-sizing: border-box que soma o padding ao tamanho do logo mantendo-o dentro dos 25%.
Para a <ul> foi aplicada propriedade display: flex com o alinhamento justify-content: space-around, foi removida a borda inferior e aplicado o flex-grow: 1 para que toda a área de cada item da <li> seja clicável. Isso foi aplicado pois o space-around distribuiu as <li> no espaço determinado mas sem ocupar esses espaços com todo o conteúdo.
Foi incluido ainda um max-width: 800px na <nav> para que o menu não fique justificado até o limite da tela, restringindo a lagura máxima do space-around.

Aula 339 - CSS Responsivo - cards

Para formatar os cards utilizamos a propriedade display: grid no elemento principal. Apenas com essa alteração e definindo o grid-template-columns: repeat (4, 1fr) (quatro colunas) e o grid-gap que é o espaçamento entre os frames.
Para ajustar os espaçamentos/posição dos cards em relação as margens esquerda e direita aplicamos na classe container um max-width: 980px. Dessa forma os elementos que utilizam essa classe ficam centralizados com tamanho máximo de 980px. Lembre que estamos fazendo esse projeto em mobile first assim tudo foi feito inicialmente pensando em tela pequenas, sendo necesário esse tipo de ajuste nesse momento.

Aula 340 - CSS Responsivo - content

Ajuste do alinhamento do texto do logo a direita.
Para o content também utilizamos o display: grid, dessa vez selecionando as classes content e container.

Aula 341 - CSS Responsivo - Last articles

Ajustar o posicionamento das imgens da seção last-articles.
Como esta seção já estava com a propriedade display: grid mesmo na versão mobile apenas ajustamos o numero de colunas quando tivermos mais tamanho na tela com a propriedade grid-template-columns.

Aula 342 - CSS Responsivo - footer

Aplicado no footer a propriedade display: flex e ajustada a margem de todo os objetos filhos através do seletor > * . Fizemos também um ajuste no texto do logo para uppercase através da criação de uma classe no elemento <h2>.

Aula 343 - Javascript - menu - parte 1

Criação e inclusão dos arquivos de script main.js e menu.js
Criação da função auto-executável em main.js.
No arquivo main.js declaramos a variável para o <body> com o document.querySelector, e fizemos a alteração da classe de no-js para js com as instruções classList.remove e classsList.add.
Com a inclusão da classe js podemos começar a programar o menu.
No 'CSS' incluimos o seletor .js .header para fixar o menu com o position: fixed tanto para o modo mobile quanto para o desktop (no query-selector já estava com a posição fixed).

Aula 344 - Javascript - menu - parte 2

Nesse ponto criamos uma variável para o botão e fizemos a sua atribuição através da classe.
Em seguida removemos o atributo de style (no caso o estilo inline aplicado na tag fica limpo).
Foram criados os estilos no CSS na classe .header__btnMenu posicionando o botão a direita com float: right e aplicando as demais formatações. O botão nesse ponto (onde se ve o nome 'menu') será visível apenas para os screen readers. Para ocultar o botão criamos um <span> no label do botão com a classe sr-only (screen reader only). Essa classe é baseada no Bootstrap e remove o texto do botão. Não consegui entender por que a classe remove o texto pois não estamos utilizando o Bootstrap e não definimos essa classe em lugar nenhum. Na verdade essa classe está presente também no Font Awesome.
Para redimenisonar o botão adicionamos a classe fa-2x no html nas classes do Font Awesome.

Aula 345 - Javascript - menu - parte 3

Nesta aula iniciamos a criação do código do menu. Para isso foi criado um objeto com as seguintes características:
var menu = new Menu({ container: '.header__nav', toggleBtn: '.header__btnMenu', widthEnabled: 1024 })
Esse objeto tem como função definir os elementos que serão alterados. No arquivo menu.js criamos a função Menu().
Inicialmente foram feitas operações ternárias para verificar se os conteudos de nav e btn são strings e então configurar os seletores.
Todo esse procedimento ficou bastante confuso. Preciso rever essa aula para tentar entender todo esse processo.

Aula 346 - Melhoria no menu

Ajustando o menu. Quando aumentamos o tamanho da tela após utilizar o menu e atualizamos a página o menu desaparece. Isso ocorre porque aplicamos um estilo inline na tag %ltnav$gt que transforma o max-height para 0px.
Foi criado um laço que monitora o tamanho da tela e quando ela é redimensionada, caso o max-width for maior que o definido (no caso 1024) o estilo inline é removido.
O segundo problema é que quando aumentamos a tela, quando diminuimos o menu é acionado automaticamente. Para corrigir isso foi incluido no loop uma opção que verifica o resize da tela. Caso a tela não for maior que o maxWidth ele chama a função closeMenu().

Aula 347 - Melhoria no menu - parte 2

Um novo bug foi encontrado aqui. Quando a tela esta em modo desktop ao apertar F5 ou atualizar a página o menu superior desaparece. Isso acontece porque o código Javascript está chamando a função closeMenu()
Para resolver esse problema retiramos o closeMenu() da função principal e colocamos um condicional para que a função seja chamada apenas quando o tamanho da janela for menor ou igual ao maxWidth.
Foi localizado outro problema. Quando a janela era dimensionada para exatos 1024px o menu desaparecia e não aparecia nem no modo inline nem no modo hamburguer. Para corrigir isso alteramos o valor da media querry para 1025px no arquivo CSS.

Aula 349 - Javascript - carousel - parte 1

Para o carousel novamente criamos um objeto de configuração. Aqui utilizamos como propriedades do objeto o 'container' representado pela classe .laptop-slider .slideshow, o 'itens' que utiliza as tags figure e os botões 'btnPrev' e 'btnNext' ccom as classes .prev e .next.
Criamos um arquivo carousel.js que irá conter o Javascript do elemento.
Nesse arquivo criamos a função carousel() e indicamos seus elementos com o this. referenciando o container, o itens, o btnPrev e o btnNext.
Em seguida foi criada uma função init() que fará a manipulação das figuras do carousel. Foi criado um Array com os itens e uma função de listener para verificar o click nos botões btnPrev e btnNext. Os botões invocam funções para mostrar os slides utilizando incremento e decremento de 1. A função de mostrar o slide trabalha com o operador '%' (módulo da divisão).
Para evitar numeros negativos utilizamos a função Math.abs que converte o numero em positivo.
Em seguida removemos a classe show dos elementos e incluimos a classe show no elemento do array cujo valor está na variável slide.

Aula 350 - Javascript - carousel - parte 2

Nesta aula iniciamos a configuração do CSS para o carousel. Primeiramente alteramos o overflow dos elementos quando a classe no body estiver em js. Em seguida definimos as posições do slideshow para relative e das figure para absolute posicionando ao centro e com o tamanho de 100%. Todas as figure ficarão com opacity: 0 menos a que tiver a classe definida com show (atribuido pelo JS).
Foi feito também o posicionamento dos botões e alterado seu z-index para que ele tenha prioridade no posicionamento.
Com essa mudança precisamos aumentar o z-index do header que tem a position: fixed.
Para centralizar os elementos do slideshow atribuimos um max-width: 900px. O position: absolute ficou definido para todos os elementos com opacity: 0 e no elemento com a classe show que tem o opacity: 1 o position fica definido como static para evitar pequenos saltos na troca das imagens.

Aula 351 - Javascript - carousel - parte 2

O slideshow utilizado para os depoimentos irá aproveitar o mesmo código Javascript utilizado no carousel. O que devemos fazer é no arquivo main.js criar uma nova variável com o mesmo objeto mas referenciando as classes do elemento dos depoimentos.
No projeto inicial os botões 'prev' e 'next' estavam fora da <div> container, portanto devemos coloca-los na dentro da <div>.
Por fim o ajuste do CSS deve ser feito.

Aula 352 - Hospedagem

Explica algumas formas de hospedagem de sites:
Tecnologia
Estático: Quando não depende de consultas a sistemas além do HTML/CSS/JS
Dinâmico: Quando precisamos realizar acessos a aplicações externas.
Tipo de serviço
Compartilhado: modo mais comum para sites estáticos.
VPS (Virtual Private Server): Similar ao compartilhado porém com mais opções de personalização.
Dedicado: máquina dedicada totalmente configurável. Cloud: sistemas de armazenamento em nuvem (AWS, Azure, Google).
Upload de arquivos
FTP, terminal (SSH) ou CPanel.
Outros serviços:
github:pages, heroku, netlify, DigitalOcean.

Aula 353 - Hospedagem grátis

Sites de hospedagem gratuita

github:pages ir para o site

Heroku ir para o site

DigitalOcean ir para o site

Netlify ir para o site

Aula 354 - Introdução a domínios

Domínio
meudominio.com nome principal do domínio.
www.meudominio.com, blog.meudominio.com, app.meudominio.com - nome secundário do domínio.
Para registrar os domínios:

Registro.br ir para o site

GoDaddy ir para o site

Aula 357 / 358 / 359 - Configurações do domínio

Para configurar o site devemos utilizar o IP fornecido pela empresa de hospedagem no gerenciador do domínio. Devemos cadastrar também o domínio secundário (no caso www. para página web).
No registro.br podemos redirecionar o nome do domínio utilizando a opção EDITAR ZONA.