all repos — htmlepessoas.com @ 3772f6e2cb043381977c95d9796fece18e27eca3

Venha aprender HTML com um método simplificado.

src/12-css-basics.md (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
---
title: 'Básico de CSS'
summary: 'Aprenda a criar uma página limpa e bem desenhada do zero, escrevendo o seu próprio CSS.'
permalink: 'basico-de-css/'
originalPath: /css-basics/
tags: chapter
layout: 'chapter.njk'
---

# Básico de CSS

Neste capítulo, não vamos usar o nosso site com Simple.css. Vamos escrever os nossos próprios estilos, e para isso eu quero usar uma página mais simples. Você pode aplicar o que aprender aqui ao seu site Simple. Mas, neste capítulo, eu quero mostrar como começar do zero para fazer uma página bonita.

Vamos olhar especificamente o estilo de elementos tipográficos, para fazer uma página agradável de ler. Mas o CSS pode fazer muito, muito mais. Todos os designs sofisticados que você está acostumado a ver em páginas pela web são feitos com CSS. É uma ferramenta potente. Se este capítulo te der gosto pelo assunto, eu te animo a explorar o CSS além do que cobrimos aqui.

## Apresentando os planetas do sistema solar

Eu montei esta página HTML bem direta, que usa alguns elementos tipográficos e é um bom ponto de partida para aplicar estilos. Você pode usar o conteúdo que quiser, se tiver algo em mente. Mas também pode usar a mesma página HTML que eu vou usar.

Você pode ver o código-fonte no navegador, com o [comando de ver o código-fonte](https://perma.cc/3WP3-R9XL), ou conferindo o [código no GitHub](https://github.com/blakewatson/css-basics). E você pode [ver o resultado final aqui](https://planets.htmlforpeople.com/), se quiser uma espiada do que vai ficar.

Esta página apresenta os planetas do sistema solar e dá um pouco de informação sobre cada um. É super simples e básica de propósito. É um texto de preenchimento que eu não pretendo que ninguém leia a sério (mas as informações estão corretas, até onde eu sei).

## Ponto de partida

Eu fiz um `index.html` e coloquei o código a seguir. Ele assume que você tem um `styles.css` no mesmo diretório. Também assume que você tem uma imagem, `PIA06193~large.jpg`, no mesmo diretório. Você pode pegar esta imagem no [site da NASA](https://perma.cc/76GH-PWHQ).

<details>
	<summary>Abra para ver o código HTML completo</summary>
	
```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Planets of the Solar System</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <main>
      <h1>Planets of the Solar System</h1>

      <p class="intro"><span class="caps">Our solar system</span> is a vast and fascinating place, consisting of the Sun and the various celestial bodies that orbit it, including eight major planets. Each planet offers unique characteristics and features. In this article, we will explore the distinctive attributes of each planet, providing an overview of what makes them unique (and learn a little <abbr title="Cascading style sheets">CSS</abbr> while doing it).</p>

      <h2>Mercury</h2>
      <p>
        Mercury is the closest planet to the Sun and the smallest planet in our
        solar system. It has a very thin atmosphere and its surface is covered
        with craters.
      </p>

      <h2>Venus</h2>
      <p>
        Venus is the second planet from the Sun and is known for its thick,
        toxic atmosphere and extreme surface temperatures. It's often called
        Earth's "sister planet" because of their similar size and composition.
      </p>

      <h2>Earth</h2>
      <p>
        Earth is the third planet from the Sun and the only known planet to
        support life. It has a diverse climate and surface, with large bodies of
        water, mountains, and forests.
      </p>
      <blockquote>
        <p>
          The Earth is a very small stage in a vast cosmic arena. Think of the
          rivers of blood spilled by all those generals and emperors so that in
          glory and triumph they could become the momentary masters of a
          fraction of a dot.
        </p>
        <cite>— Carl Sagan</cite>
      </blockquote>

      <h2>Mars</h2>
      <p>
        Mars, the fourth planet from the Sun, is often called the "Red Planet"
        due to its reddish appearance. It has the largest volcano and canyon in
        the solar system.
      </p>

      <h2>Jupiter</h2>
      <p>
        Jupiter is the fifth planet from the Sun and the largest in the solar
        system. It has a Great Red Spot, which is a giant storm, and dozens of
        moons.
      </p>

      <h2>Saturn</h2>
      <p>
        Saturn, the sixth planet from the Sun, is famous for its extensive ring
        system. It's the second-largest planet in the solar system.
      </p>

      <figure>
        <img src="PIA06193~large.jpg" alt="This grand mosaic consists of 126 images acquired in a tile-like fashion, covering one end of Saturn's rings to the other and the entire planet in between.">

        <figcaption>
          Source: <a href="https://images.nasa.gov/details/PIA11141">https://images.nasa.gov/details/PIA11141</a>
        </figcaption>
      </figure>

      <h2>Uranus</h2>
      <p>
        Uranus is the seventh planet from the Sun and has a unique blue-green
        color due to methane in its atmosphere. It rotates on its side, making
        it unique among the planets.
      </p>

      <h2>Neptune</h2>
      <p>
        Neptune is the eighth and farthest known planet from the Sun in our
        solar system. It's known for its deep blue color and strong winds, some
        of the fastest in the solar system.
      </p>

      <h2>Additional Resources</h2>
      <p>
        For more information about the planets, visit the
        <a href="https://solarsystem.nasa.gov/planets/overview/"
          >NASA Solar System Exploration</a
        >
        website.
      </p>

      <h2>Other Major Bodies</h2>
      <ul>
        <li>Pluto</li>
        <li>Ceres</li>
        <li>Haumea</li>
        <li>Makemake</li>
        <li>Eris</li>
        <li>Ganymede</li>
        <li>Titan</li>
        <li>Europa</li>
      </ul>

      <h2>Sample Code</h2>
      <pre><code>function getPlanetInfo(planet) {
    const planets = {
        Mercury: 'The smallest planet and closest to the Sun.',
        Venus: 'Known for its thick, toxic atmosphere.',
        Earth: 'The only planet known to support life.',
        Mars: 'The Red Planet with the largest volcano.',
        Jupiter: 'The largest planet with a Great Red Spot.',
        Saturn: 'Famous for its ring system.',
        Uranus: 'Unique for its sideways rotation.',
        Neptune: 'Known for its deep blue color and strong winds.'
    };
    return planets[planet] || 'Planet not found';

}</code></pre>
</main>

    <footer>
      <p>
        A demo website for learning CSS. Part of <a href="https://htmlforpeople.com/">HTML for People</a> by <a href="https://blakewatson.com/">Blake Watson</a>. Check out the <a href="https://github.com/blakewatson/css-basics">source code on GitHub</a>.
      </p>

  </body>
</html>
```
</details>

Como o arquivo `styles.css` está vazio, só temos os estilos padrão do navegador. É assim que fica:

![Captura de tela do navegador renderizando a página "Planets of the Solar System". Cada planeta tem uma descrição breve, destacando características únicas. A página usa só os estilos padrão do navegador e está completamente sem estilo.](/assets/img/css-basics-01.webp)

O bom e velho Times New Roman e linhas de texto que ocupam a largura inteira da janela do navegador. Não fica grande coisa, mas tem algo gostoso e simples nisso. E, o mais importante, não está quebrado. Muitos sites vão longe demais, com designs exagerados, megabytes de imagens e JavaScript, e comportamentos hostis a quem visita (sabe, tipo: “eu vi que você só leu duas frases deste artigo, mas eu sei que você está morrendo de vontade de assinar a minha newsletter, então deixa eu te mostrar este pop-up gigante”).

Então vamos nos imaginar um tipo de médicos da web. Primeiro, não vamos fazer mal. Vamos melhorar a leitura da página e deixá-la bonita (bem, o que _eu_ acho bonito, de qualquer forma — sinta-se à vontade para divergir e adicionar os seus próprios estilos conforme formos). Mas vamos evitar qualquer coisa tão drástica que deixe a página mais difícil de ler do que está agora.

## A tag style

Podemos escrever CSS direto no arquivo `index.html` usando uma tag HTML especial, `<style>`. Podemos colocar a tag `<style>` dentro da seção `<head>` do arquivo. Assim:

```html
<!DOCTYPE html>
<html>
  <head>
    <title>My website</title>
    <meta charset="utf-8">

    <style>
      CSS code goes here
    </style>
  </head>

  <body>
    ...
  </body>
</html>
```

Isso é perfeitamente válido. Mas, se você tiver mais de uma página no site, teria de copiar e colar a tag `<style>` em cada página para ter os mesmos estilos em todas. Em vez disso, é comum colocar todo o CSS num arquivo separado e então _ligar_ esse arquivo a cada página com uma tag `<link>` na seção `<head>` do site.

```html
<link rel="stylesheet" href="styles.css">
```

## Primeiros passos para melhorar a página

Se você ainda não fez, crie um arquivo `style.css`. É aqui que vamos escrever todo o nosso CSS personalizado. Se você não estiver usando o meu HTML de partida, vai precisar adicionar a tag `<link>` na seção `<head>` da página para ligar os estilos à página, como descrito acima.

Dá para conquistar ganhos grandes logo de cara, com só algumas linhas de CSS. Por exemplo, um problema é que a página fica larga demais numa janela de navegador no desktop. Linhas longas de texto são difíceis de ler. Vamos corrigir isso dando à página uma largura máxima. Segundo o [Butterick's Practical Typography](https://practicaltypography.com/line-length.html), devemos caber entre dois e três alfabetos numa linha. Eu vou deixar com 65 _caracteres_ de largura.

```css
main {
  max-width: 65ch;
}
```

Esta _regra_ CSS mira o elemento `<main>` da nossa página e instrui ele a nunca passar da largura que declaramos.

{% aside 'Observação' %}
Beleza, [não é estritamente 65 caracteres de largura](https://perma.cc/66QM-Q2AF). A unidade `ch` no CSS se baseia na largura do caractere `0` (zero) na fonte dada. Então, na verdade, estamos dizendo: “não deixe a largura da página passar de 65 caracteres `0`”.
{% endaside %}

Ignorando a imagem gigante de Saturno — com a qual vamos lidar daqui a pouco — já ficou bem melhor. Mas o gosto moderno prefere uma página centralizada, então vamos fazer isso enquanto estamos nisso.

```css
main {
  margin-inline: auto;
  max-width: 65ch;
}
```

Em idiomas da esquerda para a direita, como o português, `margin-inline` é a margem horizontal, ou esquerda e direita. Ao definir como `auto`, estamos dizendo: “não me importa quão larga seja a margem esquerda e a direita, só deixe iguais”. O navegador sabe quão larga queremos a página, então calcula a margem necessária para deixar igual dos dois lados, centralizando a página.

Também temos um elemento `<footer>` que vive fora do elemento `<main>`, então vamos estilizá-lo à parte, com a mesma largura e margem.

```css
footer {
  margin-inline: auto;
  max-width: 65ch;
}
```

E, para fechar esta linha de raciocínio, vamos impedir que a imagem de Saturno estoure para fora da página.

```css
img {
  max-width: 100%;
}
```

O `max-width` pode ser declarado como uma porcentagem do elemento que contém. Definir como 100% significa: “não deixe elementos de imagem ficarem mais largos do que os seus contêineres”.

E agora a nossa página está bem mais agradável.

![A mesma imagem de antes, mas agora a página está centralizada e limitada a uma largura que torna a leitura mais fácil.](/assets/img/css-basics-02.webp)

## Anatomia de uma regra CSS

Olhe uma das nossas regras até agora. Esta regra limita a largura das imagens à largura dos seus contêineres.

```css
img {
  max-width: 100%;
}
```

O que acontece aqui é uma coisa em duas partes. Primeiro, especificamos quais elementos da página queremos afetar. Essa é a parte antes das chaves (`{}`). Chama-se _seletor_, porque _seleciona_ elementos da página para mudar.

A parte dentro das chaves é onde colocamos as propriedades que queremos mudar. Cada declaração consiste numa _propriedade_ e num _valor_. Neste caso, há uma declaração. A propriedade é `max-width`, e o valor é `100%`.

## Tamanho do texto, altura da linha e espaço entre elementos

O tamanho padrão da fonte é um pouco pequeno. Vou mirar o elemento `html` (ou seja, o documento inteiro) e definir `font-size` e `line-height`.

```css
html {
  font-size: 20px;
  line-height: 1.45;
}
```

Uma das unidades que podemos usar para dimensionar coisas é a unidade de pixel, `px`. Estou descobrindo agora que `1px` equivale a 1/96 de uma polegada (embora isso varie com a densidade de pixels da tela). Hein. A gente nunca para de aprender.

Há todo tipo de jeito de definir o tamanho do texto. Vamos ver mais alguns daqui a pouco.

Vou definir o `line-height` usando um valor sem unidade de `1.45`. É um número que fica bonito. Consulte o [Butterick's Practical Typography](https://practicaltypography.com/line-spacing.html) e o seu próprio olho para achar uma boa altura de linha para a sua fonte específica. Estou usando um número sem unidade em vez de algo como `px` por causa de [como os elementos filhos herdam o valor](https://perma.cc/7YVZ-53XL), mas você não precisa se preocupar demais com isso agora.

Seguindo, eu gostaria de garantir que os elementos tenham espaçamento igual entre eles. Vou mirar tudo o que está dentro do elemento `<main>` usando um seletor universal, o asterisco (`*`).

```css
main * {
  margin-block-start: 0;
  margin-block-end: 1rem;
  /* or we could use the shortcut syntax like this */
  margin-block: 0 1rem;
}
```

Um seletor pode ser uma cadeia de coisas. Por exemplo, `main p` seleciona todo elemento `<p>` _dentro_ do elemento `<main>`. Mas eu quero mirar _tudo_ no elemento `<main>`, então uso o asterisco.

Estou definindo a margem acima e abaixo de cada elemento. De forma parecida com `margin-inline`, que controla o espaço horizontal ao redor dos elementos, `margin-block` controla o espaço vertical ao redor dos elementos (em idiomas da esquerda para a direita). Estou definindo a margem acima dos elementos como `0` e a margem abaixo deles como `1rem`. O `rem` é uma unidade igual ao tamanho da fonte do **r**oot el**em**ent (o elemento `<html>`). Como eu defini o tamanho da fonte raiz como `20px`, é isso que o valor de `1rem` se torna.

O legal da unidade `rem` é que, ao nos deixar basear valores no tamanho da fonte do documento, ela deixa os designs com uma sensação mais coesa.

O nosso texto está bonito.

![A mesma imagem de antes, mas agora o texto está maior, com uma altura de linha mais generosa.](/assets/img/css-basics-03.webp)

Nada contra o Times New Roman, mas ele tem uma cara muito… _padrão_. Dá para fazer melhor.

## Instalar webfonts

Você só pode usar uma fonte se quem visita tiver ela disponível no aparelho. Embora existam algumas [fontes de sistema comuns](https://practicaltypography.com/system-fonts.html) e [fontes padrão comuns](https://perma.cc/9BMG-EMTU), temos outra opção para personalizar a fonte. _Fontes da web_ (_web fonts_) são aquelas disponibilizadas ao serem baixadas junto com o resto do seu site. Além do documento, dos arquivos CSS, dos arquivos JavaScript, das imagens e por aí vai, fontes personalizadas também podem ser baixadas.

Fontes da web precisam estar num formato específico, e ser _instaladas_ de um certo jeito, por falta de termo melhor. Em geral, as pessoas usam um serviço como [Google Fonts](http://fonts.google.com/) (grátis) ou [Adobe Fonts](https://fonts.adobe.com) (pago). Há [várias](https://typography.com/webfonts) [opções](https://typenetwork.com/), inclusive hospedar as fontes no seu próprio servidor, ao lado dos outros arquivos do site. Só garanta que a licença da fonte cubra isso.

Para simplificar, vamos usar algumas fontes do Google Fonts. Vá até fonts.google.com. Busque “Oswald” e selecione nos resultados. Depois clique em _Get Font_.

![Captura de tela do site Google Fonts mostrando a fonte "Oswald". O botão "Get font" está destacado com uma seta vermelha. O texto de amostra abaixo diz: "Whereas disregard and contempt for human rights have resulted." O menu do site aparece à esquerda.](/assets/img/css-basics-04.webp)

Depois de selecioná-la, não baixe nada ainda. Busque “source sans”. Source Sans 3 é a versão disponível no momento em que eu escrevo. Selecione e clique em _Get Font_.

Quando as duas fontes estiverem selecionadas, clique em _Get embed code_. Estamos procurando o bloco rotulado _Embed code in the `<head>` of your html_.

![Captura de tela da interface do Google Fonts mostrando os detalhes da fonte "Source Sans 3". Há um botão "Copy code" dentro de uma caixa vermelha destacada, que fornece o código de incorporação para HTML. A interface inclui opções de estilo da fonte e instruções de uso.](/assets/img/css-basics-05.webp)

Copie e cole o código de incorporação na seção `<head>` do seu site.

```html
<head>
  <meta charset="UTF-8">
  <title>Planets of the Solar System</title>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Oswald:wght@200..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap" rel="stylesheet">

  <link rel="stylesheet" href="styles.css">
</head>
```

Adicione uma declaração `font-family` ao bloco `html` para conferir se está funcionando.

```css
html {
  font-family: 'Source Sans 3', sans-serif;
  font-size: 20px;
  line-height: 1.45;
}
```

Isso vai definir a fonte para o documento inteiro. O navegador primeiro tenta Source Sans 3. Se, por algum motivo, essa fonte não estiver disponível (se, por exemplo, o Google Fonts estiver fora do ar), então `sans-serif` instrui o navegador a usar qualquer fonte sans-serif disponível. Você pode colocar outras fontes alternativas na _pilha de fontes_. É só separar com vírgulas, como você vê acima.

Recarregue a página, e você deve ver a fonte nova! Mas vamos fazer uma configuração melhor e integrar as duas fontes direito.

## Configurar cores e variáveis

Se você leu o capítulo [Personalizar o Simple.css](/personalizar-o-simple-css), vai lembrar que ele usava variáveis CSS para controlar cor e fontes. Vamos fazer isso aqui também. Isso vai facilitar personalizar depois (o que você pode querer fazer se não gostar das minhas escolhas).

```css
:root {
  --text-color: #303036;
  --muted-text-color: #5e5e67;
  --heading-color: #cd2807;
  --link-color: #028090;
  --background-color: #fffdf7;

  --heading-font: 'Oswald', sans-serif;
  --body-font: 'Source Sans 3', sans-serif;
}
```

Você pode nomear as variáveis como quiser, desde que comecem com `--`. Aqui, estou definindo várias cores e algumas fontes.

Depois de definidas essas variáveis, posso usá-las para aplicar as fontes e a cor ao texto.

```css
html {
  font-family: var(--body-font);
  font-size: 20px;
  line-height: 1.45;
  color: var(--text-color);
  background-color: var(--background-color);
}
```

Use a função `var` para usar as variáveis que criamos.

## Estilos dos títulos

Estou usando um `<h1>` para o título da página e elementos `<h2>` para os subtítulos. Vamos mirar esses e aplicar alguns estilos.

```css
h1 {
  border-block-start: 10px solid var(--heading-color);
  margin-block-start: 4rem;
  margin-block-end: 2rem;
  font-family: var(--heading-font);
  font-weight: normal;
}

h2 {
  margin-block-start: 1.5rem;
  margin-block-end: 0.5rem;
  font-family: var(--heading-font);
  font-size: 1.2em;
  font-weight: normal;
  color: var(--heading-color);
}
```

Estou fazendo várias coisas aqui. Estou adicionando um pouco de margem extra acima dos elementos `<h2>` e um bom tanto de espaço extra acima do `<h1>`.

Eu gosto de como a Oswald — a fonte que estou usando para títulos — fica sem negrito. Então estou definindo `font-weight` como `normal` em vez de `bold`, que é o padrão dos títulos.

{% aside 'Observação' %}
Estamos usando [fontes variáveis](https://perma.cc/A75H-V4HJ), então temos mais opções de peso do que `normal` ou `bold`. Experimente 300, 500, 900 [e por aí vai](https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight).
{% endaside %}

Para o `<h1>`, estou mantendo o `font-size` padrão. Para o `<h2>`, estou definindo o `font-size` como `1.2em`, ou seja, 1,2 vezes o _tamanho de fonte atual_.

Algumas mudanças tipográficas transformaram a nossa página, e ela tem uma cara completamente diferente.

![A página intitulada "Planets of the Solar System" recebeu uma atualização de design. A fonte foi mudada, e as cores da fonte foram atualizadas. O fundo foi renovado para combinar com essas mudanças. O cabeçalho agora tem uma borda no topo. A página parece mais polida e desenhada.](/assets/img/css-basics-06.webp)

Quase poderíamos parar aqui. Não tem nada de tão terrível acontecendo. Mas vamos estilizar alguns dos elementos que ainda não cobrimos.

## Links

Se você estiver usando o meu documento HTML, vai notar alguns hiperlinks, ou tags `<a>`. Um aponta para a fonte da imagem de Saturno que eu usei, e o outro para o site NASA Solar System Exploration. O resto está no rodapé do site.

Vamos estilizá-los um pouco. Eu escolhi uma cor azul-esverdeada e defini como variável, o que vimos antes.

```css
:root {
  /* ... other code ... */

  --link-color: #028090;

  /* ... other code ... */
}
```

Vou usar isso para definir a cor de todos os elementos `<a>`, assim:

```css
a {
  color: var(--link-color);
}
```

Não é uma regra rígida, mas a maioria das pessoas associa texto azul sublinhado a um link clicável. Eu decidi não me afastar demais disso. Mas eu gostaria de adicionar um efeitozinho em que o sublinhado some quando eu passo o mouse por cima.

Vamos usar o seletor de _pseudo-classe_ `:hover` para montar isso. Esses seletores costumam ser usados para estilizar elementos em estados diferentes — por exemplo, um campo de texto desativado (`:disabled`) ou, no nosso caso, um link sobre o qual o ponteiro do mouse está passando.

```css
a:hover {
  text-decoration: none;
}
```

A propriedade que queremos é `text-decoration`. Por padrão, os links têm um `text-decoration` de `underline`. Você tem [algumas opções](https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration) aqui, mas eu vou de `none`.

Isso nos dá uma interação visual sutil com o link.

<video controls>
  <source src="/assets/video/css-basics-1.mp4" type="video/mp4">
  Seu navegador não tem suporte à tag de vídeo. O vídeo mostra uma gravação da tela em que eu passo o mouse sobre o link. O sublinhado some e volta conforme eu faço isso.
</video>

## Abreviações

Falando de efeitos ao passar o mouse, há um que você pode não ter notado. Se olhar o HTML no primeiro parágrafo, vai encontrar a seguinte frase.

```html
In this article, we will explore the distinctive attributes of each planet,
providing an overview of what makes them unique (and learn a little
<abbr title="Cascading style sheets">CSS</abbr> while doing it).
```

A tag `<abbr>` ajuda quem visita a saber o que certas abreviações ou siglas significam. Quando você passa o mouse sobre o termo CSS no documento, recebe uma dica útil mostrando o significado. Você coloca a abreviação dentro das tags e usa o atributo `title` para o texto completo.

Vamos dar um `text-decoration` para sugerir que dá para interagir com isso.

```css
abbr {
  text-decoration: underline;
  text-decoration-style: dotted;
  text-decoration-color: var(--heading-color);
  text-decoration-thickness: 2px;
}
```

Estamos dando um sublinhado, como os links têm por padrão. Mas vamos deixar na cor vermelha que estamos usando para títulos e usar o estilo `dotted`, para ajudar a diferenciar de um link. Eu decidi aumentar um pouco a espessura também, para ficar mais fácil de ver.

## Citações em bloco

Eu seria irresponsável se não citasse Carl Sagan num artigo sobre o sistema solar — mesmo que isto seja só uma demo técnica. Então incluí um trecho épico dele na seção sobre a Terra.

Já está servindo como está — já vem recuado e parece uma citação. Mas dá para melhorar, com certeza. Vou te mostrar o código e depois explicar o que estou fazendo.

```css
blockquote {
  margin-inline: 1.5rem 0;
  border-inline-start: 4px solid var(--heading-color);
  padding-inline: 1rem;
  font-size: 0.9rem;
  color: var(--muted-text-color);
}
```

Eu quero controlar o recuo e deixá-lo mais consistente, baseando-o no tamanho da fonte do documento. Em idiomas da esquerda para a direita, `margin-inline` controla as margens esquerda e direita. Estou fornecendo dois valores, `1.5rem` e `0`, para especificar as margens esquerda e direita, respectivamente. A margem esquerda vai ser 1,5 vezes o tamanho da fonte do documento, e vamos remover a margem direita por completo.

Um estilo talvez comum demais de um elemento `<blockquote>` é dar a ele uma borda esquerda grossa que usa um destaque. Não vejo motivo para ser inconformista aqui, então vou colocar uma borda esquerda usando `border-inline-start`. Lembre-se: `inline` se refere ao eixo horizontal. E `start` significa o primeiro (que é a _esquerda_ para mim; `end` seria o da direita).

Vou definir como uma linha sólida de `4px` de largura, usando a cor dos títulos, que estabelecemos como a cor de destaque da nossa paleta.

Mas temos um problema. Se parássemos aí, teríamos uma borda encostada no texto. Eca.

![Imagem com texto que descreve brevemente a Terra, incluindo uma citação em bloco mal estilizada de Carl Sagan, em que a borda esquerda encosta no texto.](/assets/img/css-basics-08.webp)

Felizmente, podemos corrigir isso adicionando um pouco de `padding`. Vou te dar uma introdução rápida ao [_modelo de caixa_](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model). Todo elemento tem espaço do lado de fora (margem), espaço ao redor do lado de dentro (preenchimento) e uma camada opcional que separa os dois (a borda).

Com esse conhecimento, vamos adicionar algum espaço _dentro_ do elemento, o que vai afastar o conteúdo da borda. Vamos deixar o preenchimento esquerdo e o direito iguais, definindo `padding-inline` com só um valor, `1rem`, que equivale ao tamanho da fonte do documento.

Por fim, vou arredondar o efeito deixando o tamanho da fonte um pouco menor e a cor do texto um pouco mais clara. O resultado final é uma citação em bloco bonita, com um toque de estilo.

![A mesma imagem da citação em bloco de antes, mas o espaço entre a borda e o texto foi aumentado, o tamanho do texto foi reduzido, e a cor do texto ficou um cinza sutil.](/assets/img/css-basics-07.webp)

Eu desenhei este estilo de citação para caber na maioria dos casos, mas você poderia ir em outra direção — chamadas curtas com texto grande e itálico, por exemplo.

## Listas

Vamos resolver rápido a lista com marcadores de Plutão e companhia. Vamos dar à lista um pouco de recuo, como é comum em listas com marcadores. Lembre-se: o HTML também tem listas numeradas. Não estamos usando uma nesta página (se você estiver usando a minha marcação HTML), mas podemos escrever o estilo para os dois tipos de lista.

Você já sabe que o seletor mira os elementos que queremos estilizar. Mas você também pode ter vários seletores! Podemos mirar o elemento `<ul>` e o elemento `<ol>` e dar o mesmo recuo aos dois, fazendo o seguinte.

```css
ul, ol {
  padding-inline-start: 1.5rem;
}
```

Você adiciona vários seletores separando-os com uma vírgula. Isso cria uma _lista de seletores_. O preenchimento que estamos usando para o efeito de recuo vai ser aplicado a _listas não ordenadas_ (com marcadores) e _listas ordenadas_ (numeradas).

Vamos também ajustar o espaço entre os _itens de lista_ individuais (elementos `<li>`). Eu gosto de usar a metade do que uso para parágrafos, porque quero os itens de lista mais juntos do que os parágrafos, mas ainda com um pouco de espaço entre eles. Como usei `1rem` para espaçar os parágrafos e outros elementos, vou usar a metade disso, `0.5rem`, para a margem de baixo.

```css
li {
  margin-block: 0 0.5rem;
}
```

Lembre-se: `margin-block` é a margem de cima e de baixo num idioma da esquerda para a direita, como o português. Podemos definir os dois valores ao mesmo tempo. O trecho acima equivale a:

```css
li {
  margin-block-start: 0;
  margin-block-end: 0.5rem;
}
```

Isso significa que, em idiomas da esquerda para a direita, a margem acima do item de lista é zero, e a margem abaixo é uns dez pixels (`0.5rem` significa 0,5 vezes o tamanho da fonte do **r**oot el**em**ent, que definimos como `20px`).

O espaçamento deve estar bem bonito agora, mas vamos fazer uma coisa que deixaria designers web dos anos 2000 com inveja. Vamos mudar a cor dos marcadores. Isso era complicado, mas agora é moleza.

```css
li::marker {
  color: var(--heading-color);
}
```

O pedaço `::marker` se chama _pseudo-elemento_, porque representa um pedaço de um elemento HTML. O `::marker` é uma parte do _item de lista_, ou elemento `<li>`. Ele contém o marcador (ou o número) do item. Podemos mirá-lo com o nosso seletor e mudar a cor para o vermelho dos títulos.

![Captura de tela da lista com marcadores intitulada "Other Major Bodies", com entradas para Pluto, Ceres, Haumea, Makemake, Eris, Ganymede, Titan e Europa. Há mais espaço entre os itens, o que facilita a leitura. Os marcadores estão vermelhos, enquanto o texto está na mesma cor escura.](/assets/img/css-basics-09.webp)

Ficou bonito!

## Texto pré-formatado

Na maior parte do tempo, nos nossos documentos HTML, não nos importamos em preservar o espaçamento exato de tudo. Na verdade, isso seria contraproducente, porque em geral recuamos o HTML ou incluímos linhas vazias para deixar o código mais legível. Mas, às vezes, queremos mostrar o texto exatamente como está formatado. Exemplos incluem arte ASCII e código de computador.

Em geral, mostramos esse tipo de texto com a tag `<pre>` no HTML. Ela preserva todo o espaçamento e usa uma fonte monoespaçada para deixar tudo consistente. Muitas vezes é combinada com a tag `<code>` para indicar que o texto é código de computador. Eu incluí um pouco de código JavaScript relacionado a planetas como exemplo.

Vamos estilizar a tag `<pre>` assim.

```css
pre {
  padding: 1rem;
  background-color: #edebe7;
  border-radius: 4px;
  overflow-x: auto;
  font-size: 0.75rem;
}
```

Queremos que o código apareça como se estivesse dentro de um contêiner, então vamos dar preenchimento o tempo todo ao redor. Em seguida, vamos definir uma cor de fundo clara, só o bastante visível contra o fundo da página, mas não tão escura a ponto de prejudicar o contraste do texto. Caixas de canto vivo parecem um pouco antinaturais, então vamos adicionar um `border-radius` pequeno, que é só um termo chique para quanto queremos arredondar os cantos.

Poderíamos ter linhas longas de código, então precisamos especificar o que deve acontecer se uma linha transbordar pela lateral do contêiner. Neste caso, vamos definir como `auto`, o que faz o navegador mostrar uma barra de rolagem horizontal no elemento, se precisar.

Por fim, código monoespaçado pode parecer grande, então vamos baixar o tom dizendo que deve ter três quartos do tamanho do texto padrão.

![O exemplo de uma função JavaScript chamada `getPlanetInfo` recebeu um contêiner de fundo sutil e arredondado, e é exibido numa fonte monoespaçada. Esta função recebe o nome de um planeta como entrada e devolve informações sobre o planeta a partir de um objeto 'planets' definido, que guarda fatos únicos sobre cada planeta.](/assets/img/css-basics-10.webp)

## Melhorar o estilo das imagens

Aqui vai como a imagem de Saturno está agora.

![A imagem de Saturno, o sexto planeta a partir do Sol, mostra o seu extenso sistema de anéis. O planeta aparece com uma porção na sombra e os anéis parcialmente iluminados. O texto acima da imagem informa a posição e o tamanho de Saturno no sistema solar. A imagem é mais estreita do que a coluna de texto e, por padrão, é retangular, com cantos vivos.](/assets/img/css-basics-11.webp)

Não está tão ruim, mas parece que a tag `<figure>` está adicionando margem dos dois lados. Eu quero que a imagem ocupe a largura toda. Também quero que a legenda da foto fique menor.

```css
figure {
  margin-inline: 0;
}

figure img {
  display: block;
  margin-inline: auto;
  border-radius: 4px;
}

figcaption {
  margin-block-start: 0.5rem;
  font-size: 0.8rem;
}
```

Vamos remover a margem em linha do `<figure>`. Depois vamos mirar imagens que estão dentro de figures (só temos uma, mas isso pode ser um padrão legal se adicionarmos mais) e fazer o seguinte:

- Definir `display` como `block`. Imagens vêm como `inline` por padrão, mas o comportamento de `block` funciona mais como você esperaria de uma imagem assim.
- Definir a margem em linha como `auto`, caso usemos uma imagem menor do que a largura da página — nesse caso, ela fica centralizada.
- Definir `border-radius` como `4px` arredonda os cantos da imagem só um pouquinho.
- Por fim, vamos reduzir a margem acima da legenda e reduzir o `font-size` para 80% do tamanho da fonte do documento.

![A mesma imagem de Saturno de antes, só que a margem foi removida e os cantos da imagem foram arredondados.](/assets/img/css-basics-12.webp)

Ficou chique! Ajustes pequenos podem fazer uma diferença grande.

## O rodapé

Já temos alguns estilos de rodapé — antes, definimos a largura e garantimos que ficasse centralizado. Mas podemos melhorar dando a ele espaço para respirar, uma bordinha no topo, texto menor e uma cor de texto mais suave.

```css
footer {
  margin-block-start: 3rem;
  margin-inline: auto;
  padding-block: 1.5rem 3rem;
  border-block-start: 2px solid var(--heading-color);
  max-width: 65ch;
  color: var(--muted-text-color);
}
```

Um pouco disso já deve começar a parecer familiar. Estamos criando alguma margem acima do elemento com `margin-block-start`. Estamos adicionando uma borda de `2px` de largura acima do rodapé, usando o nosso vermelho de títulos de sempre. Usando `padding-block`, estamos adicionando algum espaço entre o texto e a borda, e um bom pedaço de preenchimento embaixo para dar folga na parte de baixo da página. Por fim, vamos usar a mesma cor de texto suave que usamos na citação em bloco.

Como já adicionamos a margem que queremos no próprio elemento `<footer>`, vamos remover toda a margem das coisas _dentro_ do rodapé. Vamos usar o nosso amigo, o seletor universal (`*`).

```css
footer * {
  margin: 0;
  font-size: 0.9rem;
}
```

Este seletor vai mirar tudo o que está _dentro_ da tag `<footer>`. Vamos definir `margin` como `0` e reduzir o texto para 90% do tamanho da fonte do documento.

## Diversão tipográfica extra

Poderíamos parar aqui de vez, _mas_… vamos nos divertir um pouco.

Olhando o primeiro parágrafo na marcação, eu dei a ele uma classe `intro`. Vamos dar um pouco de ênfase deixando o texto um pouco maior.

```css
.intro {
  margin-block-end: 2rem;
  font-size: 1.2em;
}
```

Quando colocamos um ponto antes de um termo num seletor CSS, isso significa que queremos mirar todo elemento que tem aquela classe (uma classe `intro`, neste caso). Isso vai deixar o `font-size` maior do que o tamanho de texto padrão do documento. E, com a fonte maior, precisa de um pouco de margem extra embaixo.

Beleza, mas agora vamos ficar _bem extra_. Olhe a marcação de novo, e você vai notar que eu envolvi as três primeiras palavras numa tag `<span>` com uma classe `caps`.

```css
.caps {
  text-transform: uppercase;
  font-size: 0.78em;
  font-weight: 600;
  letter-spacing: 0.1em;
}
```

Isso vai nos dar aquele efeito chique de livro, em que as primeiras palavras ficam em versalete. Em geral, você ia querer usar uma fonte com [versalete de verdade](https://practicaltypography.com/small-caps.html), mas dá para fazer uma falsificação decente, já que Source Sans 3 é uma fonte variável.

A declaração `text-transform` vai deixar todas as letras em maiúsculas. É melhor fazer isso com CSS do que digitar tudo em maiúsculas na mão, porque é mais uma coisa de estilo. Para o `font-size`, eu só fui mexendo até ficar com a cara certa. No fundo, eu queria que as maiúsculas tivessem a mesma altura das letras minúsculas do texto de introdução (ou seja, a [altura-x](https://en.wikipedia.org/wiki/X-height)).

Para ajudar no equilíbrio, estou aumentando um pouco o `font-weight`. Além de valores como `normal` e `bold`, você pode usar os valores numéricos de 100 a 900 se a fonte suportar — e a nossa fonte variável suporta.

Por fim, você se beneficia de aumentar o espaço entre as letras ao usar todas em maiúsculas. Estou usando a unidade `em`, que se baseia no `font-size` atual. Isso é útil porque, se você mudar o `font-size` no futuro, o espaçamento muda na mesma proporção.

![Captura de tela do título *Planets of the Solar System*. O texto abaixo descreve o sistema solar. O tamanho do texto foi aumentado, e a primeira frase do parágrafo foi renderizada em versalete.](/assets/img/css-basics-13.webp)

E aí está. Dos começos humildes como uma página _sem estilo_, com um charme simples, agora está com cara de artigo de autoridade.

## Potencial sem limite

Estes são só os estilos que eu escolhi com base nas minhas preferências. Você poderia ir em todo tipo de direção diferente. Não estou necessariamente tentando empurrar um estilo para você — embora eu tenha te apontado para alguns princípios tipográficos geralmente bons de seguir. Eu só queria te dar um gostinho de como você pode aplicar os seus próprios estilos a uma página.

A mágica do CSS é que você poderia pegar o meu HTML exato — sem mudanças — e criar um design completamente diferente a partir do mesmo ponto de partida. Essa é a premissa de um experimento web chamado [CSS Zen Garden](https://csszengarden.com/), em que as pessoas enviam designs com base na mesma marcação.

<figure>
  <img src="/assets/img/css-basics-14.webp" alt="Captura de tela de duas páginas do projeto CSS Zen Garden. A página da esquerda tem um design colorido e vibrante, com uma paleta rosa, roxa e laranja. A da direita tem um design minimalista e limpo, com fundo cinza-claro e texto azul. As duas mostram o que o CSS consegue fazer no design.">
  <figcaption>Estes dois designs compartilham o mesmo código HTML. <a href="https://www.youtube.com/watch?v=Iloby6ZXRjI">São a mesma foto.</a></figcaption>
</figure>

Espero que este capítulo bônus tenha te dado um gostinho do que é possível com CSS. Assim como com HTML, até um pouco de conhecimento de CSS já vale — uma simples mudança de fonte e cor, por exemplo, pode fazer uma diferença enorme. Eu te animo a continuar explorando CSS se você quiser criar designs personalizados. É uma habilidade recompensadora de ter.

## A seguir