CC-BY-NC-4.0 / Jul. 2020 / Loïc TRUCHOT
html basics
IP -> TCP -> HTTP -> HTML/CSS/JS
Server <--> Client
Comme un restaurant
Comme des poupées russes
burger party 1/3
burger party 2/3
h1 {
color: blue;
background-color: red;
font-size: 16px;
}
Text
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" type="text/css" href="index.css">
La feuille de style donne une série de propriétés (properties) pour chaque balise
body {
background-color: yellow;
}
h1 {
color: pink;
text-transform: uppercase;
}
<p class="bg-blue">test</p>
<div class="bg-blue">test</div>
<div id="division-1">test</p>
.bg-blue {
background-color: blue;
color: white;
}
#division-1 {
text-transform: uppercase;
}
...aucune id.
Le . indique la class, le # indique l'id
burger party 3/3
.pain {
background-image: url(pain.jpg);
background-size: 100% 100%;
width: 200px; height: 50px;
}
<div class="pain"></div>
<a href="#bas">go to footer</a>
<a name="bas"></a>
<a href="contact.html">contact me !</a>
<a href="https://fr.wikipedia.org/wiki/PageRank">En savoir plus</a>
Créer les 3 types de liens sur votre page web:
Bonus 2: trouver une manière pour que le liens vers un site externe ouvre une nouvelle fenêtre
le portail d'hyperliens
<img src="https://autocollant-sticker.com/flocon-neige.jpg" />
Bonus 1 : la taille de votre image est contrôlée grâce à CSS
↓ Alternative ↓
Bonus 2: musique sur ce site, et images selon les moments de l'aventure
la sérendipité dans les années 80
<img src="https://lone-wolf.com/warrior-girl.jpg" />
Bonus 1: taille et bordure des images contrôlée grâce à CSS
display: block;
display: inline;
display: inline-block;
width, height, margin, padding, border, background, text-align, position...
color, font, text-decoration, text-transform, line-height, letter-spacing...
Dont les rameaux terminaux sont « inlines »
Dont les feuilles sont de la donnée textuelle (inline par nature)
dont le tronc est <html>
dont les deux principales branches sont <head> et <body>
Les élements en ligne ne devraient pas contenir de blocks...
Encyclopédie des créatures 1 / 2
Bonus: trouvez une façon de mettre la liste à gauche de l'image
VS code extension et format on save:
Prettier - Code formatter + settings
"editor.formatOnSave": false,
"[css]": {
"editor.formatOnSave": true
},
"[html]": {
"editor.formatOnSave": true
},
"editor.renderWhitespace": "all"
Encyclopédie des créatures 2 / 2
Bonus: ayez une classe globale. Tous vos sélecteurs dépendent de cette classe
↓ Alternative ↓
Portail des musées
Bonus: le footer contient des liens vers 3 réseaux sociaux, sous formes d'icônes cliquables
Bonus 2: trouvez en ligne des générateurs gratuits de chartes de couleurs et de logos
background-image: linear-gradient(red 0%, orange 25%, yellow 50%, green 75%, blue 100%);
box-sizing: border-box;
border-radius: 10px 5px;
border-radius: 50%;
/* offset-x | offset-y | blur | spread | color */
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
/* Toto's cheatsheet: center */
.soleil {
position: absolute;
left: 50%;
transform: translateY(-50%);
}
Un coucher de soleil
Bonus: animez vos éléments au survol
Bonus 2: le seul fichier à la racine est index.html (les autres sont tous dans des sous-dossiers)
Concours du plus beau coucher de soleil avec
un peu de souplesse
Tamagotchi 1/2
Bonus: lorsqu'on clique sur les boutons, des alertes javascript indiquent ce qu'on aimerait qu'il se passe
Des styles bien alignés
police partout, compatibilité nulle-part
@font-face {
font-family: 'Roboto';
src: url('roboto.eot?') format('eot'),
url('roboto.otf') format('truetype'),
url('roboto.woff') format('woff'),
url('roboto.svg#Roboto') format('svg');
font-weight: normal;
font-style: normal;
}
h4 {
font-family: 'Roboto', sans-serif;
font-size:3em;
}
Styliser le texte du précédent projet
Tamagotchi 2/2
Bonus: toutes vos classes de texte commencent par text-... , toutes vos classes de block sont imbriquées et finissent par ...-container
<link
rel="stylesheet"
href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css"
integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p"
crossorigin="anonymous">
Police d'icône
Bonus 1: lorsqu'on clique sur play, ça lance votre chanson préférée
Bonus 2: lorsqu'on clique sur le bouton "play", cela devient un bouton "pause" et vice versa
Bonus 3: lorsqu'on clique sur play, le range avance tout seul !
# install git bash
# bind to VSCode terminal
mkdir parcel_test
cd parcel_test
npm init
npm install --save parcel-bundler
touch index.html
touch style.css
# edit index.html with ! & style:css
# edit package.json scripts
# start: "parcel index.html"
charte graphique végane
Bonus: dans plusieurs balises <pre>, on peut voir comment utiliser la charte, avec des exemples de code HTML
Epreuve blanche
sans aucune classe
Bonus: Corriger les 2 erreurs
Bonus 2: Le HTML est 100% généré par JavaScript
Binaire | Décimal | Hexadécimal |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | NUMBER INPUT | TEXT INPUT |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
0111 | 16 | G |
En général, lorsqu'il existe plusieurs propriété commençant par le même mot, on peut les combiner:
dans leur diversité
Rares: ex, pc, in...
Uniques: deg, rad, turn, s, ms...
et valeurs par défaut
I/O -> Formulaire = input / Page = output
C, U & D du C.R.U.D.
Data -> Or gris du nouveau monde
Implique un serveur et une base de données
Le laisser passer A38 du web
de formulaires
Nous travaillons sur l'app interne de gestion de stock d'une célèbre chaîne d'articles de sport.
À fond le form
Bonus 2: cliquer sur "enregistrer" rempli un array javascript contenant les noms d'articles, et le loggue dans la console
Le vendeur déballe les cartons et saisit les nouveaux articles chaque jour:
// bonus
btn.addEventListener("click", function (e) {
e.preventDefault();
});
Bonus: il y a un bouton pour vider tous les champs
Attributs impliquants une contrainte:
max,min,maxlength,minlength,pattern,readonly,required
et attributs liés aux formulaires
Le bouton submit implique une validation de ces restrictions
Vocabulaire associé: pristine, dirty, touched, valid, invalid
check-in
Bonus: Repas contient le champ "allergie", si on clique dessus, un nouveau textarea "précisez" apparaît...
maux croisés
Bonus: Utilisez "pattern" pour "une seule lettre entre a et z". Outch
Bonus 2: JavaScript vérifie que l'utilisateur à vraiment gagné !!! OMG
<audio controls>
<source src="monAudio.mp3" type="audio/mpeg">
<source src="monAudio.ogg" type="audio/ogg">
<p>Votre navigateur ne prend pas en charge l'audio HTML. Voici un
un <a href="myAudio.mp4">lien vers le fichier audio</a> pour le
télécharger.</p>
</audio>
<video width="400" controls>
<source src="mon_mariage.mp4" type="video/mp4">
<source src="mon_mariage.ogg" type="video/x-msvideo">
Your browser does not support HTML video.
</video>
swan's lake 1/3
Bonus: Il y a un menu fixed à droite, pour scroll vers les articles, et le scroll est smooth, même sur Safari
swan's lake 2/3
Bonus: On peut trier les articles par dates, dans le sens chronologique ou antéchronologique
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2518.2356139506705!2d4.358573615494672!3d50.86383767953446!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47c3c37b0b18e0ab%3A0xa7dcedc9c29a0d35!2sInterface3%20asbl!5e0!3m2!1sfr!2sbe!4v1597835334639!5m2!1sfr!2sbe"
width="600"
height="450"
frameborder="0"
style="border:0;"
allowfullscreen=""
aria-hidden="false"
tabindex="0"></iframe>
swan's lake 3/3
Bonus: Les articles avec liens youtubes sont aussi généré par JS
pour a...ccessibilit...y
80% du job !
pour les 20% restant !
crazy designers 1/2
Bonus: le formulaire arrive sur une page PHP !
Et douter, c'est très très bien
Tester votre site via tous les moyens cités précédemment...
crazy designers 2/2
Bonus: Testez un de vos anciens sites et corrigez le !
Be conservative in what you produce; be liberal in what you accept.
<html lang="fr">
<title>Best site ever</title>
<meta name="description" content="The best site ever">
<!-- keywords ? -->
<meta name="robots" content="index, follow">
<meta name="viewport"
content="width=device-width,initial-scale=1.0">
<link rel="canonical"
href="http://example.com/" />
<!-- open graph -->
<meta property="og:type" content="" />
<meta property="og:title" content="" />
<meta property="og:description" content="" />
<meta property="og:image" content="" />
<meta property="og:url" content="" />
<meta property="og:site_name" content="" />
<!-- twitter, dublin core, domaines... -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-40583718-3">
</script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "UA-40583718-3");
</script>
meta cagoule
Bonus: Trouver un outil de partage sur facebook, twitter, instagram... ou utilisez https://sharingbuttons.io/
<canvas id="mon-canvas" width="150" height="150"></canvas>
Mini-workshop: trouver un jeu HTML fait dans un canvas
cheatsheets addict
# commandes utiles
git clone https://...
cd cheatsheets
touch README.md
touch .gitignore
touch style.css
npm i parcel --save
npm i highlight.js --save
mkdir HTML
cd HTML
touch index.html
git add .
git commit -m "mon copion v1"
git push
Getting started
Bonus: c/c ces cartes 3x. Elles se wrap automatiquement à la ligne si l'écran est trop petit: 100% responsive ! Et en masonry?
mettez m'en une douzaine
<div class="container">
<div class="row">
<div class="col-sm-6 col-lg-3">col</div>
<div class="col-sm-6 col-lg-3">col</div>
<div class="col-sm-6 col-lg-3">col</div>
<div class="col-sm-6 col-lg-3">col</div>
</div>
</div>
Bonus 2: Générer ce HTML via javascript
exercice élémentaire
Bonus 1: Comment faire un effet de similaire aux vrais, avec une case de chaque côté sur la première ligne ?
Tout en un
Les components les plus utilisés sont souvent:
Les «utilities» sont les "one-liners" très utile pour des petites rectifications visuelles:
.rounded-circle, .d-flex, .shadow-sm, .p-0, .text-center...
Fan fictions
Bonus: Si le nom ou le prénom ou l'âge sont vides, une troisième popup prévient que ce ou ces champs sont vides, et empêche de continuer [RETOUR].
Warning
flex-direction: column;
seul ne sert à rien: c'est le comportement natif des blocs !
embouteillage
Bonus: Les voitures bougent toute seules ensemble, grâce à une animation provoquée par un "setInterval" jouant sur le style de la div qui les contients
alternative...
flex roulette
Bonus: cliquer sur un case fait apparaître une pièce brillante de 1€ sur cette case. Elle devient 2 puis 3, et enfin 5€ max si on reclique encore
L'art du compromis
/* Medium devices (landscape tablets) */
@media only screen and (min-width: 768px) {
header {
display: none;
}
}
/* Large devices (laptops/desktops) */
@media only screen and (min-width: 992px) {
header {
display: block;
}
}
/* Extra large devices (large laptops) */
@media only screen and (min-width: 1200px) {...}
media queries: baby steps
Bonus: profils issus d'un array JS. Ils ont une notes sur 5* visible
background: rgb(238,174,202);
background: radial-gradient(circle, rgba(238,174,202,1) 0%, rgba(148,187,233,1) 100%);
blowing in the tailwind
Bonus: Quid de md ? xl ? Quid de 1/12 ou encore 1/2, 1/3 ?
dix-formes
Bonus: Tout fait en javascript, random, depuis tableau de score par id
Syntactically Awesome Style Sheets
LESS, Stylus... et
AOT: Ahead Of Time
JIT: Just In Time
AST: Abstract Syntax Tree
Macros: Code généré par du code
@use "autre_fichier";
$color: "red";
.fond-rouge {
background-color: $color;
}
div {
p {
border: 1px solid $color ;
.liens {
text-transform: none;
&:hover {
text-transform: underline;
}
}
}
}
sass de décompression
Bonus: En arrivant sur le site, un bandeau "covid" + overlay gris dit que le bar est fermé, mais qu'on peut acheter sur la carte. On peut vraiment...
// macro, façon SCSS
@mixin bg($color) {
.bg-#{$color} {
background-color: $color;
}
}
@include bg(red);
@include bg(green);
// listes et boucle façon SCSS
$sizes: 0, 5, 10;
@each $size in $sizes {
.p-#{$size} {
padding: #{$size}px;
}
}
// objets, façon SCSS
$colors: (
primary: burlywood,
secondary: gray,
neutral: gray,
);
@mixin generateur($map, $attribute) {
@each $key, $value in $map {
&-#{$key} {
#{$attribute}: $value;
}
}
}
.bg {
@include generateur($colors, "background-color");
}
Unlimited power
Bonus: faire cela grâce à une map de couleur, les classes ressemblent à .bg__<color> et .text__<color>
En vous inspirant de la slide précédente:
Animation programmée
Simple transition
Dans les deux cas, il s'agit de shorthand properties
// simple
a {
color: lightgray;
transition: color 1.5s;
}
a:hover {
color: black;
}
// crazy
a {
position: relative;
display: inline-block;
color: royalblue;
overflow: hidden;
background: linear-gradient(
to right,
midnightblue,
midnightblue 50%,
royalblue 50%
);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-size: 200% 100%;
background-position: 100%;
transition: background-position 0.75s ease;
}
a:hover {
background-position: 0 100%;
}
Don't be shy !
Bonus: Les yeux ont un blanc, un iris et une pupille. L'iris change doucement de couleur aussi. Au clic sur le bouton, les yeux grossissent, le sourire s'accentue
// simple
body {
animation: clignoter 5s infinite;
}
@keyframes clignoter {
from {
background-color: #001F3F;
}
to {
background-color: #FF4136;
}
}
le sprite donne des ailes
Bonus: Plusieurs oiseaux traversent l'écran dans des temps et des directions différentes.
total freestyle
Bonus: Trouvez d'autres framework/lib/exemples d'animation à partager sur notre chat'. Prevoyez un démo succincte.
en cours d'adoption et de finalisation
De leurs vrais noms: custom properties
:root {
--main-color: brown;
}
.bg-main {
background-color: var(--main-color);
}
.text-main {
color: var(--main-color);
}
Micro-workshop: palette de 3 variables, à utiliser dans 5 classes
<div class="wrapper">
<div>Un</div>
<div>Deux</div>
<div>Trois</div>
<div>Quatre</div>
<div>Cinq</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 200px 200px 200px;
}
or newsletter related
Une ombre au
<!-- simple -->
<table>
<tr>
<td>Javascript</td>
<td>Senior</td>
<td>50 000</td>
</tr>
<tr>
<td>Python</td>
<td>Junior</td>
<td>60 000</td>
</tr>
</table>
<!-- crazy -->
<table>
<caption>
Evolution des populations
</caption>
<thead>
<tr>
<th>COUNTRY</th>
<th colspan="2">POPULATION</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="2">india</td>
<td>1998</td>
<td>85</td>
</tr>
<tr>
<td>2000</td>
<td>100</td>
</tr>
<tr>
<td rowspan="2">USA</td>
<td>1998</td>
<td>30</td>
</tr>
<tr>
<td>2000</td>
<td>40</td>
</tr>
</tbody>
</table>
plus vieilles que l'univers
Rich people
Bonus: Ce tableau est 100% généré depuis JavaScript
RANK #1 Jeff Bezos
$178 000 MILLION
Jeff Bezos is an American philanthropist, businessman
and space explorer who is probably best-known for creating Amazon.com.
RANK #2 Bill Gates
$125 000 MILLION
Bill Gates is an American business magnate, chairman of Microsoft, philanthropist, author
RANK #3 Elon Musk
$103 000 MILLION
Elon Musk is a South African-born Canadian-American businessman, inventor and investor
RANK #4 Mark Zuckerberg
$97 000 MILLION
Mark Zuckerberg is an American technology entrepreneur
Ou "so 2019", la lose...
Le point complet:
THANKS EVERYONE
It's finally done ! See you soon
Et pour aller encore beaucoup plus loin...