Résolu Gros tuto - Adapter son site au format mobile avec CSS3.

  • Auteur de la discussion Auteur de la discussion BIBI' L'indiscipliné
  • Créé le Créé le
B

BIBI' L'indiscipliné

Salut à tous, aujourd'hui on se retrouve pour un énorme tutoriel qui est pour moi, très utile.
J'espère qu'il vous plaira et je vous souhaite une bonne lecture.

Je vais commencer par vous présenter le sommaire.
  1. Adapter son site au format mobile avec CSS3.
  2. La base des fonctionnements.
  3. La méthode utilisée.
  4. Une seule balise.
  5. Les quelques options.
  6. Les possibilités offertes par CSS3.
  7. Utiliser les Media queries.
  8. Les media, le choix.
  9. Adapter un exemple au format mobile.
  10. Les instructions pour réaliser cette manœuvre.
  11. Allez plus loin.
  12. Accéder à la version pour ordinateur.
  13. Les principes.
  14. L'exemple avec PHP.
  15. JavaScript : Le déroulement de ses menus.
  16. Créer son bouton.
  17. Gérer la désinstallation de JavaScript.
Sacré sommaire n'est ce pas ?
  • Adapter son site au format mobile avec CSS3.
Vous venez de créer votre site web, c'est cool il est tout beau tout propre mais vous voulez y accéder avec votre mobile.. La mauvaise idée, vous vous rendez compte que votre site n'est pas adapté au format mobile. La déprime totale.
Pour remédier au problème suivez bien le tutoriel à la lettre, c'est vraiment important !
  • La base des fonctionnement.
Les navigateurs pour mobiles sont tous très différents mais ça ne va pas vous empêcher de trouver un moyen pour qu'ils aient tous le même comportement.
  • La méthode utilisée.
Pour faire un site web pour mobile, il y a deux méthodes différentes, je vais vous les présenter ici. Chaque méthodes a ses avantages et ses inconvénients mais de toute façon je mettrais que la deuxième méthode dans ce tuto car la première est beaucoup trop longue et compliquée à expliquer.
  1. Un sous-domaine pour votre mobile.
Je ne sais pas si vous l'avez déjà remarqué mais sur mobile il y a un petit m qui remplace le www sur certains sites.
Le fonctionnement est super simple : Votre site détecte si le visiteur a un mobile ou un ordinateur. Il redirige l'utilisateur en cas que celui ci navigue son son mobile. Le seul inconvénient c'est que vous aurez 2 fois plus de code à gérer, mais vous aurez le contrôle totale de la page.

Il y a une autre technique qui existe.. c'est d'ajouter un paramètre dans l'URL. Cette technique a l'avantage de n'avoir qu'une seule fois tout vos codes. Si je ne dis pas de bêtises seul ce que vous allez afficher en HTML sera modifié.

Le désavantage de cette méthode c'est la redirection vers la version mobile qui est assez compliquée à mettre en place, de plus elle ne fonctionne pas forcément. Mais vous allez voir que l'autre méthode non plus n'est pas parfaite.
  1. Le visiteur demande la page.
  2. Le serveur ne s'occupe pas de savoir si le visiteur navigue via un mobile ou non, c'est à l'appareil de s'adapter.
C'est ce que l'on appelle la méthode "Responsive design".

En résumé :
  • Avec la méthode du sous-domaine, le code sur le serveur sera sur-chargé mais le visiteur aura une navigation plus rapide, meilleure tout simplement.
  • En utilisant les media queries vous n'aurez qu'une seule page à creer mais la page envoyée au visiteur sera beaucoup plus lourde.
-------------------------------------
  • Une seule balise.
Je vais enfin vous dire comment ça marche.
Ce qu'il faut savoir c'est que les navigateurs mobile vont afficher votre page avec une largeur par défaut qui sera celle d'un ordinateur (980 px). Ainsi votre site est affiché en tout petit sur votre téléphone.

