Advertisement
  1. Web Design
  2. HTML/CSS
  3. CSS

Construire Une Interface De Tableau De Bord Modulaire Avec Pure

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

Aujourd'hui, nous allons réaliser un tableau de bord minimaliste et élégant en utilisant Pure (voir le projet sur GitHub), la petite bibliothèque de modules CSS récemment lancée par Yahoo!. Nous aborderons et appliquerons par ailleurs quelques-uns des principes de SMACSS ("Scalable and Modular Architecture for CSS" soit "Architecture graduable et modulaire pour CSS"). Nous utiliserons en complément des icônes du site WeLoveIconFonts.com.

Note : Avant d'aller plus loin, précisons que nous n'insisterons qu'en passant sur les graphiques créés pour ce tableau de bord. Les meilleures conditions pour réaliser ce genre de graphiques supposent en effet un contexte Javascript plus lourd ; l'objet de ce tutoriel étant de traiter avant tout des CSS et seulement marginalement de JavaScript, nous ne nous attarderons donc pas sur les techniques de réalisations de graphiques.

Présentation rapide de Pure

Pure a été conçu avant toute chose par l'équipe Yahoo! et YUI comme un ensemble de modules très léger (moins de 6k). On peut le considérer comme une sorte de Normalize enrichi qui inclut en complément des styles pour des éléments aussi courants que des grilles, des formulaires, des boutons, des tableaux et des menus.

pure-basepure-basepure-base

L'équipe YUI a conçu Pure comme un point de départ, et non une solution complète. A partir de ce point de départ, il est attendu des développeurs qu'ils (ou elles) enrichissent et conçoivent leurs propres CSS personnalisées comme une extension de cette base.

C'est pour cette raison que l'essentiel de ce que nous montrons dans ce tutoriel consiste en un ensemble de techniques qui enrichissent une bibliothèque basique comme Pure pour l'adapter à des interactions d'application, comme l'utilisation d'un tableau de bord.

Présentation rapide de SMACSS

SMACSS, acronyme de "Scalable and Modular Architecture for CSS" (soit "Architecture graduable et modulaire pour CSS"), est un ensemble de pratiques créé par Jonathan Snook et conçu pour permettre le développement de CSS faciles à comprendre, simples à enrichir - et qui laisse de côté la guerre des spécificités CSS.

pure-smacsspure-smacsspure-smacss

Cette approche suppose aussi de ne pas utiliser d'ID pour la mise en forme et de limiter l'imbrication des sélecteurs autant que possible. L'idée est que les CSS peuvent être définies selon les catégories suivantes : base, structure, modules, états et thèmes. La structuration des CSS autour de ces catégories et le respect des conventions de nomenclature qui leur correspondent donnent à SMACSS une lisibilité et une clarté immédiates. Ceci permet notamment d'éviter les noms de classes à qui sont associés des styles arbitraires. Le principe de la catégorisation met ainsi en pratique ces conventions de nomenclature.

  • Base : pas de nom (éléments par défaut, pas de classes)
  • Structure : .layout, .grid, .grid-column, .grid-column.five.columns
  • Modules : .btn (nom du module), .btn-default, .btn-calltoaction; .modal, .modal-header
  • Etat : .is-hidden, .is-active (implique des modifications de classes déclenchées par JavaScript)
  • Thème : .theme-background, .theme-border, .font-1, .font-2

Ces types de classes décrivent ainsi leurs propres fonctionnalités et leurs propres catégories. Les règles de SMACSS restent toutefois davantage des lignes directrices, des approches ; n'hésitez pas à inspecter les sources des CSS Pure pour voir des exemples concrets de SMACSS.

C'est parti !

Créons tout d'abord un simple dossier pour notre projet en utilisant HTML5 Boilerplate et remplaçons Normalize.css par Pure. Pour ce tutoriel, nous utiliserons le lien CDN YUI de Pure <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.1.0/pure-min.css">. Nous inclurons également Font Awesome, la collection de polices d'icônes de Twitter, en ajoutant une ligne à notre fichier CSS (voir les instructions sur weloveiconfonts). Tout au long du balisage du document, vous rencontrerez ainsi des icônes définies par des classes comme "fontawesome-calendar".

