NFA016 : les cascading style sheets (CSS)

O. Pons, S. Rosmorduc, M. Simonot

Conservatoire National des Arts & Métiers

CSS = Cascading Style Sheets

Webographie

Structure d'une feuille de style

body {color:rgb(183,0,183); margin: 1.5cm;}
h1, h2 {
   color: aqua;
   text-align: center;
}
p {
   background-color: yellow;
}

Les sélecteurs

Définissent à quels éléments un style est appliqué.
body {color:rgb(183,0,183); margin: 1.5cm;}
h1, h2 {
   color: aqua;
   text-align: center;
}
p {
   background-color: yellow;
}
Certaines propriétés comme les fontes ou la couleur sont héritées par les éléments descendant.

On peut sélectionner...

un type de balise

h2 {text-align: center;}

une classe

.important {color: red;}

un id

#entete {background-color: blue;}

une balise d'une certaine classe

p.important {color: blue;}

un sélecteur descendant d'un autre sélecteur

p em {color:gray;}

tous les em dans un paragraphe seront en gris

p .important {color:green;} Tous les élements de classe important à l'intérieur d'un paragraphe seront verts.

On peut sélectionner ...

.resume em {color:yellow;} Tous les em descendants d'un élement de classe resume seront jaunes.

un sélecteur enfant d'un autre sélecteur

.resume>em {color:yellow;}

un sélecteur frère droit d'un autre sélecteur

h5+p {color:pink;}

un sélecteur frère (non forcément immédiat) d'un autre (CSS3)

h5 ~ p {color:pink;}

(le signe ~ est un "tilde")

Attribut id et feuille de style

  p#resume {color :green;}
  #toto {color :blue;}
  
et dans la page HTML :
  <h1 id="toto">Celui-ci est bleu </h1>
  <p id="resume"> celui-là est vert </p>
  
Rappel : deux éléments dans la même page ne peuvent avoir le même id.

Sélecteur d'attributs général

Pour sélectionner un élément sur la valeur d'un attribut quelconque :

[ ATTR=VALEUR]
Exemple:
  * [class="important"] {color :red;}
  p [class="remarque"] {color :red;}
  *[lang="fr"] {color :red;}
  

Remarque

.toto et *[class="toto"] sont similaires mais...

    <p class="titi toto"> un paragraphe;...</p>
  
est reconnu par :
  .toto {color: red;}
  *[class="titi toto"] {color: red;}
  
mais pas par :
  *[class="toto"] {color: red;}
  

Pseudo-classes

Sélecteurs additionnels, ajoutant typiquement des informations d'état ou de position.

S'écrivent ":" suivi de la pseudo-classe

Exemples

pseudo-classe nth-child : sélectionner un élément sur n (CSS3)

typiquement, permet d'alterner des présentations différentes dans des éléments successifs (tables, listes...)

