(Info D2) Web 3/3 : Figma + HTML + CSS
Document partagé du cours : https://cloud.dsaadesign-lyon.fr/index.php/s/YR8pPAm5Z927bEY
— Rappels
— Figma
- Un fichier design est composé de pages, elles-mêmes composées de frames
- L'auto-layout automatise la mise en page des éléments dans un flux vertical, horizontal ou en grille. Il est aussi possible de définir les marges et les alignements.
- Les composants permettent de créer des éléments réutilisables, si possible regroupés dans une page "composants". Une copie est appelée instance et peut être modifiée sans que cela ne change le composant principal.
- Les composants peuvent avoir des variantes, ce qui est très utile pour modifier leur apparence (au survol par exemple)
- Le mode prototypage permet de définir les interactions et le comportement de l'interface (scroll).
- Une interaction est constituée d'un déclencheur (clic, survol) suivi d'une action. Plusieurs interactions peuvent être associées au même élément.
- Les principales actions sont : ouvrir/fermer une frame en superposition ; naviguer vers une autre frame ; changer une instance composant dans une autre variante ; scroller jusqu'à une frame.
— Organisation d'un projet web
- Un projet web est un dossier constitué de fichiers .html, .css et .js et de différents médias .png, .jpg, .mp3, etc.
- Les fichiers sont organisés en sous-dossiers pour faciliter leur repérage
- Les noms des fichiers et dossiers ne doivent pas comporter d'accents ou de caractères spéciaux
- Pour éditer un projet web dans un logiciel comme VS Code le plus simple est de glisser le dossier sur l'icône du logiciel
- Pour rappel l'exention Live Server permet de recharger la page dans le navigateur à chaque enregistrement
— HTML
- HTML est un langage de description et structuration constitué d'éléments constitués de balises et d'attributs.
- Sauf quelques exceptions importantes comme
<img/>, les éléments ont tous une balise d'ouverture<element>et de fermeture</element>. - C'est un langage hiérarchique d'éléments imbriqués : écrire du HTL consiste à mettre des boîtes dans des boîtes, ou agencer des descendances de parents et enfants.
- Les éléments HTML se répartissent globalment dans 2 familles selon leur comportement de mise en page :
inlineoublock. - Les principaux éléments HTML :
- Structurer la page :
<header>,<main>,<footer>,<section>,<article>,<div>,<span>,<ul>,<li> - Mettre en forme le texte :
<h1>,<h2>,<p>,<strong>,<a href="chemin/vers/page.html">,<a href="https://urldusite.cool">, - Ajouter des médias :
<img src="chemn/vers/fichier.jpg">,<video>,<audio> - Créer des formulaires :
<input type="text">,<button>,<textarea>
- Structurer la page :
— CSS
- Le
styles.csssoit être lié au document HTML avec l'élément<link href="styles.css" rel="stylesheet>placé entre<head>et</head> - Organisation de la feuille de style en règles composées d'un sélecteur, de propriétés et de valeurs :
/* Début de la règle */
selecteur{
propriete1:valeur;
propriete2:valeur valeur;
}
/* Fin de la règle */
- Les principaux types de sélecteur :
/* Sélecteur d'élément */
h1{
color:red;
}
/* Sélecteur de classe */
.rouge{
color:red;
}
/* Sélecteur d'identifiant */
#menu-principal{
color:red;
}
- Les principales propriétés
- Modèle de la boîte :
#boite1{
width:50%;
height:200px;
margin:8px;
padding:12px;
background-color:red;
}
- Propriétés pour mettre en forme le texte
p{
font-family: monospace;
font-size: 14px;
font-style: italic;
font-weight: normal;
line-height: 120%;
}
— Composer un site avec CSS
Au choix :
- Création d'un portfolio en une seule page mais avec quelques interactions
- Création d'une version web de votre mémoire ou d'un article
Dans les 2 cas le travail consiste à composer une page, c'est-à-dire définir les zones de contenu (éléments HTML) et la manière dans elles s'affichent (règles CSS).
— Éléments inline et block
Comme dans Figma le positionnement des éléments peut répondre à 2 logiques : automatique ou manuelle.
À la différence de Figma, le HTML a une logique par défaut qui est automatique : on appelle ça le flux des éléments. Comme vu plus haut ce flux est lié au type d'élément, soit block, soit inline.
La règle est que :
- les éléments
blockoccupent tout l'espace de leur conteneur (la page ou une autre balise dite parente) - les éléments
inlineont la taille du contenu qu'ils contiennent (texte, image), et se juxtaposent horizontalement
— La propriété CSS position
Il est possible de sortir les éléments du flux, de plusieurs manières, en utilisant CSS.
- avec la propriété
float(valeurs :leftouright) - avec la propriété
position(valeurs :absolute,fixed,sticky)absolute: position relative à l'élement parent lui même positionné avec la propriété position, et si il n'y en a pas, en fonction debodyfixed: insensible au scrollsticky: devient fixed à partir d'une valeur de scroll
Le plus simple est d'utiliser position comme dans l'exemple ci-dessous. Alors que l'élement <nav> devrait se positionner dans le flux en-dessous de <p>, une règle CSS lui attribue la propriété position:fixed, à 20px du haut et 20px du bord droit :
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
<nav>☰</nav>
p{
width:75%
}
nav{
position:fixed;
top:20px;
right:20px;
}
Une fois la propriété position activée, il suffit de définir les coordonnées de l'élément avec top, left, bottom ou right.
— La propriété CSS display:flex = auto layout
CSS a une propriété très utile pour mettre en page des éléments de manière automatique, ou fluide : la propriété display, et plus précisément les valeurs flex et grid. Ces 2 valeurs permettent de positionner les éléments à la manière de l'auto layout de Figma : flux vertical et horizontal, ou en grille, gouttières, alignements, marges, etc. Voici un schéma de correspondance entre le fonctionnement de l'auto layout Figma et la Flexbox CSS :
D'autres propriétés de la Flexbox s'appliquent aux éléments enfants du conteneur :
orderflex-grow: intéressante pour définir la taille des élémentsflex-basisflex-shrinkalign-self
Voici 2 exemples permettant d'utiliser la propriété display avec la valeur flex, ce qui est très fréquent en développement web.
— Exemple 1 : un portfolio en une page
Voici un exemple de mise en page exploitant les possibilités de la propriété display:flex
(voir la page dans un nouvel onglet):
Les grandes zones de contenu :
- un header avec titre menu et liens
- une grande image
- un texte de présentation
- une galerie de projets
- un footer avec des coordonnées
Voici une présentation schématique de la structure de la page en grandes zones en HTML :
<header><main><section id="grande-image"><img>
<section id="texte-presentation"><section id="projets"><article><img><h3>
<article><img><h3>
- etc. pour les autres travaux
<footer>
Et les grandes propriétés CSS :
- header : display:flex
- titre
- menu : display:flex
items - lien réseaux
- #grande-image
- img : min-width:100%;
- #texte-presentation :
- #section-projet : display:flex
- article : width:25%
- footer : height:300px
Menu
Comme dans Figma, nous souhaitons positionner les éléments d'un menu en flux Flexbox automatique. Les propriétés CSS seront affectées à l'élément parent, au conteneur.
<nav>
<ul id="list-flex">
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
#list-flex{
display:flex;
flex-direction: row;
gap:30px;
}
#list-flex li{
border-bottom: 1px solid #000;
}
Et si on met flex-direction: column; :
Pour ajouter un titre et des icônes pour faire un header, il faut également basculer le header en display:flex pour mieux contrôler le positionnement des éléments :
<header>
<h1>mon.studio</h1>
<nav>
<ul id="list-flex">
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
<a>
<img src="https://www.svgrepo.com/show/521711/instagram.svg" />
</a>
</header>
Il faut donc ajouter display:flex au header, et utiliser 2 propriétés complémentaires : justify-content qui définit les marges automatiques (comme dans Figma), et align-items qui est la propriété d'alignement qui fonctionne comme dans Figma également.
header{
display: flex;
justify-content: space-between;
align-items: center;
padding:0 20px;
}
#list-flex{
display:flex;
flex-direction: row;
gap:30px;
}
#list-flex li{
border-bottom: 1px solid #000;
list-style-type: none; /* Pou enlever les • du menu */
}
header img{
max-width:40px;
}
Le résultat :
Voir le code complet de cet exemple : https://code.dsaadesign-lyon.fr/portfolio-98dg987shg
Exemples de portfolio :
- Tag Portfolio sur Hoverstat.es : https://www.hoverstat.es/archive/
- Catégorie Portfolio de Siteinspire : https://www.siteinspire.com/websites/category/portfolio
- Voir aussi: https://brutalistwebsites.com/
- De petits sites web perso : https://smallweb.cc/?sort=random
— Exemple 2 : un article en ligne
Ci-dessous la page (voir dans un nouvel onglet):
Pour cette page il faut positionner 2 blocs principaux :
- le sommaire de l'article
- la zone de texte
Le plan de l'article est une liste ordonnée de liens internes qui permettront de naviguer dans le texte en scrollant la page à destination d'une ancre.
Si on exprime ça en pseudo HTML cela donne :
<main>avec display:flex<nav>avec width:30% et position:fixed<section id="texte">avec width:40% et max-width:400px (pour éviter les lignes trop longues)
La zone restante à droite permettra d'afficher des notes et des figures.
Voici le code complet : https://code.dsaadesign-lyon.fr/page-article
— Quelques sites de contenus pour prototyper
- Faux textes en français : https://loremipsumtext.com/French/
- Images : https://lipsum.app/images Exemple :
<img src="https://lipsum.app/random/1600x900" /> - Icônes : https://www.svgrepo.com/ Il est possible charger directement une icône dans un élément
<img>. Exemple :<img src="https://www.svgrepo.com/show/521711/instagram.svg" /> - Caractères spéciaux : https://copychar.cc/
— Mise en forme
— Utiliser une police personnalisée
En complément des polices par défaut du système, il est possible d'utiliser des polices personnalisées, dont les fichiers peuvent être servis de 2 manières :
- soit en ajouter les fichiers dans votre dossier de projet
- soit en utilisant un serveur de polices comme Google Fonts
Méthode 1 : ajouter des fichiers typo au dossier
- Créez un dossier
fonts/dans votre dossier de projet - Téléchargez un fichier typo .woff, .ttf ou .otf et déposez-le dans le dossier
fonts/(voir cette sélection de typos libres) - Dans votre fichier
css/styles.css, chargez le fichier avec la règle@font-face:
@font-face {
font-family: banquise;
src: url('../fonts/Banquise-Regular.woff');
/* attention le chemin du fichier doit tenir compte de l'arborescence des dossiers,
d'où le ../ pour passer du dossier css/ à la racine puis au dossier /fonts */
}
/* appliquer la règle comme valeur de font-family à l'élement h1 uniquement */
h1{
font-family: banquise;
font-size: 96px;
}
Méthode 2 : charger une police hébergée sur Google Fonts
Parcourir le site et choisir une police, comme par exemple la Rubik Beasty. Cliquez sur Get font puis Embed code pour accéder aux instructions de liaison.
Dans votre fichier index.html (ainsi que les autres si vous avez plusieurs pages), ajoutez ces lignes avant </head> :
<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=Rubik+Beastly&display=swap" rel="stylesheet">
Puis dans votre fichier css/styles.css :
h1 {
font-family: "Rubik Beastly", system-ui;
font-weight: 400;
font-style: normal;
}
Démo :
Code source : https://code.dsaadesign-lyon.fr/typo-google-font
— Interactions (CSS et un peu de Javascript)
— Changer la couleur au survol
Démo :
Code : https://code.dsaadesign-lyon.fr/filter-survol
— Faire apparaître un élément
Démo :
Code : https://code.dsaadesign-lyon.fr/opacity-survol
— Changer la taille et la couleur au survol
Démo :
Code : https://code.dsaadesign-lyon.fr/taille-couleur-survol
— Faire tourner un élément en continu
Code : https://code.dsaadesign-lyon.fr/css-animation
— Faire tourner un élément en scrollant
Code : https://code.dsaadesign-lyon.fr/css-rotation-scroll
— Menu hamburger
Code : https://code.dsaadesign-lyon.fr/hamburger-menu
— Mettre en ligne votre travail
Une des solutions les plus courantes est d'utiliser un client FTP (File Transfer Protocol), c'est-à-dire un logiciel qui vous permet de glisser-déposer des fichiers depuis votre ordinateur vers un serveur, c'est-à-dire un autre ordinateur que vous louez chez un hébergeur, et qui est configuré pour servir vos pages web. Un des logiciels les plus connus, gratuit et open source, est FileZilla.
Problème : le wifi de l'école n'autorise pas le FTP, mais seulement le HTTP(S)... Donc il faut basculer temporairement sur votre 4G pour que cela fonctionne.
Dans FileZilla vous devez configurer un nouveau serveur.
- Cliquez sur l'icône en haut à gauche "Gestionnaire de sites"
- Cliquez sur nouveau site et choisissez un nom
- Dans les réglages à droite :
- Protocole : SFTP
- Hôte : 51.178.30.247
- Port : 51314
- Utilisateur : dsaa_ftp
- Mot de passe : je vous l'envoie par mail
Dans l'interface ça donne ça :
- Puis cliquez sur
Connexion
FileZilla affiche ensuite l'arborescence de fichiers du serveur distant. Vous pouvez maintenant glisser-déposer votre dossier ou vos fichiers un par un.