1
/* dans main.css */
2
3
[class*="fontawesome-"]:before {
4
  font-family: 'FontAwesome', sans-serif;
5
}
1
<!-- dans index.html, à la place de normalize -->
2
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.1.0/pure-min.css">
3
<link rel="stylesheet" href="http://weloveiconfonts.com/api/?family=fontawesome">

Nous sommes maintenant prêts à utiliser ces outils pour notre design ! Commençons par définir une structure CSS de base qui contiendra nos éléments et que l'on insère dans 'body'.

1
<header>
2
	<nav></nav><!-- Le menu de navigation sera placé ici -->
3
</header>
4
<section class="dashboard">
5
	<!-- nos éléments de tableau de bord se logeront ici -->
6
</section>
7
<footer>
8
	<!-- les informations de copyright pourront être incluses ici -->
9
</footer>

Pour ce qui est de la palette de couleurs, nous avons opté pour Yellow Tree Frog, conçu par l'utilisateur LJK sur le site colourlovers.

pure-frogpure-frogpure-frog

En première étape, référençons ces couleurs en commentaire en haut du fichier CSS.

1
/*

2
	red: #E73F3F

3
	orange: #F76C27

4
	yellow: #E7E737

5
	blue: #6D9DD1

6
	purple: #7E45D3

7
*/

Astuce : Il est souvent intéressant de commencer en utilisant d'abord les mots-clés associés aux couleurs CSS puis de chercher/remplacer les codes hex plus tard, de manière à ne pas à avoir à copier/coller le code hex constamment.

Définition du menu

PureCSS fournit un module de menu prêt à l'emploi que nous allons utiliser pour définir un menu pour notre tableau de bord. Pour commencer, appliquons les directives de SMACSS et utilisons la nomenclature de module basée sur les classes de Pure.

1
<nav class="pure-menu pure-menu-open pure-menu-horizontal">
2
    <a href="#" class="pure-menu-heading">WebDesignTuts</a>
3
    <ul>
4
        <li class="pure-menu-selected"><a href="#">Tableau de bord</a></li>
5
        <!-- other items ... -->
6
    </ul>
7
</nav>

Notez que ce menu ne sera pas fonctionnel dans ce tutoriel. En passant, on peut voir que notre menu a été créé avec une mise en forme horizontale par défaut. Continuons en modifiant le fond du menu pour le passer en noir semi-transparent.

1
.pure-menu {
2
    font-weight: lighter;
3
}
4
.pure-menu.pure-menu-fixed {
5
    position: fixed;
6
}
7
.pure-menu.pure-menu-blackbg {
8
    background: #222;
9
}
10
.pure-menu.pure-menu-blackbg .pure-menu-heading:hover {
11
    color: #efefef;
12
}
13
.pure-menu.pure-menu-blackbg a {
14
    color: #fff;
15
}
16
.pure-menu.pure-menu-blackbg a:hover {
17
    background: #666;
18
}
19
.pure-menu.pure-menu-blackbg .pure-menu-selected a {
20
    background: #7E45D3;
21
}
22
.pure-menu.pure-menu-blackbg .pure-menu-selected a:hover {
23
    color: #efefef;
24
}

Notez ici l'application des conventions proposées par SMACSS et Pure. Nous définissons deux nouvelles classes, 'pure-menu-blackbg' et 'pure-menu-fixed', puis les sous-styles nécessaires à la prise en compte de cette classe. Vous remarquerez aussi que des classes d'origine sont écrasées (par exemple la classe 'pure-menu' est modifiée avec une épaisseur de police moindre).

pure-menupure-menupure-menu

Création d'un module de tableau de bord

Créons maintenant un module de tableau de bord. Nous utiliserons des styles basiques pour notre élément "bloc" de base.

1
.dashboard-piece {
2
    min-height: 300px;
3
    -webkit-box-sizing: border-box;
4
    -moz-box-sizing: border-box;
5
    box-sizing: border-box;
6
    color: #fff;
7
    text-align: center;
8
    position: relative;
9
    padding-bottom: 40px;
10
}