Exemple :

   li:nth-child(even) {background-color: #A0A0FF;}
   li:nth-child(odd) {background-color: white;}
   li:first-child {background-color: #FF0000;}

Remarque : on ne compte que les éléments. Le texte isolé ne compte pas

un exemple
  <style type="text/css">
    #dfc :first-child {background-color: red;}
  </style>
  <div id="dfc">
    un <em>exemple</em>
  </div>

Exercice

Lire la page Html et la feuille de style qui suivent et répondre aux questions suivantes :

Exercice


  

  
  

Exercice

div, span et feuilles de style

body { color:rgb(183,0,183);}
h1,h2{ color:aqua;}
.important {background-color:grey;}
.important h1 {color:yellow;}
.important p {color:aqua;}  
  
<h1 >chapitre 2: les feuilles de style</h1>
<div class="important">
  <h1> Les selecteurs </h1>
  <p>Differents types de selecteurs</p>
</div>
<h1> Les propriétés </h1>
<p>bla bla bla</p>

Autres moyens d'introduire un style

Il existe deux autres manières d'introduire le style. On préfère normalement des feuilles de styles indépendantes.

Contenu d'un style (les propriétés)

Très nombreuses propriétés. Nous allons en voir quelques-unes. webographie :

Couleur

Trois façons de les désigner :

Propriétés de couleur

color

fixe la couleur du texte
  p {color: rgb(0,10,200);}
  

background-color

fixe la couleur du fond.
  p {color: red; background-color: yellow;}
  
(texte rouge sur fond jaune).

Polices de caractères

Polices de caractères

Problèmes divers, en particulier de droits.

Le navigateur client n'a pas forcément la police demandée

font-family

p {font-family: helvetica, verdana,sans-serif;}
  

Normallement, la dernière famille est l'une des trois familles de base.

Téléchargement de polices

Permet de définir ses propres "familles", à partir de polices qui seront téléchargées.

/* use Charis SIL - Regular in .woff format */
@font-face {
  font-family: CharisSILW;
  src: url(../fonts/CharisSIL-R.woff);
}
/* use Charis SIL - Italic in .woff format */
@font-face {
  font-family: CharisSILW;
  font-style: italic;
  src: url(../fonts/CharisSIL-I.woff);
}
  

Autres caractéristiques des polices et des textes

font-style
valeur : italic, oblique ou normal
font-weight
valeur : bold, bolder, lighter, normal
font-size
  • valeur numérique absolue: 12pt, 10mm, 1cm, 10px
  • taille prédéfinie : xx-small, x-small, small, medium, large, x-large, xx-large
  • taille relative au parent : smaller, larger (agrandit ou rétrécit la police par rapport à celle du parent)
  • valeur relative numérique : 150%, par rapport à la taille dans le parent.
  • taille relative à la police actuelle: 1em, 1ex (largeur d'un "m", hauteur d'un "x")
text-decoration
valeur underline, overline, line-through (barré) none
text-align
alignement horizontal du texte : left, right, center, justify
text-indent
indentation du premier paragraphe (décalage du début du texte)

Les boîtes

L'affichage est composé de boîtes contenant le texte. Chaque boîte est composée de plusieurs parties : le contenu (le texte lui-même), l'espace intérieur (spanning), la bordure et la marge.
 
(margin) (padding) (border)

le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu

le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu le contenu

 

propriétés des boîtes : les dimensions

Normalement, une boîte de type "block" occupe tout l'espace horizontal disponible, et sa hauteur est adaptée au texte à afficher.

démonstration

Inversement, des éléments de type span n'occupent que l'espace strictement nécessaire, pas forcément rectangulaire. (démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, démonstration, )

Il est possible de fixer les dimensions des boîtes.

Les unités

propriétés des boîtes : les dimensions

height, width
min-height, max-height, min-width, max-width
valeur : % ou px, em, cm... Attention: width et height sont les dimensions internes des boîtes (hors padding, bordure, margin).
#contact {height:4cm; width:30% ;}
margin
espace minimal entre la bordure de l'élément et les autres éléments. la marge est transparente ; elle ne prend donc pas la couleur de fond de l'élément. Il faut y penser véritablement comme à un espace.
padding
espace entre le texte et la bordure de l'élément

on a aussi margin-top, margin-right, margin-left, margin-bottom, padding-top,...padding-left

Propriétés des boîtes : les bordures (border)

Trois informations: largeur, style et couleur.
p {border:medium solid black;}
h1 {border:4px dotted green;}

Le style peut être (entre autres)

none

dotted

dashed

solid

double

groove

ridge

inset

outset

CSS3 introduit border-radius et border-image pour des bordures plus complexes.

solid, border-radius: 20px;

a aussi border-top, border-bottom, border-left, border-right

Bordures et tableaux

Les bordures s'utilisent assez naturellement avec les tableaux.

En règle générale, on va placer une bordure sur les cases.

th,td: {border: solid 1pt black;}
  
ab
ab

pour coller les cases, border-collapse (valeurs : separate ou collapse)

exemple

table {border-collapse: collapse;}
th,td: {border: solid 1pt black;}
  
ab
ab

Exercice

On veut mettre en ligne un livre sur la programmation.

Chaque chapitre a la même structure :

Écrire la page HTML correspondant au chapitre : héritage en java et la feuille de style qui s'appliquera à tous les chapitres de ce livre.

On veut obtenir la présentation suivante :

Héritage en Java

Résumé

Ce chapitre du cours traite de concepts relatifs à la programmation objet (hiérarchie de classe, héritage, extension, masquage) et sera illustré par un exemple de représentation de comptes bancaires et d’opérations liées à la manipulation de ceux-ci (retrait, dépôt, consultation).

Une classe simple

Décrivons maintenant la classe permettant de représenter un compte bancaire. Il faut, au minimum, connaître le propriétaire (que l’on représentera simplement par son nom), le numéro du compte .....

En java, dire qu'une classe en étend une autre (A extends B) signifie que tout élément de A est aussi un élément de B.

Note : la sobriété est normalement une vertu en typographie. Nous avons choisi à dessein des couleurs criardes pour simplifier l'exercice.

Propriétés de listes

list-style-type : apparence des signes d'une liste.

propriété de la liste (ul ou ol)

decimal
1.,2.,3.,4. etc...
lower-roman
i.,ii.,iii.,iv. etc.
upper-roman
I.,II.,III.,IV. etc...
lower-alpha
a.,b.,c.,d. etc.
upper-alpha
A.,B.,C.,D. etc...
disc
rond plein comme puce
circle
puce ronde
square
puce rectangulaire
none
pas de puce, pas de numérotation

list-style-image

   list-style-image:url([nom de fichier])}
 
Vous permet de mentionner un graphique pour vos propres puces.

Exercice

Dans le livre précédent, tous les 3 ou 4 chapitres, il y a des chapitres particuliers: les « mise en pratique». Ils contiennent des exercices et des projets, et ont une présentation différente.

Écrire la page HTML correspondant et modifier la feuille de style en conséquence.

Héritage en Java

Exercice

Ajouter une classe CompteRemunereAvecDecouvert.

Projet

Écrire un logiciel de jeu d'échec (on ne demande pas que le logiciel joue, seulement qu'il arbitre).

