Dando continuidade a parte 1 do post 100 dicas de front-end, segue complemento ao texto anterior. Espero que curtam!
51 - Em uma <picture>
, a <img>
não é
opcional.
Apesar de <img>
servir como um fallback, ela continua
sendo obrigatória, assim como o seu atributo alt
. Contudo, dentro de uma
<picture>
, o user-agent pode usar outra fonte para “trocar” o src da
<img>
, dependendo dos atributos sizes e srcset.
1 |
<picture> |
Essa será a única dica de HTML nesta parte 2. Caso queira mais dicas de HTML, veja na parte 1
52 - múltiplos gradientes ou backgrounds.
Podemos incluir múltiplas imagens de
background ou gradientes num elemento, sempre observando que a primeira imagem ou gradiente
inserida ficará no topo, acima das outras imagens ou gradientes. Por exemplo, se quiser colocar
um gradiente sobre uma imagem de fundo, devemos ter o seguinte código
1 |
body { |
53 - currentColor
Essa propriedade serve para indicar que queremos usar a mesma cor
da fonte do elemento, seja essa cor aplicada diretamente ou herdada.
1 |
button { |
Desse jeito, a cor da borda mudará automaticamente ao passarmos o mouse sobre o button
54 - will-change
Essa propriedade serve para dizer ao navegador que uma propriedade
possivelmente será alterada no futuro, fazendo com que o navegador faça as otimizações de
performance previamente, o que pode, em alguns casos, melhorar a percepção de performance da
interface do usuário. Use com cautela, pois seu uso indiscriminado pode ter o efeito reverso, ou
seja, prejudicar a performance da página no browser
1
.element { will-change: transform; }
55 - text-overflow
Eu já usei essa propriedade algumas vezes na minha vida. Ela trata
como o texto que excede ao tamanho do seu container deve se comportar. Apesar de aceitar alguns
valores, você provavelmente irá optar por clip ou ellipsis. Este mostra reticências e aquele
simplesmente esconde o texto que não couber no elemento.
Para ver essa propriedade em ação, você precisa trabalhar junto com outras duas propriedades, white-space e overflow. Veja um exemplo:
1 |
.reticecias{ |
56 - animation-play-state
É possível pausar ou continuar uma animação feita com CSS
usando a propriedade animation-play-state com o valor paused ou running.
Por exemplo, podemos pausar uma animação no hover do mouse.
1 |
div { |
57 - propriedade transform cria empilhamento z-index.
Essa é loka. Em alguns momentos
a propriedade transform pode ter um efeito indesejável, fazendo com que o elemento “pule” para
frente de outros. Isso acontece porque, por baixo dos panos, a propriedade transform cria um
contexto de emplilhamento z-index.
Mais fácil explicar com códigos.
See the Pen
transform e z-index by daniel tapias morales (@tapmorales)
on CodePen.
58 - Selecionar o ante-penúltimo elemento usando a pseudo classe :nth-last-child(n).
1 |
.my-class:nth-last-child(3) { |
59 - Selecionar os três último elementos usando o seletor ~ (next siblings).
1 |
.my-class:nth-last-child(4) ~ .my-class { |
60 - nth-child vs nth-of-type - parte1.
Esses seletores podem induzir ao erro. Por exemplo, você pode pensar que
p:nth-child(3)
irá selecionar o terceiro
parágrafo. Mas isso não é bem verdade. O que este seletor faz é selecionar o terceiro filho
se este for um parágrafo.Portanto, a seguinte regra
1 |
p:nth-child(3) { color: red; } |
Irá funcionar só na primeira div, já que na segunda div o terceiro filho não é um parágrafo
1 |
<div> |
61 - nth-child vs nyh-of-type - parte2.
Já o nth-of-type seleciona o terceiro filho do tipo (ou tag). Então
p:nth-of-type(3)
irá selecionar nas duas divs o
terceiro parágrafo.
1 |
<div> |
Parece bem mais lógico, não é mesmo? Mas a confusão pode aparecer quando temos algo como o código abaixo.
1 |
|
1 |
<div> |
O que aconteceu? O
.nth:nth-of-type(3)
deleciona o terceiro filho do
tipo do seletor(no caso, um parágrafo) se este tiver a classe .nth. Um pouco
confuso no início, eu assumo, mas como regra geral, saiba que o of-type (por tipo) diz respeito à
tag, e não à classe ou ao id.Quer ver o código acima funcionando? Coloque uma classe .nth no terceiro parágrafo
1 |
<div> |
62 - porcentagem - parte 1.
O valor de porcentagem aplicado ao width, margin ou padding de um elemento filho é sempre relativo ao width do elemento pai.
63 - porcentagem - parte 2.
Isso significa que height: 50% é a metade da altura do elemento pai (desde que a altura seja definida explicitamente, ou seja, não pode ter o valor auto, que é o valor default). Contudo, margin-top de 50% possui uma distância igual à metade da largura do elemento pai.
O mesmo vale para padding-top, margin-bottom ou padding-bottom.
Imagine o seguinte:
1 |
<div style="width: 500px; height: 300px;"> |
O parágrafo acima terá altura de 150px (50% da altura do elemento pai) mas 50px de margin-top (10% da largura do elemento pai)
64 - porcentagem - parte 3.
O valor em porcentagem aplicado em transform: translate é sempre proporcional ao tamanho do próprio elemento. Se aplicado ao translateX, é relativo à largura do elemento. Se aplicado ao height, se refere à altura.
65 - a propriedade transform muda o eixo xy do elemento na ordem em que as transformações são aplicadas.
Isso significa que a ordem de escrita muda o resultado final.
Por exemplo:
transform: translateX(500px) rotate(45deg)
tem um resultado bem diferente de
transform: rotate(45deg) translateX(500px)
.66 - opacidade menor que 1 gera contexto de empilhamento z-index.
Essa também é loka.
Aplicar opacidade menor que 1 também cria um contexto de empilhamento. Se você tiver problemas com isso especialmente em animações, tente trocar para rgba ou hsla. Em alguns casos isso é possível, em outros não. Se não for possível trabalhar com rgba ou hsla, terá que trabalhar em conjunto com z-index.
See the Pen
XGGvJv by daniel tapias morales (@tapmorales)
on CodePen.
67 - flexbox space evenly
Falando de justify-content, que trata da distribuição dos
flex-items no main axis, temos a opção space-evenly, que irá deixar todos os espaços vazios
exatamente iguais, incluindo o espaço antes do primeiro item e após o último item.
68 - border-box.
Por padrão o padding soma ao valor do width e height do elemento.
Esse comportamento pode ser alterado com box-sizing: border-box;
69 - ordem de classes.
a ordem das classes no HTML não muda a especificidade.
Portanto, os dois códigos HTML abaixo produzem o mesmo resultado.
1
2
<p class=" red blue "> ... </p>
<p class=" blue red "> ... </p>
70 - em
1em aplicado à fonte é relativo ao tamanho da fonte do elemento pai. Se
aplicado em qualquer outra propriedade é relativo ao tamanho da fonte do elemento atual, seja
aplicado diretamente ou herdade de algum elemento ancestral.
71 - vh e vw
Essas unidades de medida são sempre relativas ao tamanho da viewport.
100vh é 100% da altura da viewport ao passo que 100vw é 100% da largura da viewport.
72 - text-transform: uppercase vs font-variant small-caps
Há uma diferença sutil
entre essas duas propriedades. Ambas vão deixar as fontes em letras maiúsculas, mas a diferença
está no tamanho da fonte. text-transform: uppercase
deixa todas as letras de
tamanho de fontes maiúsculas. Já font-variant small-caps
mantem o tamanho de fontes
minusculas mas com aparência de fontes maiúsculas.
73 - gradientes em textos?
O interessante com essa técnica é que ela só funciona com
o prefixo -webkit-, até mesmo do Edge e Firefox nas versões mais novas.
Para termos um gradiente no texto, temos que trabalhar com duas propriedades em conjunto além da
background-image
1
2
3
background-image: linear-gradient(red, blue);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
74 - formatar scrollbar em webkit
Se quiser formatar a barra de rolagem, tenha em
mente que só funciona em navegadores webkit. Então vamos direto ao código
1 |
<div id="sc"> |
1 |
#sc{ |
Agora vamos às dicas de javascript
75 - Comparar objetos
Como comparar se um objeto é igual ao outro? Como sabemos
{} === {}
retorna false pois cada objeto, mesmo que contendo propriedades e valores
iguais, ocupam posições diferentes na memória. Quando um objeto só possui propriedades, e não
métodos, costumo transformar os dois objetos em strings com JSON.stringify() e comparar o
resultado
1
2
{ prop: 'value' } === { prop: 'value' } //false
JSON.stringfy({ prop: 'value' }) === JSON.stringfy({ prop: 'value' }) //true
76 - array com valores únicos
Uma forma que você pode pensar para obter um array com
valores únicos a partir de outro array talvez envolva loops ou, mais elegantemente, um callback
dentro de um array.filter().
Contudo, sabendo que agora podemos trabalhar com conjuntos (que não podem ter valores duplicados por definição) podemos obter um array contendo os valores de um conjunto.
Por exemplo:
1
2
const arr1 = [1, 2, 2, true, true, 'str', 0, 'str']
const set = new Set(arr1)
Agora podemos facilmente transformar um conjunto em um array novamente utilizando o spread
operator
1
const arr2 = [...set]
Sem loops nem callbacks. Sucesso!
77 - Evite usar setInterval
Para agendar uma função que será executada de tempos em
tempos, prefira trabalhar com setTimeout recursivo.
Essa é uma melhor prática devido a um mecanismo interno chamado event loop.
78 - if melhorado - parte 1
ao invés de escrever algo como:
1
2
3
if(condicao){
fazAlgo();
}
prefira algo como:
1
condicao && fazAlgo()
79 - if melhorado - parte 2
ao invés de ter algo como:
1
2
3
if(!condicao){
fazAlgo();
}
Prefira algo como:
1
condicao || fazAlgo()
80 - Valor padrão
Esse mesmo curto-circuito mostrado acima pode ser usado para
atribuir valores padrões. Ex:
1
let obj = obj || {}
Se já não existir obj, então um objeto limpinho será atribuído à obj
81 - Math.max
e Math.min
são muito uteis e pouco
usados.
Eles retornam o maior e menor valor, respectivamente, dos valores passados
por parâmetro
82 - potência abreviada
Com ES6 há uma forma abreviada de termos a potência de um
número. Exemplo:
1
Math.pow(2, 3)
é o mesmo que
1
2**3
e significa 2 ao cubo.
83 - Organizar arrays.
O método sort() recebe uma função de callback que será
executada para cada elemento do array e organizar esse array de acordo com o retorno desse
callback.
Para organizar um arra numérico em ordem crescente, faça o seguinte:
1
2
let arr = [3,4,8,1,6,8]
arr = arr.sort((a, b) => a - b);
84 - formas de duplicar um array, deixando o array original intacto.
1
2
let arr = [3,4,8,1,6,8]
let arr1 = [].concat(arr)
OU
1
let arr2 = Array.from( ...arr );
85 - every e some
Duas funções muito úteis e pouco utilizadas. Ambas recebem uma
função de callback e retornam um booleano. A diferença é que a every() retorna true se todas as
execuções do callback retornarem true. Já na some() basta que uma execução retorne true para que
o retorno seja avaliado como true.
1
2
3
let arr1 = [1,2,'3', 'teste']
arr1.some( el => isFinite(el) ) //true
arr1.every( el => isFinite(el) ) //false
86 - Obter timestamp facilmente
1
let tsNow = +new Date()
87 - Obter um boolean facilmente.
Use a negação da negação
1
2
3
4
5
6
7
8
9
!!"" // false
!!0 // false
!!null // false
!!undefined // false
!!NaN // false
!!"hello" // true
!!1 // true
!!{} // true
!![] // true
88 - passar parâmetro para uma função de callback
Durante muito tempo eu fiz desse
jeito pra poder passar um parâmetro para uma função de callback
1
2
3
$elemento.addEventListener('click', function(){
fazAlgo('meu-parametro-lindo')
})
Mas recentemente descobri que há outra forma, utilizando algo que já conhecia há muito tempo:
clousure.
1
2
3
4
5
function fazAlgo(meuParam) {
return function() {
console.log('meuParam ', meuParam);
}
}
Agora é só executar a função dentro do listener, sem necessitar mais daquela função anônima
feia
1
$elemento.addEventListener('click', fazAlgo('meu-parametro-lindo')).
Coisa Linda!
89 - entender o this
O this no Javascript é algo bem dinâmico e depende de vários
fatores para sabermos exatamente o que é o this.
Fiz um
artigo sobre isso
90 - Sempre retornar uma instância mesmo que o desenvolvedor esqueça o operador
new
Em alguns casos, precisamos garantir que uma função seja sempre executada com o
operador new para retornar uma nova instância do objeto.
Mas o que acontece se o programador esquecer de usar o operador new?
Podemos tratar isso fazendo uma rápida verificação e retornando assim uma nova instância.
1
2
3
4
5
6
7
8
function Pessoa(nome){
if(!(this instanceof Pessoa)){
return new Pessoa(nome);
}
this.nome = nome;
}
const eu = new Pessoa('Daniel')
const ele = Pessoa('João')
91 - diferença entre function Pessoa(){}
, const eu = Pessoa()
, e
const ele = new Pessoa()
Essa caiu pra mim na minha entrevista técnica
para uma vaga de emprego.
function Pessoa(){} é somente uma expressão de função.
var eu = Pessoa() apenas armazena o
valor retornado de Pessoa dentro da variavel eu
var ele = new Pessoa() cria um objeto limpo e
armazena numa variavel chamada ele
92 - copiar objeto
Vimos como duplicar arrays. Mas como podemos fazer para duplicar
objetos?
O jeito mais fácil é usarmos o método Object.assign(destino, origem)
.
destino
será um objeto limpo, sem nada. origem
você já sabe o que
é.
1
2
var obj = { propriedade: 'valor' };
var clone = Object.assign({}, obj);
93 - Array.from vs Array.of
Ambos servem para criar uma array. Array.from pode
receber um objeto array-like ou uma array como parâmetro. Array.of recebe os valores separados
por vírgula.
O código irá demonstrar melhor o que cada método faz:
1 |
arr = Array.from( [1,2,3] ) // Uma array nova contendo os valores da array passada por parâmetro [1, 2, 3] |
Agora falando um pouco de ferramentas front-end
94 - não instale pacotes globalmente com a flag -g. Portanto, evite usar npm install -g mesmo que a maioria dos tutoriais peça pra você fazer isso. Prefira instalar localmente e rodar o pacote usando npm-script.
95 - use um gerenciador de versões do node, como o nvm ou simplesmente n.
96 - No vscode use Alt Shift seta pra baixo ou para cima para duplicar linhas.
97 - No vscode use Alt seta pra baixo ou para cima para mover uma linha de código.
98 - limpe a pasta node_modules depois do deploy para otimizar seu precioso espaço em disco.
99 - o npx não vem com o nodejs se instalado pelo nvm. para resolver isso, ignore a dica 94 e faça o seguinte: npm i -g npx.
100 - o watch do node-sass não funciona muito bem no vscode. utilize o nodemon no lugar do –watch.
Prontinho. 100 dicas conforme prometido.
E aí? Alguma dessas dicas foi novidade pra você? Tem sugestão de alguma dica que não incluí nessa lista? Deixe seu comentário ou feedback. Ficarei grato de saber o que você achou desse post.