-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.html
2473 lines (2342 loc) · 131 KB
/
index.html
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
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>Formation CSS</title>
<link rel="stylesheet" href="dist/reset.css" />
<link rel="stylesheet" href="dist/reveal.css" />
<link rel="stylesheet" href="dist/theme/black.css" />
<link rel="stylesheet" href="dist/custom.css" />
<!-- Theme used for syntax highlighted code -->
<link rel="stylesheet" href="plugin/highlight/monokai.css" />
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<section>
<h1>CSS</h1>
<h2>- Les bases -</h2>
</section>
</section>
<section>
<section>
<h1>> Le CSS késako ?</h1>
</section>
<section>
<h3>Un langage Web</h3>
<p>
Le CSS (pour Cascading Style Sheets) est un langage de "programmation" utilisé pour décrire
l'apparence d'une page écrite dans un langage markup comme le HTML (d'autres langages, tels
le SVG peuvent aussi avoir leurs feuilles de style).
</p>
<p>
Tout d'abord, faisons la chasse à un préjugé :
<strong>« Le CSS, ce n'est pas simple. »</strong>
</p>
<p>
Dans la mesure où le CSS ne permet pas de faire d'algorithmes, il est souvent perçu comme un
langage facile à utiliser, et donc un langage facile. Mais il s'agit de deux choses
différentes : n'importe qui peut écrire une feuille de style, mais écrire la feuille de
style répondant à la charte graphique fournie par votre graphiste nécessite une connaissance
des propriétés et du fonctionnement de CSS. Et ça n'est pas si simple que ça.
</p>
</section>
<section>
<h3>Un langage web</h3>
<p>CSS, c'est :</p>
<ul>
<li>Plus de 300 propriétés, et des nouvelles l'enrichissent régulièrement.</li>
<li>Une infinité de déclarations possibles par sélecteurs.</li>
<li>Une infinité de sélecteurs possibles par élément du DOM.</li>
<li>une infinité d'éléments du DOM ciblables par sélecteur.</li>
</ul>
</section>
<section>
<h3>Un langage web</h3>
<p>
Bien évidemment, ce n'est pas parce qu'une infinité de sélecteurs peuvent exister pour un
élément qu'il faut tous les utiliser, bien au contraire, mais on retrouve fréquemment dans
nos applications des erreurs dues aux propriétés mentionnées ci-dessus :
</p>
</section>
<section>
<h3>Un langage web</h3>
<ul>
<li>
propriétés inutiles (qui ne s'appliquent pas à l'élément ciblé, ou qui sont surchargées
par ailleurs),
</li>
<li>
même sélecteur figurant dans différents fichiers / endroits de notre feuille de style,
</li>
<li>
plusieurs sélecteurs pour styler le même élément (avec le risque de ne pas comprendre
lequel est utilisé et de finir par utiliser l'honni "!important"),
</li>
<li>
des sélecteurs définis de façon trop peu précise et qui modifient l'apparence d'éléments
non voulus.
</li>
</ul>
</section>
<section>
<h3>Un langage web</h3>
<p>
Dans nos projets, on écrit beaucoup de CSS, probablement trop, sans trop comprendre comment
l'utiliser.
</p>
<p>
Ce premier module couvrira les bases du CSS : à quoi ça ressemble, comment il s'ajoute dans
une application, sur une page, à quoi il peut s'appliquer. Nous définirons ce qu'est un
sélecteur. Nous étudierons la cascade des styles pour déterminer quel sélecteur s'applique à
quel élément du DOM.
</p>
</section>
<section>
<h3>Un langage web</h3>
<p>
Des liens intéressants à garder en marque-page seront fournis tout du long, n'hésitez pas à
les conserver.
</p>
<p>
Un premier lien : <a href="https://drafts.csswg.org/indexes/" target="_blank"
>l'index CSS du CSS working group du W3C</a
> qui liste toutes les propriétés, leurs valeurs, la grammaire utilisée pour appeler leur
valeur (moins utile), les fonctions, les règles @ et les sélecteurs du langage qui sont
référencés dans une spécification CSS du W3C. Et ça en fait beaucoup.
</p>
</section>
</section>
<section>
<section>
<h1>> A quoi ça ressemble ?</h1>
</section>
<section>
<h3>Ca ressemble à quoi, le CSS ?</h3>
<p>Le CSS, ça ressemble à ça :</p>
<pre>
<code class="css" data-trim>
<script type="text/template">
.quality-box {
width: calc(20% - 20px);
margin: 10px;
display: inline-block;
}
</script>
</code>
</pre>
</section>
<section>
<h3>Ca ressemble à quoi, le CSS ?</h3>
<p>
Ici, on a décrit la classe CSS appelée "quality-box", qui a pour propriétés une largeur
faisant 20% de son conteneur parent auquel on retirera 20 pixels, des marges de 10 pixels de
chaque côté, et un affichage de type inline-block, à savoir gardant les propriétés de
l'affichage block tout en s'affichant à la droite de l'élément inline qui le précède (là où
un élément block se positionnerait en dessous).
</p>
<p>Ces propriétés seront étudiées dans un module ultérieur.</p>
</section>
<section>
<h3>Comment appliquer cette classe à ma page ?</h3>
<p>Comme ça :</p>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<div class="quality-box">
{...}
</div>
</script>
</code>
</pre>
</section>
<section>
<h3>Comment appliquer cette classe à ma page ?</h3>
<p>
Sur l'élément HTML div, on ajoute l'attribut class et la valeur vaut la ou les classes qu'on
souhaite appliquer. A noter : une classe commence par un point dans le fichier de style,
mais on ajoute son nom sans le point dans l'attribut class.
</p>
<p>
Dans le cas où vous travaillez avec React en JSX, class étant un mot JS réservé, l'attribut
à utiliser est className.
</p>
<p>
Si vous utilisez des CSS modules, la valeur de l'attribut className vaut le nom que vous
avez choisi quand vous avez importé votre CSS. Ce dernier point sera traité dans la
formation CSS avancé, activité CSS Modules.
</p>
</section>
<section>
<h3>Sur quels éléments ai-je le droit d'ajouter une classe ?</h3>
<p>
Il est possible d'ajouter une classe sur la majorité des éléments du DOM ayant une
représentation graphique (n'allez pas mettre de classe sur la balise script s'il vous
plait).
</p>
<p>Ainsi, l'ensemble des balises HTML est concerné, mais aussi SVG.</p>
<p>
Petit rappel : le HTML a été enrichi à l'occasion d'HTML5 (vous en avez probablement entendu
parler) de balises appelées balises sémantiques. Là où des balises comme div ou span sont
agnostiques (on y met le contenu qu'on veut), de nouvelles balises plus précises sont nées
telles que :
</p>
<p>
<strong> header / nav / article / aside / footer </strong>
</p>
</section>
<section>
<h3>Sur quels éléments ai-je le droit d'ajouter une classe ?</h3>
<div style="display: flex">
<div style="flex: 1; font-size: 0.6em">
<p>
En passant : si div et span sont agnostiques quant à leur contenu, il existe une
règle méconnue : on ne met pas de div dans un span.
</p>
<ul>
<li>div est fait pour afficher un bloc de contenu.</li>
<li>span est fait pour afficher du texte de façon linéaire.</li>
</ul>
<p>
Les propriétés CSS des feuilles de style des navigateurs traduisent ce fait :
les div sont en display: block, les span en display: inline par défaut.
</p>
<p>
N'allez donc pas mettre un bloc dans une balise faite pour du texte s'il vous plait.
</p>
</div>
<div style="flex: 1">
<img src="img/layout.png" alt="Layout" />
</div>
</div>
</section>
</section>
<section>
<section>
<h1>> Inclure le CSS</h1>
</section>
<section>
<h3>Présentation</h3>
<p>
Les styles CSS (la définition des classes et leurs propriétés associées) peuvent exister à
de multiples endroits :
</p>
<ul>
<li>Au sein de la page dans une balise style. On parle de styles embedded.</li>
<li>
Au sein de la page, dans l'attribut style d'un élément du DOM. On parle de
styles inline.
</li>
<li>Au sein d'une feuille de style, qui sera importée dans la page.</li>
</ul>
</section>
<section>
<h3>Présentation</h3>
<p>Il est fortement déconseillé d'utiliser des styles embedded ou inline !</p>
<p>
En effet, cela cause des problèmes de maintenabilité (avec du code déporté sur les pages),
de compréhension (les styles inline sont prioritaires, on le verra plus tard dans ce
module).
</p>
<p>
Néanmoins, dans certains cas très spécifiques, il est possible que vous ayez à utiliser des
styles inline : notamment dans le cas de composants JS où le style appliqué dépend
directement de la valeur d'une variable JS (il est possible sinon d'utiliser une custom
property cependant, mais cela fera partie du module CSS avancé, sans compter que
l'utilisation de custom properties est conditionnée à leur compatibilité avec le navigateur,
par exemple, pas IE11).
</p>
</section>
<section>
<h3>Le style embedded</h3>
<p>
On peut voir ici une balise HTML style dans lequel le code CSS est ajouté. Petit rappel :
n'utilisez JAMAIS de CSS embedded.
</p>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Application de démo</title>
<style>
body {
padding:0;
margin:0;
}
</style>
</head>
<body>
// le contenu de la page
</body>
</html>
</script>
</code>
</pre>
</section>
<section>
<h3>Le style inline</h3>
<p>
On peut voir l'attribut style sur la balise body. A éviter également, à n'utiliser que si on
a des styles variables sans la possibilité d'utiliser des custom properties CSS.
</p>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Application de démo</title>
</head>
<body style="border:1px solid red;">
// le contenu de la page
</body>
</html>
</script>
</code>
</pre>
</section>
<section>
<h3>Les feuilles de style</h3>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Application de démo</title>
<link rel="stylesheet" href="./styles/mes-styles.css">
</head>
<body>
// le contenu de la page
</body>
</html>
</script>
</code>
</pre>
<p>et dans un fichier appelé ici mes-styles.css :</p>
<pre>
<code class="css" data-trim>
<script type="text/template">
body {
padding:0;
margin:0;
}
</script>
</code>
</pre>
</section>
<section>
<h3>Les feuilles de style</h3>
<p>
Le principe est de mettre toutes les définitions de style au sein de feuilles de style, des
fichiers séparés, qui sont importés dans la page par l'utilisation de la balise link avec
l'attribut rel valant stylesheet (la balise link sert à importer des fichiers externes,
l'attribut rel à définir la relation que ce fichier aura avec la page, et la
valeur stylesheet à mentionner que le fichier est un fichier de style).
</p>
</section>
<section>
<h3>Les styles conditionnels</h3>
<p>
Enfin, il est possible d'avoir des feuilles de style conditionnelles pour les version
d'Internet Explorer < 10.
</p>
<p>
Cela permet de charger des styles supplémentaires dans le cas où l'on répond aux conditions
fournies. On peut importer une feuille de style de façon conditionnelle de cette façon :
</p>
</section>
<section>
<h3>Les styles conditionnels</h3>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Application de démo</title>
<!--[if IE 7]><link rel="stylesheet" type="text/css" href="screen-ie7.css" /><![endif]-->
</head>
<body>
// le contenu de la page
</body>
</html>
</script>
</code>
</pre>
<p>notez le commentaire conditionnel:</p>
<pre>
<code class="hljs" data-trim>
<script type="text/template">
<!--[if IE 7]> et <![endif]-->
</script>
</code>
</pre>
</section>
</section>
<section>
<section>
<h1>> Les selecteurs</h1>
</section>
<section>
<h3>Qu'est-ce qu'un sélecteur CSS ?</h3>
<p>
Un sélecteur CSS, c'est la chaîne permettant de cibler les éléments du DOM qui seront
concernés par les styles définis.
</p>
<pre>
<code class="css" data-trim>
<script type="text/template">
ul > li.title {
font-size: 36px;
font-weight: bold;
}
</script>
</code>
</pre>
<p>le sélecteur est « ul > li.title »</p>
<p>
Il signifie qu'on ciblera uniquement les éléments li qui sont les enfants directs d'un
élément ul, et qui ont l'attribut class contenant la valeur title.
</p>
</section>
<section>
<h3>Les sélecteurs élémentaires</h3>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>*</td>
<td>
cible n'importe quel élément de la page. Dans les faits on s'en sert pour définir
les valeurs par défaut appliquées sur la page, telles la couleur de base et/ou la
taille de base de la police.
</td>
</tr>
<tr>
<td>B</td>
<td>
correspond à une balise du DOM (par exemple div ou span ou ul ou table ou svg). Sans
plus de précision, toutes ces balises seront concernées par les styles associés.
</td>
</tr>
<tr>
<td>.warning</td>
<td>
Ici on définit une classe CSS, du nom de warning. La définition d'une classe CSS
commence par un point. Son utilisation sur la page se fait sans le point (par
exemple, on aurait ici <div class="warning">. Tous les éléments du DOM dont
l'attribut class contient le nom de la classe sont ciblés.
</td>
</tr>
<tr>
<td>#myid</td>
<td>
Ici, on cible un identifiant donné. Tout élément du DOM peut se voir attribuer un
identifiant, sous la forme <div id="myId">. Dans la feuille de style, on peut
cibler l'élément ayant un identifiant donné en le préfixant de #. Petit rappel : un
identifiant doit être unique sur l'intégralité de la page.
</td>
</tr>
</table>
</section>
<section>
<h3>Qu'est-ce qu'un sélecteur CSS ?</h3>
<p>
Pour toute la suite, on utilisera E (pour Elément) comme base sur laquelle on applique les
différentes variantes de sélecteurs : il s'agit ici d'une facilité d'écriture, et dans toute
la suite, E peut être remplacé par n'importe quel sélecteur. Les types de sélecteurs décrits
peuvent s'appliquer à tout sélecteur, pas uniquement aux éléments du DOM.
</p>
<p>
Si vous lisez <strong>E</strong>:first-child, cela peut vouloir dire
"<strong>div</strong>:first-child", comme cela pourrait être
"<strong>.warning</strong>:first-child" (qui veut dire un élément possédant l'attribut class
ayant pour valeur "warning" et qui est le premier enfant de son parent) ou "<strong
>ul.ma-liste</strong
>
> <strong>li.mon-item</strong>:first-child". Si une balise doit être utilisée explicitement
pour la règle, cela sera mentionné dans la description (par exemple pour :nth-of-type).
</p>
</section>
<section>
<h3>Les sélecteurs sur attributs</h3>
<p>
Il est possible de cibler des éléments en fonction des attributs existant sur la balise du
DOM, voire de leurs valeurs
</p>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
<th>Exemples</th>
</tr>
<tr>
<td>E[foo]</td>
<td>Un élément E du DOM ayant l'attribut foo qu'il ait une valeur ou non.</td>
<td>
<div data-focus="test"> ou <div data-focus> seront ciblés
par div[data-focus]
</td>
</tr>
<tr>
<td>E[foo="bar"]</td>
<td>Un élément E du DOM dont l'attribut foo a pour valeur bar.</td>
<td><div data-focus="test"> sera ciblé par div[data-focus="test"]</td>
</tr>
</table>
</section>
<section>
<h3>Les sélecteurs sur attributs</h3>
<table>
<tr>
<td>E[foo~="bar"]</td>
<td>
Un élément E du DOM dont l'attribut foo est une liste de valeurs séparées par un
espace, dont l'une a pour valeur bar.
</td>
<td>
<div data-focus="test"> et <div data-focus="test item "> seront ciblés
par div[data-focus~="test"]
</td>
</tr>
<tr>
<td>E[foo^="bar"]</td>
<td>Un élément E du DOM dont l'attribut foo commence par bar.</td>
<td>
<div data-focus="testdecomposant"> et <div data-focus="test"> seront
ciblés par div[data-focus^="test"]
</td>
</tr>
<tr>
<td>E[foo$="bar"]</td>
<td>Un élément E du DOM dont l'attribut foo termine par bar.</td>
<td>
<div data-focus="pasuntest"> et <div data-focus="test"> seront ciblés
par div[data-focus$="test"]
</td>
</tr>
</table>
</section>
<section>
<h3>Les sélecteurs sur attributs</h3>
<table>
<tr>
<td>E[foo*="bar"]</td>
<td>Un élément E du DOM dont l'attribut foo contient bar.</td>
<td>
<div data-focus="pasuntest">, <div data-focus="testdecomposant">,
<div data-focus="ceciestuntestdecomposant"> et <div
data-focus="test"> seront ciblés par div[data-focus*="test"]
</td>
</tr>
<tr>
<td>E[foo|="bar"]</td>
<td>
Un élément E du DOM dont l'attribut foo vaut bar ou commence par bar suivi d'un
tiret
</td>
<td>
<div data-focus="test"> et <div data-focus="test-composant"> seront
ciblés par div[data-focus|="test"] mais pas <div data-focus="test
test2"> ni <div data-focus="testcomposant">
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-classes</h3>
<p>
Ne sont pas des classes. Il s'agit d'une syntaxe permettant de cibler certains éléments en
fonction de caractéristiques qui ne peuvent pas être déduites du DOM comme leur état ou leur
"ordre". Cela permet d'ajouter plus de précision sur les sélecteurs.
</p>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>:root</td>
<td>
<div>
Permet de cibler la racine du document. S'utilise uniquement sous la forme :root
{ /* styles */ } sans spécifier d'élément, la racine étant la racine.
</div>
<div>
On s'en sert souvent pour donner les valeurs par défaut des custom
properties (que l'on verra ultérieurement).
</div>
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-classes</h3>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E:first-child</td>
<td>
Permet de cibler un élément E qui est le premier enfant de son parent, tous types
confondus.
</td>
</tr>
<tr>
<td>E:nth-child(n)</td>
<td>
Permet de cibler un élément E qui est le n-ième enfant de son parent, tous types
confondus. n est un entier.
</td>
</tr>
<tr>
<td>E:nth-last-child(n)</td>
<td>
Permet de cibler un élément E qui est le n-ième enfant de son parent en partant de
la fin, tous types confondus. n est un entier.
</td>
</tr>
<tr>
<td>E:last-child</td>
<td>
Permet de cibler un élément E qui est le dernier enfant de son parent, tous types
confondus.
</td>
</tr>
<tr>
<td>E:only-child</td>
<td>
Permet de cibler un élément E s'il est l'enfant unique de son parent, tous types
confondus.
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-classes</h3>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E:first-of-type</td>
<td>
Permet de cibler un élément E qui est le premier enfant de son parent, pour le type
fourni (E doit contenir une balise à laquelle :first-of-type s'applique).
</td>
</tr>
<tr>
<td>E:nth-of-type(n)</td>
<td>
Permet de cibler un élément E qui est le n-ième enfant de son parent, pour le type
fourni (E doit contenir une balise à laquelle :nth-of-type s'applique). n est un
entier.
</td>
</tr>
<tr>
<td>E:nth-last-of-type(n)</td>
<td>
Permet de cibler un élément E qui est le n-ième enfant de son parent en partant de
la fin, pour le type fourni (E doit contenir une balise à laquelle :nth-last-of-type
s'applique). n est un entier.
</td>
</tr>
<tr>
<td>E:last-of-type</td>
<td>
Permet de cibler un élément E qui est le dernier enfant de son parent, pour le type
fourni (E doit contenir une balise à laquelle :last-of-type s'applique).
</td>
</tr>
<tr>
<td>E:only-of-type</td>
<td>
Permet de cibler un élément E s'il est l'enfant unique de son parent, pour le type
fourni (E doit contenir une balise à laquelle :only-of-type s'applique).
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-classes</h3>
<p>
Comme on peut le voir, on a des instructions très proches, avec une différence qui est le
"type".
</p>
<p>Si on utilise la version "-child", on comptera tous les enfants.</p>
<p>
Si on utilise la version "-of-type", on comptera uniquement les enfants du type fourni avant
la pseudo-classe.
</p>
<p>
Dans les deux cas, si l'enfant correspondant à l'indication est du type qu'on a fourni avant
la pseudo-classe, le style sera appliqué, sinon il ne le sera pas.
</p>
</section>
<section>
<h3>Les pseudo-classes</h3>
<img src="img/pseudo_class.png" alt="pseudo classes" />
</section>
<section>
<h3>Les pseudo-classes</h3>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E:empty</td>
<td>Permet de cibler un élément E qui n'a aucun enfant ni contenu.</td>
</tr>
<tr>
<td>E:link</td>
<td>
Permet de cibler un élément E qui est un lien dont la cible n'a pas encore été
visitée.
</td>
</tr>
<tr>
<td>E:visited</td>
<td>Permet de cibler un élément E qui est un lien dont la cible a été visitée.</td>
</tr>
<tr>
<td>E:active</td>
<td>
Permet de cibler un élément E qui est actif (généralement, sur lequel on clique).
</td>
</tr>
<tr>
<td>E:hover</td>
<td>Permet de cibler un élément E au-dessus duquel le pointeur flotte.</td>
</tr>
<tr>
<td>E:focus</td>
<td>
Permet de cibler un élément E qui "ciblé" (typiquement un champ de saisie dans
lequel on a cliqué).
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-classes</h3>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E:target</td>
<td>
Permet de cibler un élément E qui est la cible d'une URL (par exemple une ancre).
</td>
</tr>
<tr>
<td>E:lang(fr)</td>
<td>
Permet de cibler un élément E pour le langage spécifié (l'attribut lang="/* la
langue */" peut être ajouté à des éléments HTML).
</td>
</tr>
<tr>
<td>E:enabled</td>
<td>
Permet de cibler un élément E qui n'est pas désactivé (sert surtout en relation avec
la pseudo-classe suivante).
</td>
</tr>
<tr>
<td>E:disabled</td>
<td>
Permet de cibler un élément E qui est désactivé (si on a un input qui ne doit pas
être actif / qui n'est actif que dans certains états de la page, on peut lui ajouter
l'attribut disabled, et cette pseudo-classe permet de le cibler).
</td>
</tr>
<tr>
<td>E:checked</td>
<td>Permet de cibler un élément E qui est coché (radio-bouton ou checkbox).</td>
</tr>
<tr>
<td>E:not(s)</td>
<td>
Permet de cibler un élément qui ne correspond pas au sélecteur s (s est un sélecteur
écrit sans guillemets l'encadrant).
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-éléments</h3>
<p>
Les pseudo-éléments offrent accès à de l'information ou de contenu qui n'est pas directement
accessible par le DOM; Par exemple, on pourra ajouter un élément non présent dans le DOM
avec ::before ou ::after (les deux pseudo-éléments les plus importants car permettant de
faire beaucoup, beaucoup de choses).
</p>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E::first-line</td>
<td>Permet de cibler la première ligne d'un texte dans l'élément E.</td>
</tr>
<tr>
<td>E::first-letter</td>
<td>Permet de cibler la première lettre d'un texte dans l'élément E.</td>
</tr>
<tr>
<td>E::before</td>
<td>
Permet de cibler du contenu généré supplémentaire situé avant les enfants de
l'élément E dans le DOM.
</td>
</tr>
<tr>
<td>E::after</td>
<td>
Permet de cibler du contenu généré supplémentaire situé après les enfants de
l'élément E dans le DOM.
</td>
</tr>
</table>
</section>
<section>
<h3>Les pseudo-éléments</h3>
<div style="display: flex">
<div style="flex: 1; font-size: 0.6em">
<p>
::before et ::after peuvent paraître un peu vague, il est utile de comprendre ce
qu'ils font pour les utiliser.
</p>
<p>
Comme on peut le voir ci-dessus, ::before et ::after permettent d'accéder à deux
couches de contenu / de style supplémentaires pour un élément donné. Ils seront
affichés derrière le contenu de l'élément, mais devant l'élément (la box) lui-même.
</p>
<p>
<strong>
Pour que ces couches soient affichées, elles doivent avoir l'attribut CSS
content avec une valeur non nulle !
</strong>
</p>
<p>
<strong>
Quelques exemples : <a href="https://codepen.io/c3dr0x/full/ExXMNRZ" target="_blank"
>https://codepen.io/c3dr0x/full/ExXMNRZ</a
>
</strong>
</p>
</div>
<div style="flex: 1">
<img src="img/pseudo_elements.png" alt="pseudo éléments" />
</div>
</div>
</section>
<section>
<h3>Les combinaisons</h3>
<p>Après avoir vu tous ces sélecteurs, reste encore à les mélanger !</p>
<table>
<tr>
<th>Motif</th>
<th>Description</th>
</tr>
<tr>
<td>E F</td>
<td>
Permet de cibler tout élément F descendant d'un élément E quel que soit le degré de
profondeur !
</td>
</tr>
<tr>
<td>E > F</td>
<td>Permet de cibler tout élément F directement enfant d'un élément E.</td>
</tr>
<tr>
<td>E + F</td>
<td>
Permet de cibler un unique élément F directement précédé dans le DOM d'un élément E
et frère de cet élément E.
</td>
</tr>
<tr>
<td>E ~F</td>
<td>
Permet de cibler tout élément F précédé dans le DOM d'un élément E et frère de cet
élément E.
</td>
</tr>
<tr>
<td>.style1.style2</td>
<td>
Lorsque 2 classes CSS sont collées, on cible tout élément dont l'attribut classe
contient les deux valeurs (l'ordre n'importe pas)
</td>
</tr>
</table>
</section>
<section>
<h3>Les combinaisons</h3>
<p>On obtient des sélecteurs du genre :</p>
<ul>
<li>
<strong>.c-employee-picture > div span:last-child</strong>
: tout élément span étant le dernier enfant de son parent, inclus dans un div
(potentiellement à plusieurs niveaux de parenté) qui est le descendant direct d'un
élément donc la classe vaut "c-employee-picture"
</li>
<li>
<strong>form[data-loading='true'] [data-focus='panel']::after</strong>
: le pseudo-élément after d'un élément dont l'attribut data-focus vaut "panel",
descendant (potentiellement à plusieurs niveaux de parenté) d'un formulaire dont
l'attribut data-loading vaut "true«
</li>
</ul>
</section>
<section>
<h3>Les combinaisons</h3>
<p>
Voilà pourquoi il est important de bien définir ses sélecteurs ! Mal définis, on prend le
risque d'avoir des sélecteurs ciblant trop d'éléments; ou trop longs, ou difficiles à
surcharger (le deuxième exemple ici est une surcharge d'un style de Focus2).
</p>
</section>
<section>
<h3>Les combinaisons</h3>
<p>
Bon, ça c'est pour vous faire peur : dans les faits, les sélecteurs ressembleront plus à :
</p>
<ul>
<li>
<strong> .c-dashboard-item--selected </strong>
: l'élément ayant la classe "c-dashboard-item--selected". Ce sélecteur répond à la norme
BEM dont on parlera dans le module "les préprocesseurs, et la pratique"
</li>
<li>
<strong> .c-btn:hover </strong>
: pour définir le comportement au hover d'un élément dont la classe est "c-btn" (un
bouton, étonnamment)
</li>
</ul>
<p>
Il est conseillé d'éviter d'avoir des sélecteurs trop complexes : généralement une classe
suffit. Ces considérations seront plus développées dans le module "les préprocesseurs, et la
pratique".
</p>
</section>
</section>
<section>