Quizz

  1. Si la classe B redéfinit la méthode f() de la classe A, et que j'écris A a= new B(); a.f(); J'appelle :
    1. la méthode f de la classe A
    2. la méthode f de la classe B
    3. les deux
    4. ça ne compile pas.
  2. Dire qu'une classe est abstraite signifie :
    • qu'elle est très compliquée à comprendre
    • que seules des sous-classes pourront être instanciées
    • qu'elle ne désigne pas un objet de la vie courante

Règles de résolutions de conflits

supposons que nous ayons :
    h1 {color: blue; font-size: large;}
    .titre {color:red;}
  
Comment se présente donc
    <h1 class="titre">un titre</h1>
  

Règles de résolutions de conflits

Calcul de la spécificité

On construit un triplet d'entiers :

  1. n1= le nombre d'ids d'attributs dans le sélecteur
  2. n2= le nombre d'attributs et de classes dans le sélecteur
  3. n3= le nombre de noms d'éléments et de pseudo-éléments(h1, h2, em, p, :first-line ...) dans le sélecteur.

Règles de résolutions de conflits

On compare les triplets par ordre lexicographique et le plus grand est le plus spécifique.

(a1,b1,c1) > (a2,b2,c2) si :

Exemples : En cas d'égalité, la dernière règle spécifiée l'emporte.

Positionnement et feuilles de styles

Problème : obtenir une mise en page complexe

à la base, mise en page de base : composition de boîtes de la largeur de l'écran. Empilement des boites en question

Titre

Paragraphe 1 Paragraphe 1 Paragraphe 1 Paragraphe 1

Paragraphe 2 Paragraphe 12 Paragraphe 2 Paragraphe 2 Paragraphe 2

Positionnement

Réalisé par plusieurs propriétés :

display
comportement général de l'élément : bloc, en-ligne, etc....
position
manière dont l'élément se positionne par rapport aux autres ou à la page
top, bottom, left, right
position de l'élément par rapport à son point de repère (fixé par position)

display (block, inline, none, etc.)

position (static | relative | absolute | fixed)

top, bottom, left, right

display

Valeurs possibles

inline
l'élément ne crée pas de nouvelle zone. Il s'insère dans un paragraphe existant. Pas de passage à la ligne.
une div normale (en block) ; ...
...
...
fin de la div
une div en inline
une second div en inline bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
et du texte à la suite ...
      

Notez qu'il n'est pas possible de fixer la taille des éléments inline (il faut utiliser block, inline-block, ou float)

block
l'élément est disposé dans un bloc rectangulaire dont on peut fixer la taille.
none
l'élément n'est pas affiché du tout
inline-block
extérieurement inline, peut contenir des blocs.

Position

La propriété position a différentes valeurs : static,relative,absolute,fixed

Emplacement

Positionnement relatif

valeurs : static et relative.

un paragraphe statique

un paragraphe relatif au précédent...

un paragraphe relatif au précédent...

  

La position de référence est la position « normale », pas la position modifiée