Maintenant que notre module de base est défini, nous allons l'étendre en créant de nouvelles classes avec le préfixe 'dashboard-piece'. Commençons par créer les classes de couleurs de fond.

1
.dashboard-piece-redbg {
2
    background-color: #E73F3F;
3
}
4
.dashboard-piece-orangebg {
5
    background-color: #F76C27;
6
}
7
.dashboard-piece-yellowbg {
8
    background-color: #E7E737;
9
}
10
.dashboard-piece-bluebg {
11
    background-color: #6D9DD1;
12
}
13
.dashboard-piece-purplebg {
14
    background-color: #7E45D3;
15
}
16
.dashboard-piece-graybg {
17
    background-color: #798388;
18
}

Ensuite, définissons le balisage des différents éléments du tableau de bord. Intégrons le SVG en-ligne du logo Envato, qui prendra ainsi toute la largeur de la grille.

pure-envato-logopure-envato-logopure-envato-logo
1
<section class="dashboard pure-g-r clearfix">
2
    <div class="pure-u-1 dashboard-piece dashboard-piece-redbg dashboard-piece-logo">
3
        <h1>
4
            <svg x="0px" y="0px" width="132.89669167px" height="120px" viewBox="0 0 73.351 82.791" enable-background="new 0 0 73.351 82.791" xml:space="preserve">
5
                <g><path fill="#FFFFFF" d="M7.372,27.487C-1.903,39.206-2.261,55.13,5.369,67.05c6.858-17.611,15.499-37.423,26.14-55.114

6
                C21.514,16.159,12.19,21.405,7.372,27.487z M73.333,2.971c-0.11-0.924-0.589-1.7-1.276-2.216C71.4,0.204,70.53-0.084,69.612,0.021

7
                c0,0-2.738,0.589-7.093,1.704C41.722,21.698,24.654,48.459,11.43,74.155c0.492,0.427,0.991,0.857,1.512,1.268

8
                c14.784,11.696,36.239,9.194,47.936-5.57C74.349,52.822,73.333,2.971,73.333,2.971z"/></g>
9
            </svg>
10
        </h1>
11
    </div>
12
    <div class="pure-u-1-3 dashboard-piece dashboard-piece-bluebg">
13
        <div class="dashboard-content">
14
            <h2><i class="fontawesome-twitter"></i></h2>
15
            <p class="dashboard-metric">+20 followers<span class="light"><i class="fontawesome-angle-up"></i>6.8%</span></p>
16
        </div>
17
    </div>
18
    <div class="pure-u-1-3 dashboard-piece dashboard-piece-orangebg">
19
        <div class="dashboard-content">
20
            <h2><i class="fontawesome-github"></i></h2>
21
            <p class="dashboard-metric">
22
                142 Commits
23
                <div class="light bar-horizontal">
24
                    <div class="bar-horizontal-bar" style="width:57%">
25
                        57% Capacity
26
                    </div>
27
                </div>
28
            </p>
29
        </div>
30
    </div>
31
    <div class="pure-u-1-3 dashboard-piece dashboard-piece-yellowbg">
32
        <div class="dashboard-content">
33
            <p class="dashboard-metric">
34
                <h2><i class="fontawesome-check"></i></h2>
35
                <div class="dashboard-metric">
36
                    <strong>63 / 90</strong><br><small>Tasks Complete</small>
37
                </div>
38
            </p>
39
        </div>
40
        <div class="bar-vertical" style="height:70%;"></div>
41
    </div>
42
</section>

Il y a beaucoup de choses à noter dans ce balisage. Tout d'abord, nous utilisons 'pure-u-1-3' (et autres classes pure-u-*) à l'intérieur d'un élément de ligne de grille, 'pure-g-r'. Ces classes font partie du système de grille Pure. Pour bien le comprendre, consultez la documentation complète de YUI sur les grilles ; le concept de base est que la classe de grille pure-u-1-3 équivaut à 1/3 de la largeur de la grille complète ; une classe pure-u-3-4 équivaudra donc à 3/4 de la largeur de la grille. Le module qui abrite le logo a ainsi une classe pure-u-1, ce qui lui permet de s'étendre sur toute la largeur de la grille.