Pour éviter ça il suffit de dire au navigateur qu'il respect les largeurs mobile.

Certains vont demander "Eu... Mais je fais ça comment moi? Je parle au navigateur?".
Bien sur que non, je vais vous expliquer !

Ça peut paraitre compliqué, certes mais c'est super simple. Il suffit de rajouter une balise dans votre code HTML pour que le navigateur mobile affiche votre site avec une largeur dite "correcte".
<head>
<! -- Le contenue -->
<meta name="viewport" content="width"/>
<! -- Encore du contenue -->
</head>

Vous pouvez comprendre cette balise comme : "La largeur de mon site correspondra à la largeur de l'appareil." Vous pouvez également utiliser la constante device-height avec la propriété height, mais cette utilisation est beaucoup moins courante.

Vous pouvez aussi mettre une valeur en pixel pour la largeur mais cette méthode est très déconseillée puisque votre page ne va pas s'adaptée aux différentes variantes de votre appareil (Mode portrait, paysage ...)
Vous pouvez déjà regarder votre site en rajoutant la balise pour voir qu'est ce qu'il y a de changé.

Beaucoup d'entre vous vont me dire "Mais je n'ai pas accès à internet via mon mobile, .. Attendez ça arrive !
Pour ça il existe des émulateur. Comme sur les ordinateurs, les navigateurs pour mobile sont nombreux, vous pouvez facilement trouver un émulateur. Il existe, je crois, un émulateur pour Opéra mobile qui a été fourni par la société sur le web (Faites des recherches).
Vous pouvez en trouver pleins mais je conseille pour les iPhone qui fonctionne plutôt pas mal.

Sujet clos, qu'est ce qu'il c'est réellement passé ?
Pour que tout le monde puisse suivre je vais tester la balise sur une vraie page web.
Je vais prendre l'acceuil du site du zéro par exemple.
Ça donne ça :
349754.jpg

C'est le site originale avec la balise. (Safari mobile)
Comme vous pouvez le remarquer ça a seulement dé-zoomé le site.

Or, si on regarde le CSS on peut lire ceci :
body {
min-width: 1000px;
}

On va alors aussi modifier ça !
Notre but c'est simplement d'avoir la largeur du site qui soit bien affichée sur notre mobile.
On va essayer 300px, alors pourquoi 300px ? Tout simplement car 300px est une valeur qui fonctionne pas mal sur tout les navigateurs.

uploads.siteduzero.com_files_385001_386000_385664.jpg

Là ça a changé, ce qui est bien c'est que le texte est lisible de suite et que certains éléments prennent le moins de place possible vous voyez ?
Mais bon c'est pas très bien encore.. Comme vous le voyez le design est tout écrasé, cassé, détruit..

Maintenant vous me croyez ? Cette balise c'est la clef de votre design, la suite se fera grâce à media queries.

  • Les quelques options.
Avant d'attaquer le CSS on va voir les options utiles !
C'est le zoom initial,minimal ou encore maximal.

Le zoom initial :
Comme je vous ai déjà dit, le zoom au chargement de la page est "aléatoire". Le truc c'est que si votre site est bien fait, le zoom s'adaptera comme vous le voudrez. En gros il n'y en aura pas, le zoom sera de 1.

Mais vous pouvez préciser à votre navigateur quel doit être le zoom initial.

Le zoom minimal :
Si un des visiteurs de votre site souhaite voir le site en plus petit, vous allez pouvoir définir de combien de fois il pourra. C'est option n'est pas très utile mais il faut que vous sachiez comment l'utiliser, voici donc comment l'utiliser :
<meta name="viewport" content="width=device-width, minimum-scale=0.25"/>

