Esta atividade é composta de 2 exercícios.
Neste exercício você deve calcular a fórmula da gravitação universal, como
dada na própria página. O código deve ser feito em exercicio1.js
e
esse arquivo ainda não foi incluído na página.
Para isso, você deve associar um evento de click
ao botão #calcular
e,
nessa função, calcular o valor da força gravitacional e preencher o valor
de #resultado
.
Agora você vai criar uma galeria de imagens. Os botões #anterior
e #proximo
devem permitir que o usuário alterne a imagem que está
sendo exibida e o código para isso deve ser feito no arquivo exercicio2.js
.
A ideia geral é usar eventos de click
nos botões e alterar o
caminho (atributo src
) da imagem #slide
(ver FAQ como trocar
um atributo de um elemento HTML). Algo que pode ajudar é manter uma variável
que indique o índice da imagem atual.
Ao abrir exercicio2.js
alunos atenciosos vão reparar que as imagens
foram dadas como um vetor de objetos da seguinte forma:
const imagens = [
{
nome: 'nome-da-imagem.webp',
descricao: 'O texto alternativo que a descreve'
},
...
];
Além do atributo src
, defina também o alt
com o texto descritivo.
Para acessar uma propriedade de um objeto, lembre-se no FAQ.
E também repare que as imagens estão hospedadas em um servidor web.
Portanto, seus caminhos devem ser concatenas (servidor e nome) para
que sejam encontradas.
Por fim, faça com que a galeria seja "circular": ao ultrapassar a última ou a primeira imagem, ela deve voltar para a primeira ou a última, respectivamente. Veja o FAQ se precisar de ideias sobre isso.
No arquivo exercicio3.js
, faça os botões "+" expadirem ou
retrairem o texto dos parágrafos, alternadamente.
O arquivo estilos.css
contém uma regra para uma classe chamada .expandido
.
Ela contém as propriedades necessárias para que um parágrafo seja exibido
de forma completa, em vez de apenas a primeira linha:
/* estilo inicial do parágrafo */
p {
height: 1em; /* parágrafo com altura de 1 linha apenas */
overflow: hidden; /* oculta o que não couber no parágrafo */
text-overflow: ellipsis; /* coloca reticências ao final od texto */
}
/* estilo quando <p class="expandido"> */
p.expandido {
height: auto; /* altura suficiente para mostrar tudo */
}
Uma forma bem ruim de resolver seria criar uma função diferente para
o click
de cada parágrafo. Contudo, as 5 funções fariam exatamente
a mesma coisa porém só apontando para um <p>
diferente.
Nesse caso, é melhor ter apenas 1 função e parametrizar qual parágrafo
será expandido/retraído. Para pegar todos os .botao-expandir-retrair
é possível usar document.querySelectorAll(...)
. Então, percorre-se
esse vetor associando uma única função ao click
deles. Mas como
saber qual dos botões foi clicado?
No caso, é possível, dentro da callback de um evento, descobrir
quem foi o alvo do evento. Para isso, é necessário usar o
parâmetro e
(ou evt
, ou evento
) da callback de click
para detectar que parágrafo contém o botão que foi clicado.
Esse parâmetro possui informações sobre o evento, como o elemento HTML
que foi clicado (e.currentTarget
), as coordenadas (x,y) do mouse
no momento do clique (e.screenX
e e.screenY
), qual botão do
mouse foi usado (e.button
) e algumas outras coisas. Veja
mais no FAQ.
O e.currentTarget
dentro da função de click
aponta para o elemento HTML
que foi alvo do evento, ou seja, o botão. Mas precisamos alterar o parágrafo
pai do botão, e não o botão mesmo. Para tanto, você deve "navegar" no DOM:
a partir do botão, pegar o pai dele, que é o parágrafo. Veja como
pegar o pai de um elemento no DOM.
Para expandir um parágrafo, basta colocar a classe .expandido
nele e,
para retraí-lo, basta remover essa classe. Veja o FAQ se tiver
dúvidas sobre como colocar/remover uma classe em/de um elemento do DOM.
Pode ser mais fácil alternar a classe (em vez de removê-la ou adicioná-la),
como descrito nos slides.
Além de expandir/retrair o parágrafo, o conteúdo do botão deve alternar
entre -
e +
, indicando se o próximo clique vai retrair ou expandir.
O FAQ contém uma pergunta sobre como alterar o conteúdo de um elemento.
- O que é o DOM mesmo?
- É a forma como o JavaScript enxerga a página HTML, em uma estrutura de árvore. Veja mais no slide sobre o DOM.
- Como atribuir um evento de clique a um elemento?
- Veja o slide sobre clicando em um botão.
- Como pegar mais de um elemento de uma vez?
- Usando o
document.querySelectorAll
(comAll
no final) e passando um seletor que retorne mais de um elemento. Veja o slide sobre oquerySelectorAll
.
- Usando o
- Como itero em um Array ou no resultado do
document.querySelectorAll
?- Há três formas (veja slides sobre repetição), mas as duas
melhores são:
// forma com 'for (let variavel of lista)' let itensDaListaOrdenada = document.querySelectorAll('ol > li'); for (let itemEl of itensDaListaOrdenada) { // faz algo com itemEl }
// forma com forEach let itensDaListaOrdenada = document.querySelectorAll('ol > li'); itensDaListaOrdenada.forEach(function(itemEl) { // faz algo com itemEl });
- Há três formas (veja slides sobre repetição), mas as duas
melhores são:
- Como colocar uma classe em um elemento usando JavaScript?
- Todo elemento do DOM tem uma propriedade
classList
, que possui os métodoselemento.classList.add('nova-classe')
,elemento.classList.remove('classe-a-tirar')
eelemento.classList.toggle('classe-a-colocar-ou-tirar')
. Para mais informações, veja o slide sobre colocando/tirando classes.
- Todo elemento do DOM tem uma propriedade
- Como pegar o elemento que foi clicado, dentro da callback?
- Basta usar o
e.currentTarget
, como descrito no slide sobre "argumento de click".
- Basta usar o
- Como alterar o conteúdo de um elemento?
- Todo elemento possui a propriedade
elemento.innerHTML
, que pode ser alterada, conforme descrito no slide sobre alteração de conteúdo
- Todo elemento possui a propriedade
- O que é concatenar Strings?
- É juntar duas ou mais Strings para formar outra. Veja o slide sobre Strings.
- Como "chegar à última imagem e dar a volta"?
- É possível fazer isso usando
if/else
e o tamanho do array (i.e.,variavelComArray.length
) - [Desafio] Há uma forma mais elegante do que essa primeira que
usa
if/else
, que é usando o operador de resto da divisão (i.e.,%
)
- É possível fazer isso usando