Les autres éléments du tableau de bord sont utilisés pour l'affichage de différents types de données. Les règles CSS suivantes sont utilisées pour mettre en forme ces données et d'autres sections au sein des éléments de notre tableau de bord.

1
.dashboard-piece-logo h1 {
2
    line-height: 100px;
3
}
4
.dashboard-piece-logo svg {
5
    margin-top: 80px;
6
}
7
.dashboard-piece h1 {
8
    line-height: 300px;
9
    font-size: 3.6em;
10
    margin: 0;
11
}
12
.dashboard-content {
13
    position: relative;
14
    z-index: 999;
15
}
16
.dashboard-content p {
17
    font-weight: lighter;
18
}
19
.dashboard-content .light {
20
    opacity: 0.4;
21
    display: block;
22
}
23
.dashboard-content h2 i {
24
    font-size: 4em;
25
    opacity: 0.4;
26
}
27
.dashboard-metric {
28
    text-transform: uppercase;
29
    font-size: 1.6em;
30
    line-height: 1;
31
}
32
.dashboard-metric i {
33
    margin-right: 0.6em;
34
}
pure-modulespure-modulespure-modules

Les classes de barres horizontales et verticales sont par ailleurs définies séparément des modules de contenu du tableau de bord.

1
.bar-horizontal {
2
    height: 36px;
3
    background-color: rgba(255,255,255,0.4);
4
    position: relative;
5
    display: block;
6
    margin-top: 20px;
7
}
8
.bar-horizontal-bar {
9
    background: #fff;
10
    height: 36px;
11
    line-height: 36px;
12
    color: #444;
13
    text-transform: uppercase;
14
    font-weight: bold;
15
    font-size: 0.8em;
16
    letter-spacing: 0.2em;
17
    position: absolute;
18
    top: 0;
19
    left: 0;
20
}
21
.bar-vertical {
22
    position: absolute;
23
    bottom: 0px;
24
    left: 0px;
25
    width: 100%;
26
    background: rgba(200,200,200,0.5);
27
}

Enfin, nous faisons appel aux modules pré-développés de Pure pour créer et mettre en forme un tableau pour un module "événements" ; nous réutilisons aussi la classe de barre horizontale pour le module "météo". Ces classes sont étendues avec des éléments de CSS personnalisés. Voici le balisage pour les deux derniers modules.

1
<section class="dashboard pure-g-r clearfix">
2
    <div class="pure-u-2-3 dashboard-piece dashboard-piece-graybg dashboard-piece-events">
3
        <div class="dashboard-content">
4
            <p class="dashboard-metric">
5
                <h2><i class="fontawesome-calendar"></i></h2>
6
                <h3>Upcoming Events</h3>
7
                <table class="pure-table pure-table-center pure-table-horizontal pure-table-dark">
8
                    <thead>
9
                        <tr>
10
                            <th>With:</th>
11
                            <th>Where:</th>
12
                            <th>When:</th>
13
                        </tr>
14
                    </thead>
15
                    <tbody>
16
                        <tr>
17
                            <td>John Smith</td>
18
                            <td>WDTuts Office</td>
19
                            <td>Jun 20, 9:30AM</td>
20
                        </tr>
21
                        <tr class="pure-table-odd">
22
                            <td>George Bluth</td>
23
                            <td>Sudden Valley</td>
24
                            <td>Jun 23, 4PM</td>
25
                        </tr>
26
                        <tr>
27
                            <td>Michael Scott</td>
28
                            <td>Scranton, PA</td>
29
                            <td>Jun 24, 2:45PM</td>
30
                        </tr>
31
                    </tbody>
32
                </table>
33
            </p>
34
        </div>
35
    </div>
36
    <div class="pure-u-1-3 dashboard-piece dashboard-piece-purplebg weather weather-rain">
37
        <div class="dashboard-content">
38
            <p class="dashboard-metric">
39
                <h2><i class="fontawesome-umbrella"></i></h2>
40
                <div class="dashboard-metric">
41
                    <strong>80% Chance</strong><br><small>of Precipitation</small>
42
                    <div class="light bar-horizontal">