A noter que la valeur 0.25 est celle par défaut du navigateur Safari mobile.
Le zoom maximal :
Comme pour le minimal vous pouvez indiquer un zoom maximal. Le navigateur aura parfois un comportement par défaut : C'est à dire que si vous zoomer trop et que le texte n'est plus visible, le navigateur dézoomera automatiquement.
Voici comment l'utiliser :
<meta name="viewport" content="width=device-width, maximum-scale=5.0"/>

A noter que la valeur 5.0 est aussi la valeur par défaut de Safari mobile.
Cette option là, pour moi est plus utile que le zoom minimal.
Lorsque votre visiteur clique sur une zone de texte par exemple, le navigateur peut zoomer automatiquement. Définir le zoom maximal à 1.0 peut éviter que le navigateur fasse ceci.

  • Les possibilités offerte par CCS3.
A la fin du chapitre vous serez capable d'avoir un site web accessible pour tous.

  • Utiliser les Media queries
  1. La technique en CSS3.
Si votre design est bien fait, le visiteur n'aura pas besoin de défiler horizontalement la page.
Alors, en CSS on va se débrouiller pour que notre site ne dépasse pas une largeur que nous avons fixé.
Les media queries peuvent être utilisés de 2 façons : Une fois dans le CSS et l'autre depuis la balise <link> votre page HTML.
Pour la méthode en HTML voici comment procéder :
<link rel="stylesheet" media="votre requete ici" href="mobile.css" />

L'avantage de cette méthode c'est qu'un visiteur avec un appareil ne correspondant pas à la requête ne téléchargera pas ce dont il a besoin. C'est donc plus rapide pour lui. Pour votre serveur, cela évite de la bande passante inutile.

En CSS il faut prendre tout le code que vous destinez aux mobile dans un bloc.
@media votre requete ici {
/* Le code pour les mobiles ici */
}

Le code pour mobile est là pour réduire les marges, revoir les positions des éléments, masquer des éléments non désirés sur votre mobile ou encore augmenter la taille du texte si c'est nécessaire donc adapter le design pour des longueurs plus petites.
  • Valeurs standards.
Pour adapter votre design il va falloir prendre en compte la taille réduite de l'écran de votre visiteur. A mon avis, vous ne savez pas à partir de quelle longueur un appareil peut-être concidéré comme une tablette, un mobile ...

Le tableau suivant va vous expliquer :


Les smartphones : Largeur en pixel (320 à 480) | Condition utilisée : (max-width: 480px)
De smartphones à tablettes : Largeur en pixel (481 à 767) | Condition utilisée : (max-width: 767px)
Tablettes à petits écrans : Largeur en pixel (768 à 979) | Condition utilisée : (max-width: 979px)
Ordinateur : Largeur en pixel (980 à 1199) | Condition utilisée : -
Ecrans larges : Largeur en pixel (1200 et plus) | Condition utilisée : (min-width : 1200px)

Les propriétés des tablettes s'appliquent aussi aux mobiles avec les conditions que je vous ai montrées.
  • Gérer les éléments problématiques.
Certains éléments mériterais qu'on leur porte plus d'attention, ils sont dès fois négligés ou mal traités.

------------------------------------------

  • Les médias, le choix.
Ici je vais vous apprendre à "choisir" des médias. (Cet écran aura cette propriété, celui ci celle là, ..) Ceci n'aura plus de secret pour vous ahah.
Le type de média : Le choix est déjà dispo dès la norme CSS2 mais il est possible que vous soyez passé à côté.
Vous pouvez spécifier à quel type de média votre feuille de style va s'appliquer, nous verrons un peu plus loin comment procéder. Vous avez le choix entre les valeurs suivantes :

Média

Concerne

All
Tous les médias. C'est la valeur par défaut.

Braille
Les appareils brailles.

Embossed
Les imprimeries en braille.

Handhelp
Les appareils mobiles (avec petits écrans ou une bande passante limitée).

Print
Les documents imprimés.

Projection

Les projecteurs et tout autre type de projection.

Screen

Les écrans d'ordinateur avec couleurs.

Speech

Les synthétiseurs de parole.