Positionnement absolu

Positionnement absolu par rapport à un élément ancêtre (qui contient l'élément à placer) et non à un élément qui précède (comme pour relatif).

Élément de référence: le premier parent en remontant dans l'arbre de la page qui ne soit pas en statique

Premier groupe
Second groupe
    <div style="position: relative; width:100%; height:10ex;">
      <div style="position: absolute; bottom: 5pt; right: 5pt;">Premier groupe</div>
      <div style="position: absolute; top: 50%; left: 10em;">Second groupe</div>      
    </div>
  
Un élément absolu :

Les flottants

Au départ: positionnement des illustrations dans le texte... comme ça :

le texte bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla


  
  
  

Rapidement détourné pour faire de la mise en page plus complexe

Valeurs

Comportement par rapport au parent

Les flottants ne sont pas pris en compte dans le calcul de la taille du parent

un essai. Vous voyez, ça ne tient pas.
 <div style="border: 1px solid;"> un essai.
    <img src="coursCSSdata/dessin.png" style="border: 1px solid
  black; padding: 3px; float:left;"> Vous voyez, ça ne
  tient pas.
  </div>
  

clear

Propriété qui permet d'interdire la présence d'un flottant d'un côté ou de l'autre d'un élément. On déplace l'élément après les flottants concernés.

valeurs:

un essai.

Avec "clear", on saute après le flottant

  <div style="border: 1px solid;"> un essai.
    <img src="coursCSSdata/dessin.png" style="border: 1px solid
  black; padding: 3px; float:left;" alt=""> 
    <p  style="clear:both;">Avec "clear", on saute après le flottant</p>
 </div>
  

Utilisation de clear pour inclure les éléments dans un cadre

On met parfois un div vide avec "clear: both" pour forcer l'élément à s'agrandir pour contenir les flottants.

un essai.

  

Astuces de mise en page

Float permet de créer une liste d'éléments complexes côte à côte.

légende

légende

légende

légende

légende

    <div style="border: 1px solid  black; padding: 3px; float:left;">
	 <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>
    <div style="border: 1px solid  black; padding: 3px; float:left;">
	 <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>
    <div style="border: 1px solid  black; padding: 3px; float:left;">
	 <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>
    <div style="border: 1px solid  black; padding: 3px; float:left;">
	 <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>
    <div style="border: 1px solid  black; padding: 3px; float:left;">
      <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>
  

autre solution pour le même effet : inline-block (mais "certains" navigateurs le gèrent mal)

légende

légende

légende

légende

légende

   <div style="border: 1px solid  black; padding: 3px; display:inline-block;">
	 <img src="coursCSSdata/dessin.png" alt=""/> <p> légende</p></div>

Combinaison de plusieurs propriétés

Généralement, utilisation simultanée de float, position, margin, etc...

Exemple

Menu en float à gauche. Largeur fixe
Le contenu

a

a

a

a

    <div>
    <div style="background-color: red; width: 15 em; height: 12ex;float: left; "> 
      Menu en float à gauche. Largeur fixe</div>
    <div style="background-color: lightblue;"> Le contenu</div>
    <div style="clear: both"></div>
  </div>
  
Menu en absolu. Largeur fixe (15em)

Le contenu. Marge de 16 em.

du texte

du texte

  <div style="margin-top: 1em; position: relative;">
    <div style="background-color: red; width: 15em; height:
    100%; position: absolute; margin: 0em; padding: 0em;"> Menu en absolu. Largeur fixe (15em)</div>
    <div style="background-color: lightblue; margin-left: 15em;"> <p>Le contenu. Marge de
    16 em. <p> du texte <p> du texte</div>
  </div>

Utilisation de display:inline-block;

Un premier essai, avec une largeur fixe, juste pour voir comment ça marche;
Un second bloc, sans largeur donnée.
du texte tout simple
dernier bloc.
  <style type="text/css">
    #inlineblocdemo div {
        display: inline-block; 
        border: solid 2pt;
        vertical-align: top; padding: 
        0.5em;
    }
  </style>
  <div id="inlineblocdemo">
    <div style="width: 15em;">
      Un premier essai, avec une largeur fixe, juste pour voir comment ça marche;
    </div>
        <div >
	  Un second bloc, sans largeur donnée.
    </div>
	du texte tout simple
        <div >
	  dernier bloc.
	</div>
  </div>