43
                        <div class="bar-horizontal-bar" style="width:80%">80%</div>
44
                    </div>
45
                </div>
46
            </p>
47
        </div>
48
    </div>
49
</section>
50
<footer>
51
    &copy; 2013 Envato
52
</footer>

Et les classes de tableau Pure enrichies.

1
.pure-table-center {
2
    margin: 0 auto;
3
}
4
.pure-table-dark { color: #ddd; }
5
.pure-table-dark .pure-table-odd { color: #444; }

Pour finir, nous allons introduire un peu d'espacement dans la partie supérieure du module Météo de manière à ce qu'il s'aligne plus précisément sur le module Evénements. Pour ce faire, nous utiliserons simplement la classe "weather" complémentaire en ajustant son espacement haut. Pour finaliser l'ensemble, nous mettrons en forme la baissière (footer) pour qu'elle soit assortie au menu de navigation haut.

1
.weather {
2
    padding-top: 60px;
3
}
4
footer {
5
    background: rgb(20,20,20);
6
    color: #aaa;
7
    padding: 10px;
8
    font-size: 0.6em;
9
    font-weight: bold;
10
}

Enrichissement de l'aspect responsive

Pure contient des éléments de grille responsive pré-définis. Ils sont identifiés par le sélecteur suivant.

1
.pure-g-r>[class ^="pure-u"]

C'est un sélecteur d'aspect un peu complexe (consultez cet article The 30 CSS Selectors you Must Memorize pour des explications avancées) qui cible tout d'abord les enfants directs des éléments ".pure-g-r". Ces enfants doivent ensuite avoir un attribut de classe qui commence par le préfixe "pure-u"... fiou !

Il pointe par exemple sur cette div :

1
<section class="dashboard pure-g-r clearfix">
2
    <div class="pure-u-2-3 dashboard-piece dashboard-piece-graybg dashboard-piece-events">

Ce sélecteur est utilisé au sein des @media queries pour réordonner les éléments de la grille suivant la largeur disponible. Ces éléments unitaires sont ainsi réduits à 100% en-dessous de 767px, ce qui est excessif pour notre tableau de bord : réduisons-les à seulement 50% entre 480 et 767px à l'aide des @media queries suivantes.

1
@media only screen and (max-width:767px) {
2
    .pure-g-r>[class ^="pure-u"]{width:50%; float: left;}
3
}
4
@media only screen and (max-width:480px) {
5
    .pure-g-r>[class ^="pure-u"]{width:100%; }
6
}

Une pincée de JavaScript

Dans 'main.js', nous allons écrire un peu de JavaScript pour nous assurer que tous les modules d'une même ligne sont bien de la même hauteur.

1
(function(){
2
var to;
3
4
	function pieceHeights(){
5
		to = setTimeout(function(){
6
			$(".pure-g-r").each(function(i,el){
7
				var contentPieces = $(el).find(".dashboard-piece");
8
				var max = 0;
9
				contentPieces.css("min-height","");
10
				$.grep(contentPieces, function(el,i){
11
					max = Math.max($(el).outerHeight(),max);
12
				});
13
				contentPieces.css("min-height", max);
14
			});
15
		}, 400);
16
	}
17
18
	$(window).on("resize", function(){
19
		clearTimeout(to);
20
		pieceHeights();
21
	}).trigger("resize");
22
23
}());

Ce JavaScript définit une fonction qui boucle, pour chaque ligne, à travers chacun des éléments possédant une classe de "dashboard-piece", puis identifie le plus grand module de cette ligne. Il paramètre ensuite la hauteur de tous les éléments de cette ligne selon la hauteur du plus haut des éléments de la ligne.

Conclusion

Ce tutoriel ne fait qu'aborder quelques-uns des modules proposés par Pure. Sur la base des modèles utilisés dans ce tutoriel, vous pouvez créer des CSS à la maintenance, la lecture et la gradualité facilitées. L'utilisation d'une petite bibliothèque comme Pure vous permet de mettre en œuvre une solution puissante, testée et bien documentée pour répondre aux problématiques les plus répandues.

Et vous, que faites-vous d'autre avec Pure ? Dites-le nous dans les commentaires !

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.