Tty

Les appareils à police fixe (généralement avec des capacités d'affichage limitées).

Tv

Les téléviseurs.


C'est génial pour cibler un certain type de média. Il suffit de trouver le bon nom et le tour est joué. Mais ce n'est qu'une théorie.. On cite souvent l'exemple de Safari Mobile qui se concidère comme un screen contrairement à ce qu'on peut attendre.

  • Les opérateurs logiques.
  1. L'opérateur and.
Parfois, une seule condition ne suffit pas et vous voudrez pofiner votre choix pour voir ce que vous voulez voir.
L'opérateur and permet de répondre à vos attentes : Les 2 propriétés (Ou plus) doivent être toutes correctes pour que la feuille de style soit affichée.

@media screen and (max-width: 480px){
/* Ici du code s'appliquant aux écrans de moins de 480 pixels de large */
}
Vous pouvez noter que l'écran s'écrit sans parenthèse et qu'il y a un espace avant et après And alors faites attention.
  1. L'opérateur not.
Afin de pofiner encore plus votre requête, vous pouvez "exclure" certains appareils avec l'opérateur not comme son nom l'indique.

@media not (orientation: landscape) and (min-width: 480px){
/* Ici votre code pour un affichage qui n'est pas en paysage et plus large que 480 pixels.

Trois cas sur quatre vont donc appliquer les propriétés :
- Paysage et moins large que 480px ;
- Portrait et moins large que 480px ;
- Portrait et plus large que 480px.
*/
}

  • L'opérateur only
L'opérateur only se place également au début de votre syntaxe, mais cette fois elle sert à "jeter" les anciens navigateurs qui ne supporte pas l'usage de media queries. Attention, vous ne pouvez pas combiner les opérateur not et only dans la même requête.

Si vous voulez prendre en compte plusieurs appareils qui n'ont pas de propriétés communes, vous pouvez écrire pleins de media queries à la suite en les séparant par une virgule pour chaque media queries. Vous pourrez donc utiliser les opérateur not et only à chaque requête.

Comme vous pouvez le voir, les possibilités offertes par CSS3 sont nombreuses.

---------------------------
  • Aller plus loin.
Vous pouvez remarquer que le design que je vous propose peut être encore plus amélioré :

uploads.siteduzero.com_files_387001_388000_387970.png

(Image trouvé sur le web)

Mais ça reste ma version finale de ce site car après ça serait trop compliqué à expliquer.

Pour un site, normalement vous pouvez créer une version tablette. Une version mobile en un peu plus grand.. Ici ce n'est pas trop la peine mais vous pouvez par exemple mettre le <aside> plus large que haut.

Vous pouvez aussi faire une version "Big écran" avec une largeur supérieur à 1200px par exemple.
Au lieu de mettre simplement des marges vides sur le côté, mettez-y votre menu en <position: fixed;> pour simplifier encore plus l'utilisation de votre site !

Votre CSS ressemblera donc à ceci :
/* Votre code générique (couleurs, polices, survol...) et la mise en page pour ordinateur */
...

/* Mise en page pour mobile */
@media (max-width: 480px) { ... }

/* Mise en page pour tablettes */
@media (max-width: 767px) { ... }

/* Mise en page pour les grands écrans */
@media (min-width: 1200px) { ... }

Les valeurs peuvent être, biensur modifiées selon vos envies.
  • Accéder à la version pour ordinateur.
Vous vous êtes au moins une fois trouvé devant la version mobile d'un site non ? Vous êtes un habitué du site que vous visitez normalement depuis votre ordinateur, sauf que là.. Vous avez que le mobile de votre mère pour y accéder. Et là tout à changé de place, de plus il manque des options..
Comment réparer ça ? Ca vous dit de le rajouter à votre site ?
  1. Le principe.
J'espère que vous avez une longue mémoire.. Vous vous souvenez de ce que je vous ai dit au début du tuto ?

Vous savez la fameuse phrase sur ce qu'il faut savoir sur les navigateurs mobiles ? Bref.

Oui et ? On a mis une balise dans le code source pour que la longueur du site soit le même que l'appareil et on ne peut pas l'enlever..

Non on ne peut pas l'enlever définitivement mais on peut l'enlever quand le visiteur le demande.
Certains sites, lorsque l'on y accède avec un mobile, vous renvois vers une page dite "spéciale" qui vous demande si vous voulez avoir la version mobile ou originale.

Perso je trouve ça chiant.. Je vais vous montrer une autre façon de procéder : On va afficher un (ou plusieurs) lien, uniquement sur la version mobile, pour accéder à la version pour ordinateur. Avec un paramètre dans l'URL couplé avec une condition, on mettra ou non la balise meta.

Le visiteur qui a un mobile pourra choisir la version qu'il veut :
  1. Si il veut la version originale (ordinateur) le serveur lui renvoit la page sans la balise <meta name="viewport">.
  2. Si il demande rien il sera envoyé sur la page par défaut.
  • L'exemple avec PHP.
Pourquoi PHP ? Tout simplement car c'est le langage serveur gratuit le plus utilisé sur le web en général.
Allons-y.

  1. La préparation
Je vais considéré que comme vous utilisez PHP vous utilisez aussi les includes. Il faut juste avoir un fichier en-tete.php et menu.php , ils sont inclus dans chaque page.
L'entête doit contenir la balise <head> pour pourvoir mettre la balise <meta>et le menu servira juste à afficher le lien, mais vous pouvez le mettre où vous le souhaitez.

  • Accéder à la version pour ordinateur.
Alors, tout simplement, nous allons afficher le lien sur la page :
<a href="?mobile=0" class="visible-phone">Accéder à la version pour ordinateur.</a>

Vous pouvez insérer le lien ou vous voulez y compris aux pieds de votre page.

On va maintenant, grâce à PHP, utiliser le paramètre qui sera présent dans l'URL afin d'enlever la balise <meta>. On va également utiliser les sessions afin de conserver le choix des utilisateurs. Voici le code :
<?php

if(isset($_GET['mobile'])) /* Si on a un paramètre dans l'url */
{
$_SESSION['mobile']=$_GET['mobile'];
}
elseif(!isset($_SESSION['mobile'])) /* Et si on a auparavant pas utilisé la variable, on l'initialise */
{
$_SESSION['mobile']=1;
}

if($_SESSION['mobile']==1){?>

<meta name="viewport" content="width=device-width, maximum-scale=1"/>

<?php }?>
  1. Revenir à la version mobile.
Pour ça il suffit de créer comme tout à l'heure un lien. Mais cette fois-ci on ne va pas l'afficher tout le temps sur la version pour ordi. Il faut se poser la question suivante : Quand il faut que l'on affiche le lien ? La réponse est : quand on l'a demandé ^^.
La solution : Avec une condition en PHP, sur la variable "session", on s'assure qu'on n'affiche le code uniquement pour ceux qui l'ont demandé, et avec la classe .visible-desktop, on remplit la deuxième condition.

<?php if($_SESSION['mobile']==0){?>
<a href="?mobile=1" class="visible-desktop">Revenir à la version mobile.</a>
<?php } ?>

Et voilà c'est fini !
La condition que l'on a mis dans l'en-tête nous permet de rechanger à loisir la valeur de la variable session.

  • Créer son bouton avec JavaScript.
Le but de cette partie c'est d'empécher que le menu prenne trop de place afin que le visiteur trouve la suite, ou en tout cas plus vite les informations qu'il recherche.

Je vous donne le code que j'utilise pour faire des boutons (C'est moche mais comme vous êtes des as vous allez mieux faire que moi).

