1480 sujets

Web Mobile et responsive web design

Bonjour à tous,

j'ai une question simple peut etre un peu stupide mais qui peut etre interessante.
est-ce possible d'overwriter toute une css ( j'ai une responsive.css ) sans devoir utiliser !important à chaque fois ? je fais beaucoup de modif dans ma version mobile et c'est lourd de devoir tout overwriter comme ca.

Merci d'avance ! Smiley smile
Bonsoir,

Je ne pense pas que cela existe.
Le mieux est de bien comprendre la cascade css et les priorité des sélecteurs

Ce n'est certes pas toujours évidant, c'est pour cela que l'on fait quelques recommandations :
- ne pas utiliser d'id comme sélecteur css
- ne pas utiliser !important
- ne pas mettre de style dans le code html
Administrateur
Bonjour,

yvanobi a écrit :
j'ai une question simple peut etre un peu stupide mais qui peut etre interessante.

C'est une question très importante vu la tournure que prennent les projets web : RWD, adaptive mais compatibilité IE8.
Intégrer une page demande des compétences mais intégrer en ayant en tête que c'est dans le cadre d'un projet bien plus vaste qu'une simple page de contenu/d'accueil c'est une autre paire de manches !

Si tu dois écraser toutes les instructions d'une feuille CSS, le plus simple est d'enlever cette CSS, soit côté serveur tu la vires de ton projet soit même après chargement en JavaScript et les navigateurs mettent à jour immédiatement. Si JS est désactivé par contre... Et puis tu charges 2 fois trop de code, pas très performant.

Si tu fais du desktop first et ajoute une Media Query pour les mobiles à la suite, alors une propriété identique dans un bloc de règle dont le sélecteur est identique à la partie desktop (l'instruction avant la MQ) va écraser cette dernière : même spécificité mais écrit après = écrasement.
Dans le cas où cette MQ "mobile" est la dernière partie de tes CSS et dans ce cas seulement, utiliser !important a peu de conséquences, c'est même plutôt pratique. Mais si tu intercales une MQ pour "tablettes" (résolution intermédiaire), tu te retrouves avec le même problème à résoudre et utiliser !important va probablement poser problème au moins une fois dans la MQ mobile qui suit... Et pire si un jour tu ajoutes quoi que ce soit après la MQ mobile...

Perso j'utilise le framework KNACSS (scoop Smiley langue ) que Raphaël a créé suite à des lectures et expériences comme OOCSS ou SMACSS (tu peux regarder le support de présentation de sa conf' la plus récente, à partir de la page 72 puis 84 enfin jusqu'à la fin et il y a les liens vers OOCSS et SMACSS entre autres)
Et j'utilise !important quand c'est lié à une classe "utilitaire" que je n'ajoute que pour appliquer une instruction. Exemple .ma0 (margin all à 0 c'est-à-dire dans les 4 directions) va être défini comme :
.ma0 {
  margin: 0 !important;
}

Ça fonctionne parce que si j'avais voulu autre chose que 4 fois 0 comme marge, je n'aurais pas ajouté cette classe dans le code HTML. Si je veux autre chose, je met une autre classe. Smiley rolleyes Si j'ajoute cette classe, c'est que oui je veux qu'elle ait de l'effet, à coup sûr.
Autre manière de faire pour un projet "massif" (des dizaines de pages, 2 sites en 1, 4 points de rupture différents, etc) : des classes utilitaires qui ne s'appliquent qu'à partir d'une certaine résolution parce qu'elles ne sont définies que dans la MQ correspondant à cette résolution. Et pour être sûr des résolutions où elles ont de l'effet, elles sont préfixées avec .large-*, .medium-*, .small-* etc (la résolution par défaut c'est 1024px de largeur).
@MQ(1280) {
  .large-faisça {
    applique: ceci;
  }
}

@MQ(768) {
  .medium-faisça {
    applique: ceci;
  }
}

@MQ(480) {
  .small-faisça {
    applique: ceci;
  }
}

Maintenant si j'ajoute .medium-faisça, ça n'a aucune action en 1024 ou en large parce que ce n'est pas défini (par convention dans ce projet). En 768 ça a un certain effet. Si je veux autre chose en 480, je dois ajouter une classe .small-faisunautretruc pour écraser la classe définie "à partir de 768 (et en dessous)" mais ça reste pratique (parce que si on nous demande d'intégrer des dizaines de pages, c'est qu'elles ont toutes un comportement différent ... Un peu, beaucoup, ... Autant gérer ça dans le template HTML plutôt que de décupler la taille des CSS)
Modifié par Felipe (19 Oct 2013 - 10:47)
hmmm interessant.

j'ai deja réalisé plusieurs sites mobiles mais à chaque fois, j'avais un dev qui faisait une detection de User agent, donc j'avais plusieurs CSS completement differentes mais les class / id etaient les memes. Donc j'avais pas ce probleme.

Felipe, je suis parti aussi de knacss pour voir les breakpoint et recuperer le reset css, donc jusque la, on est d'accord mais pour etre sur de comprendre, tu préconises de :

- soit charger plusieurs css
<link rel="stylesheet" media="screen and (max-width: 640px)" href="smallscreen.css" type="text/css" />
avec le braket @media dans la feuille, au lieu d'avoir une css avec des @import responsive.css ( ou autre ) qui va au final simplement generer une grosse css avec tous dedans. [ je suis pas sur d'avoir bien compris si ca va vraiment marcher, mais je vais tester Smiley smile ]

- soit d'appliquer plusieurs class specifiques aux bloc modifiable par MQ dans le html et le css de la class ".petitTruc { width : 100%; } dans le @media 640px va s'activer seulement quand le screen size et de 640px. meme si cet item a une width de 400 par ex avec une class .moyenTru defini de base
c'est ca ?
(ca fait beaucoup de class à ecrire si tout se change avec 3 MQ :S

quand tu dis " même spécificité mais écrit après = écrasement. " cela s'applique meme dans une condition de @media = blabla ?? c'est ca qui m'etonne, meme si ca fait du sens.
Merci en tout cas !!