Capacité d'un site web à s'adapter à son environnement de visualisation
Le responsive ne concerne pas que la résolution
En opposition avec l'ancienne pratique qui consistait à faire plusieurs sites et à rediriger l'utilisateur selon le device détecté
Pour tester le site dans différentes conditions, nous pouvons utiliser le devtools de Chrome
Ouvrez le devtools avec CMD + ALT + I (Mac) ou F12 (Windows)
Et cliquer sur cet icon
En haut du viewport, vous avez accès à différentes options
Il est possible d'accéder à plus d'options
Sur Mac, vous pouvez aussi installer Xcode et ainsi avoir accès à une application appelée "Simulator" qui permet de simuler des devices iOS fonctionnant avec le vrai OS.
Pendant la phase de développement, vous pouvez tester avec le devtools et des simulateurs, mais rien ne vaut un test en conditions avec de vrais devices.
Par défaut, les navigateurs mobile et certains navigateurs tablette vont tenter d'adapter le design du site en dézoomant
Ce comportement va nous gêner car nous souhaitons adapter nous même le design
Introduite par Apple avec l'arrivée de l'iPhone, la balise meta viewport permet de gérer ce dézoom automatique
<meta name="viewport" content="">
Elle met à disposition plusieurs propriétés à mettre dans l'attribut content séparées par des virgules
La meta viewport est capricieuse et on mets en général toujours la même valeur pour empêcher le scale et utiliser les proportion du viewport
<meta name="viewport" content="width=device-width, initial-scale=1">
Cette meta n'ayant jamais été proposée au W3C ce dernier à proposé sa propre version fonctionnant en CSS avec des propriétés similaires
@-ms-viewport {
width:device-width;
zoom:1;
user-zoom:fixed;
}
@viewport {
width:device-width;
zoom:1;
user-zoom:fixed;
}
N'est pratiquement supportée que par IE
⚠️ Chrome peut décider d'ignorer la meta viewport si le contenu dépasse horizontalement de la page
Par défaut, les navigateurs proposent une feuille de style de base appellée User-Agent-Stylesheet
Cette feuille de style initial varie selon le navigateur
Il faudrait pouvoir la réinitialiser afin d'avoir le même résultat quelque soit le navigateur
Il existe deux approches
Les deux approches sont intéressantes, mais nous allons partir sur un reset CSS
Plus d'infos:
elad.medium.com/the-new-css-reset-53f41f13282e
Le plus connu des reset CSS
⚠️
Le reset CSS doit être ajouté avant votre CSS et dès le début de l'intégration
Il peut arriver qu'on ait besoin de détecter quelles features sont supportées par le device
Détecter ces features manuellement prendrait beaucoup de temps et on risquerait de faire des erreurs
La librairie Modernizr permet de le faire facilement
Modernizr va rajouter des classes dans la balise <html>
Ces données seront aussi accessible en JS
Chaque site à besoin d'icônes (et pas que le favicon)
Les icônes peuvent apparaître dans les favoris, sur la home du smartphone, dans l'onglet, sur la touch bar, etc.
Le site Real Favicon Generator permet de les générer facilement
Technique permettant d'adapter la feuille de style en fonction du périphérique et de ses différents critères
Peut-être appliquée de 3 façons différentes :
En HTML
<link rel="stylesheet" href="smallscreen.css" media="condition"/>
En CSS
@media condition
{
/* Mon CSS */
}
En Javascript
if(window.matchMedia('condition').matches)
{
/* Mon JS */
}
En général, on utilise la solution CSS
@media (width: 700px) { }
@media (min-width: 700px) { }
@media (min-device-width: 700px) { }
@media (min-width: 700px) and (max-width: 1000px) { }
@media (min-device-pixel-ratio: 1.5) { }
@media tv and (orientation: portrait) { }
@media screen { }
@media print { }
@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5)
{
}
Media query robuste pour tester un pixel ratio supérieur ou égal à 2
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)
{
}
Compatibilité
Si vous avez développé le site pour du desktop, vous avez probablement écouté des événements tels que click, mousemove, keydown, etc.
Malheureusement, beaucoup d'événements ne fonctionneront pas de la même manière sur des devices touch
Il faudra donc utiliser des événements similaires mais compatibles : touchstart, touchmove, touchend, deviceorientation, etc.
window.addEventListener('touchmove', (_event) =>
{
console.log(_event.touches[0].clientX, _event.touches[0].clientY)
})
window.addEventListener('mousemove', (_event) =>
{
console.log(_event.clientX, _event.clientY)
})
Lorsque vous simulez un device touch avec le dev tools de Chrome, celui-ci va aussi simuler les événements de touch à la place des événements de souris
Il est aussi possible de simuler l'orientation du device en faisant ESC, en allant dans l'onglet Sensors et en activant l'orientation
window.addEventListener('deviceorientation', (_event) =>
{
console.log(_event.alpha)
console.log(_event.beta)
console.log(_event.gamma)
})
Faire un site responsive concerne à la fois la créa et le développement
Dans tous les cas, mettez vous d'accord dès la conception
Le mobile first implique de faire les créas et le développement en commençant par les versions mobiles puis en s'occupant des autres devices par la suite
Cette pratique permet de s'assurer d'avoir une expérience optimisée pour le device le plus contraignant pour ensuite s'occuper des devices plus flexibles et moins limités
Cette tendance vient des problèmes de performance et d'ergonomie des smartphones, mais aussi des statistiques d'utilisation
Le mobile first présente aussi comme désavantage une dégradation de la version desktop
Bien qu'optimisé, le site aura tendance à être inutilement simple, vide et sans immersion sur desktop
Du coup, mobile first ?
Cela dépend
Aller plus loin
Grâce au responsive, on peut avoir une même page qui fonctionne sur mobile et desktop sauf que les images chargées sont les mêmes
Il serait dommage de charger une énorme image prévue pour le desktop sur du mobile
L'attribut srcset d'une balise <img> permet de définir plusieurs sources et de laisser le navigateur choisir
<img
width="100%"
src="image-test-1280.png"
srcset="image-test-320.png 320w,
image-test-640.png 640w,
image-test-1280.png 1280w"
>
Chaque source est accompagnée de critères tels que sa largeur afin de donner des informations au navigateur sans qu'il ait à la télécharger
Compatibilité
La balise <picture> est une autre solution similaire sauf qu'il est nécessaire de spécifier soi-même les conditions
<picture>
<source srcset="image-test-320.png" media="(max-width:320px)">
<source srcset="image-test-640.png" media="(max-width:640px)">
<source srcset="image-test-1280.png" media="(min-width:641px)">
<img src="image-test-320.png" width="100%">
</picture>
Compatibilité
Aller plus loin
Tout dépend de la cible du site
Si vous travaillez sur un site déjà existant, analysez les statistiques de visites pour voir quels devices sont les plus utilisés
Si vous travaillez sur un site nouveau, analysez les statistiques d'utilisation des visiteurs ciblés (https://gs.statcounter.com/)
S'il s'agit d'un portfolio, ne vous embêtez pas trop
S'il s'agit d'un e-commerce, faites de votre mieux
Si vous travaillez pour un client, assurez vous d'avoir précisé le scope de compatibilité dans le devis
Rendre votre site responsive est une priorité
Prévoyez-le en amont et dans le budget
Testez sur plein de devices différents