<!-- Dans le header -->
<a class="btn btn-navbar" id="btnMenu">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>

<!-- J'ai aussi ajouté un id à la balise <nav> -->
.btn {
display: inline-block;
cursor: pointer;
}

.btn-navbar {
display: none;
float: right;
padding: 12px 15px;
margin-right: 5px;
margin-left: 5px;
}

.icon-bar {
display: block;
width: 18px;
height: 3px;
background-color: #CECECE;
-webkit-border-radius: 1px; /* Ce sont des préfixes, pour que les navigateurs */
-moz-border-radius: 1px; /* prennent en charge les nouvelles propriétés. */
border-radius: 1px;
}

.icon-bar + .icon-bar { /* Le + permet de sélectionner les éléments qui suivent */
margin-top: 3px;
}

N'oubliez pas de cacher le menu sous 600px lorsqu'on change sa présentation, avec <display: none>;.
  • Avec un peu de JavaScript.
Le JavaScript sert à avoir de l'intéractivité dans vos pages HTML. Maintenant, tout les appareils ou presque gèrent correctement le JS donc normalement il n'y a pas de problème pour l'utiliser sur votre site.

Comme le tuto ne concerne pas que JS je vais directement vous donner ma solution.
window.onload=function(){
var bouton = document.getElementById('btnMenu');
var nav = document.getElementById('nav');
bouton.onclick = function(e){
if(nav.style.display=="block"){
nav.style.display="none";
}else{
nav.style.display="block";
}
};
};

  1. Avec les frameworks.
