RÖCSSTI – prononcez Rochti – est ma petite base de départ en matière de CSS. Le nom – volontairement ridicule – est un clin d'oeil amical à KNACSS, un excellent micro-framework CSS de Raphaël Goetter, dont RÖCSSTI reprend des éléments, réaccomodés à ma façon pour répondre à mes besoins et mes habitudes au boulot.
Les röstis ont donné leur nom à la « barrière de rösti » ou Röstigraben (littéralement « fossé de rösti ») qui marquerait la différence de mentalité entre la Suisse romande et la Suisse alémanique. On parle notamment du röstigraben quand une votation fédérale obtient dans la région francophone des résultats très différents de la région germanophone. Si vous n'avez rien compris, regardez la leçon de géographie Suisse, par Marie-Thérèse Porchet.
Je m'égare. L'idée est la suivante :
Le code est commenté, il doit se suffire à lui-même pour le comprendre. Si vous avez du mal à comprendre les notations, n'hésitez pas à me demander.
Disclaimer : Cette base n'a PAS pour but d'être parfaite, exhaustive ou de répondre à tous les cas de figure ! RÖCSSTI est juste une base volontairement minimaliste pour démarrer en gagnant du temps, et s'adresse à des personnes qui connaissent CSS. Je l'ai créée surtout parce que les frameworks CSS sont souvent trop lourds, trop riches et trop compliqués pour mes besoins (sur mesure) au travail. Un point important cependant : c'est livré tel quel, sans garantie, article 22 !
Si vous doutez du côté pratique, cette base CSS sera enrichie au fil des projets réels que je réaliserai avec. Pour information, mon job actuel m'a permis de faire 11 réalisations dans des styles très différents avec RÖCSSTI, cela va de sites relativement simples à des sites plus complexes en responsive. Le gain de temps au démarrage du projet ainsi que la réutilisabilité du code sont réelles et perceptibles.
Si vous avez des retours, des corrections ou des idées géniales, n'hésitez pas à m'en faire part : dante3333@gmail.com ou directement sur la page contact de mon site personnel (ou sur Github si vous préférez).
Cette page utilise Prism pour la mise en forme du code CSS, légèrement amélioré pour l'occasion au point de vue des contrastes.
RÖCSSTI est sur Github ! (et tenu à jour, la CSS de RÖCSSTI existe aussi en anglais)
Vous pouvez télécharger la CSS de RÖCSSTI (environ 13 ko) (pour indication, la CSS pèse 1,8 ko minifiée et gzippée).
RÖCSSTI a un mode « safe for work », également appelé mode « pas d'humour » : les commentaires sont transformés en remarques plus passe-partout.
sub et sup pour améliorer l'interlignage.nocut pour supprimer la césure au besoin.float et ajout d'une classe gouttière .gut.kbd.abbr, merci Cahnory !!important, ç'ai mal !p { margin: 0 0 1em; }h1,
.h1 {
font-size: 1.8571em;
/* etc. */
}#efe margin: .5em;margin: 0;Activer le mode « safe for work » pour RÖCSSTI » : enlève toute trace d'humour dans les commentaires, afin de prouver que vous êtes sérieux (et un peu triste) dans votre travail.
Idée de jeu : vous pouvez chercher les différences.
@charset "UTF-8";
/* UTF-8 déclaré avant toute chose */
/**
* ROCSSTI : une base CSS par Nicolas Hoffmann http://rocssti.nicolas-hoffmann.net/
* inspiré par http://www.knacss.com/
*
* ROCSSTI est sous licence CC-BY : http://creativecommons.org/licenses/by/3.0/fr/
*
* cette CSS est fournie telle quelle, sans aucune garantie d'aucun type,
* l'auteur ne saurait être tenu responsable de quoi que ce soit pour
* l'utilisation de RÖCSSTI.
*
* résumé
* 1 - reset
* 2 - ainsi font font font + liens
* 3 - layout et modules
* 4 - structure (page / menuaccess / header / main content / footer)
* 5 - forms
* 6 - dans le contenu
* 7 - homo tablettes
* 8 - mobile
* 9 - print
* 10- fix viewport
* Bonus : Fixes IE
*/
/**
* 1 - reset
*/
/* spécial HTML 5 */
article, aside, audio, canvas, datagrid, datalist, details, dialog, figure, footer, header, menu, nav, section, video { display: block; }
abbr, eventsource, mark, meter, time, progress, output, bb { display: inline; }
/* reset minimum */
html, body, blockquote, ul, ol, form { margin: 0; padding: 0; }
p { margin: 0 0 1em; }
ul, ol { padding-left: 2em; }
/* la base correspond à 10px */
html { font-size: 62.5%; }
body {
background: #fff;
color: #333;
font-family: Arial, helvetica, sans-serif;
font-size: 1.4em; /* taille de base équiv à 14px */
line-height: 150%; /* à corriger si besoin est */
}
/**
* 2 - ainsi font font font = ici les web fonts
*/
@font-face {
}
/* calculées via http://soqr.fr/vertical-rhythm/ merci @goetter & @eQRoeil */
h1,
.h1 {
font-size: 1.8571em; /* equiv 26px */
line-height: 1.6154em;
margin: 1.6154em 0 .8077em 0;
}
h2,
.h2 {
font-size: 1.7143em; /* equiv 24px */
line-height: 1.75em;
margin: 1.75em 0 .875em 0;
}
h3,
.h3 {
font-size: 1.5714em; /* equiv 22px */
line-height: 1.909em;
margin: 1.909em 0 .9545em 0;
}
h4,
.h4 {
font-size: 1.4286em; /* equiv 20px */
line-height: 1.05em;
margin: 2.1em 0 1.05em 0;
}
h5,
.h5 {
font-size: 1.2857em; /* equiv 18px */
line-height: 1.1667em;
margin: 2.3334em 0 1.1667em 0;
}
h6,
.h6 {
font-size: 1.1429em; /* equiv 16px */
line-height: 1.3125em;
margin: 2.625em 0 1.3125em 0;
}
.uppercase {
text-transform: uppercase;
}
/* autres classes utiles */
.smaller {
font-size: .7143em; /* equiv 10px */
line-height: 2.1em;
margin: 2.1em 0;
}
.small {
font-size: .8571em; /* equiv 12px */
line-height: 1.75em;
margin: 1.75em 0;
}
.big {
font-size: 1.1429em; /* equiv 16px */
line-height: 1.3125em;
margin: 1.3125em 0;
}
.bigger {
font-size: 1.2857em; /* equiv 18px */
line-height: 1.1667em;
margin: 1.1667em 0;
}
.biggest {
font-size: 1.4286em; /* equiv 20px */
line-height: 1.05em;
margin: 1.05em 0;
}
.nomargin { margin: 0; }
.nomargintop { margin-top: 0; }
.nopadding { padding: 0; }
.noborder,
iframe { border: 0; }
/* éviter interlignage disgracieux */
sup,
sub {
vertical-align: 0;
position: relative;
}
sup {
bottom: 1ex;
}
sub {
top: .5ex;
}
/* éviter problèmes de margin */
h1:first-child,
h2:first-child,
h3:first-child,
h4:first-child,
h5:first-child,
h6:first-child {
margin-top: 0;
}
/* virer marge basse sur dernier enfant */
p:last-child,
ul:last-child,
ol:last-child,
dl:last-child,
blockquote:last-child,
pre:last-child,
table:last-child {
margin-bottom: 0;
}
/* éviter marges supplémentaires sur éléments imbriqués */
li p,
li ul {
margin-bottom: 0;
margin-top: 0;
}
/* Vous ne passerez PAS (Gandalf) */
textarea,
table,
td,
th,
code,
pre,
samp,
div,
p {
word-wrap: break-word;
-webkit-hyphens: auto;
-moz-hyphens: auto;
-ms-hyphens: auto;
-o-hyphens: auto;
hyphens: auto;
}
/* pour supprimer la césure si besoin */
.nocut {
word-wrap: normal;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
-o-hyphens: none;
hyphens: none;
}
code,
pre,
samp {
white-space: pre-wrap;
}
code {
line-height: 1em;
}
kbd {
border: solid 1px;
border-top-left-radius: .5em;
border-top-right-radius: .5em;
padding: 0 .25em;
}
table {
margin-bottom: 1.5em;
}
/* j'y tiens, les abbr c'est bon pour la planète */
/* seuls ceux ayant un title sont signalés */
abbr[title] {
border-bottom: dotted 1px;
cursor: help;
/* couleur héritée du texte */
}
/* alignements de textes */
.alignright { text-align: right; }
.aligncenter { text-align: center; }
.alignleft { text-align: left; }
.aligntop { vertical-align: top; }
.alignbottom { vertical-align: bottom; }
/* Liens */
a {
color: #2573be;
}
/* penser au focus */
a:hover,
a:active,
a:focus {
color: #000;
}
/* éviter la bordure sur une image comprise dans un lien */
a:link img,
a:visited img {
border-style: none;
}
/* liens avec icônes, on peut utiliser les DATA-URI */
/* pour signaler liens externes */
a[href^="http://"],
a[href^="https://"] {
}
/* si URL complète sur un lien interne, virer signalement liens externes */
a[href^="http://www.mondomaine.com"] {
}
/* contact, liens mailto */
.mail,
a[href^="mailto:"] {
}
/* dont l'URL se termine par .pdf ou ce que vous voulez comme extension */
a[href$=".pdf"] {
}
/**
* 3 - layout et modules
*/
/* ça dépend, ça dépasse */
img,
table,
td,
blockquote,
code,
pre,
textarea,
input {
height: auto;
max-width: 100%;
}
/* pas de reset sur embed, object et video, ça fait foirer certains players */
/* utile pour gérer les floattants */
/* contient des floats */
.mod {
overflow: auto;
}
/* quelques floattants */
.left {
float: left;
}
.right {
float: right;
}
/* clearer les floats */
.clear {
clear: both;
}
.clearleft {
clear: left;
}
.clearright {
clear: right;
}
.clearhidden {
clear: both;
margin: 0;
padding: 0;
visibility: hidden;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
/* gouttière */
.gut {
height: 1px;
}
/* bloc centré */
.margesauto {
margin-left: auto;
margin-right: auto;
}
/* largeurs de blocks */
.w1 { width: 1%; }
.w2 { width: 2%; }
.w3 { width: 3%; }
.w5 { width: 5%; }
.w10 { width: 10%; }
.w20 { width: 20%; }
.w25 { width: 25%; }
.w30 { width: 30%; }
.w33 { width: 33.333%; }
.w40 { width: 40%; }
.w45 { width: 45%; }
.w49 { width: 49%; }
.w50 { width: 50%; }
.w60 { width: 60%; }
.w66 { width: 66.666%; }
.w70 { width: 70%; }
.w75 { width: 75%; }
.w80 { width: 80%; }
.w90 { width: 90%; }
.w100 { width: 100%; }
/* ici ajouter les largeurs en pixels */
.w500p { width: 500px; }
/* margins */
.mt1 { margin-top: 1em; }
.mt2 { margin-top: 2em; }
.mr1 { margin-right: 1em; }
.mr2 { margin-right: 2em; }
.mb1 { margin-bottom: 1em; }
.mb2 { margin-bottom: 2em; }
.ml1 { margin-left: 1em; }
.ml2 { margin-left: 2em; }
.m1 { margin: 1em; }
.m2 { margin: 2em; }
/* paddings */
.pt1 { padding-top: 1em; }
.pt2 { padding-top: 2em; }
.pr1 { padding-right: 1em; }
.pr2 { padding-right: 2em; }
.pb1 { padding-bottom: 1em; }
.pb2 { padding-bottom: 2em; }
.pl1 { padding-left: 1em; }
.pl2 { padding-left: 2em; }
.p1 { padding: 1em; }
.p2 { padding: 2em; }
/* spécial hr de 1px de haut */
hr {
background-color: #000;
border: 0;
color: #000;
height: 1px;
margin: 0 0 1em;
padding: 0;
}
/* pour cacher du texte de manière accessible… toussââââ */
.invisible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.hidden { display: none; } /* caché partout */
.nodesktop { display: none; } /* caché sur desktop */
.noprint {} /* caché sur print */
.notablet {} /* caché sur tablettes */
.nomobile {} /* caché sur mobile */
/**
* 4 - structure globale (page / menuaccess / header / contenu principal / footer)
*/
/* --- page --- */
#page {
margin: 0 auto;
position: relative;
width: 960px;
}
/* --- menuaccess = liens d'évitement --- */
#menuaccess {
}
/* idéalement mettez-les visibles pas uniquement au focus */
#menuaccess a {
}
/* sinon pensez à les rendre visibles au focus */
#menuaccess a:hover,
#menuaccess a:active,
#menuaccess a:focus {
}
/* --- header --- */
#header {
}
#logo {
}
#navigation {
}
/* --- contenu principal --- */
#main {
}
/* --- footer --- */
#footer {
}
/* Réseaux Sociaux À La Con : trucs inutiles de partage… souvent dans footer */
.rsalc {
}
/**
* 5 - forms
*/
/* donne envie de cliquer sur un bouton */
label,
button,
input[type="submit"],
input[type="button"],
input[type="reset"] {
cursor: pointer;
}
/* évite un resize potentiellement foireux */
textarea {
resize: vertical;
}
label,
button,
input,
select {
vertical-align: middle;
}
/* à adapter selon le design voulu */
input,
select,
textarea {
border: 1px solid #000;
border-radius: 5px;
padding: .5em;
width: 250px;
}
/* à adapter selon le design voulu */
.button {
background: #fff;
border-radius: 5px;
-webkit-box-shadow: 1px 1px 1px #ddd;
box-shadow: 1px 1px 1px #ddd;
color: #000;
}
/*
* évite dimensionnement des radios et checkboxes
* et un affichage différent sous IE
*/
input[type="radio"],
input[type="checkbox"] {
background-color: none;
border: 0;
width: auto;
}
/* pour annuler la taille des inputs ou autres */
.auto {
width: auto;
}
/* messages d'erreur ou de confirmation */
.alert,
.alert input,
.alert textarea,
.alert select {
color: #bf0000;
font-weight: bold;
}
/* .redborder sert à débugger uniquement */
.alert input,
.alert textarea,
.alert select,
.redborder {
border: 1px solid #bf0000;
}
.alert img {
border: 0;
}
.ok {
}
/* peut être complété par les attributs HTML5 required
* exemple avec une couleur, penser à ne pas uniquement transmettre l'info ainsi
*/
select:required:invalid,
input:required:invalid,
input:focus:invalid,
textarea:required:invalid,
textarea:focus:invalid {
background: #fef6f6;
-moz-box-shadow: none;
}
input:focus:required:valid,
textarea:focus:required:valid,
select:focus:required:valid {
background: #efe;
-moz-box-shadow: none;
}
/**
* 6 - dans le contenu (contenus spécifiques aux pages)
*/
/* home */
/**
* 7 - homo tablettes
*/
@media (max-width: 768px) {
/* affichage des éléments */
.nodesktop { display: block; }
/* cachage des éléments inutiles, chabitte ! */
.notablet { display: none; }
/* linéarisation contenus flottants */
.autotablet {
float: none;
width: auto;
}
/**
* adaptation structure globale (page / menuaccess / header / contenu principal / footer)
*/
/**
* dans le contenu (contenus spécifiques aux pages)
*/
}
/**
* 8 - mobile
*/
@media (max-width: 640px) {
/* affichage des éléments */
.notablet { display: block; }
/* cachage des éléments inutiles, chabitte ! */
.nomobile { display: none; }
/* linéarisation contenus flottants */
.automobile {
float: none;
width: auto;
}
/**
* adaptation structure globale (page / menuaccess / header / contenu principal / footer)
*/
/**
* dans le contenu (contenus spécifiques aux pages)
*/
}
/**
* 9 - print
*/
@media print {
/* ajouter là-dedans les éléments qui ont besoin d'être
* resetés de manière très bourrine pour le print
*/
body,
html,
#page {
background-color: #fff;
background-image: none;
border: 0;
box-shadow: none;
color: #000;
float: none;
height: auto;
margin: 0;
min-height: auto;
padding: 0;
position: static;
width: auto;
}
body {
padding: .5em;
}
/* cachage des éléments inutiles, chabitte ! */
.noprint {
display: none;
}
/* affichage éléments spécifiques au print */
.onprint {
display: block;
}
/* éviter saut de page hasardeux */
blockquote, ul, ol {
page-break-inside: avoid;
}
h1, h2, h3, caption {
page-break-after: avoid;
}
/* affichage des liens, sauf pour image contenue */
/* attention, penser à vérifier le résultat et penser
* à limiter cette possibilité aux liens dans le contenu */
a:after {
content: " (" attr(href) ") ";
}
a:after img {
content: "";
}
/* ici fix propriétés particulières */
} /* end print */
/**
* 10 - fix viewport
*/
/* fix viewport pour Win8 (snap mode) et préparer le jour
* où le viewport sera supporté par tous les moteurs
*
* Exemples : http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/
* width=device-width => width: device-width;
* height=device-height => height: device-height;
* initial-scale=2 => zoom: 2;
* maximum-scale=2 => max-zoom: 2;
* minimum-scale=0.5 => min-zoom: 0.5;
* user-scalable=no => user-zoom: fixed;
*
* pour le snap mode de Win8 => seul width: device-width; fonctionne pour l'instant
*/
@-webkit-viewport {
width: device-width;
}
@-moz-viewport {
width: device-width;
}
@-ms-viewport {
width: device-width;
}
@-o-viewport {
width: device-width;
}
@viewport {
width: device-width;
}
/**
* Bonus : Fixes IE
*/
/*
* basé sur les classes conditionnelles sur l'élément HTML
*
* à utiliser seulement si peu de corrections et
* pas d'impact sur les perfs sur les autres navigateurs
*
*/
/* less than IE 9 */
.oldies .nooldies {
display: none;
}
.ie6 .noie6 {
display: none;
}
.ie7 .noie7 {
display: none;
}
.ie8 .noie8 {
display: none;
}
.ie9 .noie9 {
display: none;
}