Les frameworks JS vous permettront de simplifier votre code et de ne pas vous préoccuper des des compatibilités entre les navigateurs. Je vais vous présenter celui que je connais.
  1. jQuery
jQuery peut-être le frameworks JS le plus utilisé. Si vous souhaitez apprendre, vous avez le choix dans les tutoriels sur internet.
Je vais quand même vous donner le code puisque je vais rien vous apprendre sur ce point là.

<script type="text/javascript" src=" "></script>
<script type="text/javascript">
$(function(){
$('#btnMenu').on('click touch', function(e){
$('#nav').slideToggle();
});
});
</script>


  • Gérer la désinstallation de JavaScript.
Même si c'est rare, une bonne habitude à prendre est de toujours penser aux visiteurs de notre site qui ont désinstaller JavaScript. Dans ce cas, il n'y a rien de plus simple, même si dès fois ça reste problématique.
Ici, tout simplement, on va ajouter une "encre" à notre lien internet :

<a class="btn btn-navbar" id="btnMenu" href="#noscriptMenu">

Ainsi, il vous suffit juste de rajouter un deuxième menu à la fin de votre page.
Et pour qu'il ne s'affiche pas pour les visiteurs qui n'ont en pas besoin il vous suffira de rajouter une balise <noscript>
<footer>
<!-- ... -->
<noscript>
<nav id="noscriptMenu">
<ul>
<li><a href="#">Accueil</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">CV</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
</noscript>
</footer>

Il ne faut pas oublier que l'on ne veut pas afficher que sur un petit écran (Moins que 600px) Je vous laisse faire.

Et maintenant, on a un problème avec le JS ! En effet, lorsqu'on clique pour dérouler le menu avec JavaScript activé, on est quand même redirigé vers #noscriptMenu, or on veut empêcher ce comportement.

Et bien on va annuler le comportement par défaut grâce aux paramètres qu'on envois à la fonction lors du clic.

e.preventDefault();
Vous voyez, la partie sur JavaScript à été la partie la moins difficile selon moi.

Donc voilà ce petit tutoriel est fini, j'espère que ce tuto vous aura plus.
Sachez que j'ai mis 2 jours à penser, expliquer et rédiger le tuto donc ça représente pas mal de temps donc essayez d'être un minimum indulgent.
Je vous laisse.

A la prochaine.

BIBI
PS: Les images ont été trouvées sur Google image, mais le topic a été 100% réalisé par mes soins.
 
Dernière édition par un modérateur:
Retour
Haut