Outils pour utilisateurs

Outils du site


prog:css

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
prog:css [2024/05/17 18:03] – [Origine] : ajout de l'ordre de priorité rootprog:css [2024/12/23 11:33] (Version actuelle) – [Position] : précision sur "display: flex" root
Ligne 78: Ligne 78:
 ===Id=== ===Id===
  
-''#id'' : identifiant via ''id='' (identifiant unique)comme ''class'' sauf que les ''id'' sont uniques. Préfixer par un dièse.+''#id'' : identifiant via ''id='' (identifiant unique) comme ''class'' sauf que les ''id'' sont uniques. Préfixer par un dièse.
  
 ===Pseudo-classe=== ===Pseudo-classe===
Ligne 91: Ligne 91:
  
 '':only-child'' '':only-child''
 +
 +'':first-of-type'' : seulement le premier élément.
  
   * Cas dynamique   * Cas dynamique
Ligne 100: Ligne 102:
 ===Pseudo-élément=== ===Pseudo-élément===
  
-Désigne une partie d'un élément. Préfixé par un '':''. Les navigateurs tolèrent aussi un seul '':''.+Désigne une partie d'un élément. Préfixé par un ''::''. Les navigateurs tolèrent aussi un seul '':''.
  
 ''::first-line'' : Première ligne (d'un paragraphe par exemple) dans l'affichage graphique. Les mots . ''::first-line'' : Première ligne (d'un paragraphe par exemple) dans l'affichage graphique. Les mots .
Ligne 249: Ligne 251:
 | 7 | user-agent (browser) | !important | | 7 | user-agent (browser) | !important |
 | 8 | CSS transitions | | | 8 | CSS transitions | |
 +
 +====Layer====
 +
 +Les layers permettent de ranger des styles dans des ensembles. Les styles sont appliquées dans l'ordre des layers.
 +
 +L'intérêt est qu'il est facile de changer l'ordre des layers. Quand un ''@layout nom'' est rencontré, il est créé s'il n'existait pas. S'il existe déjà, il est complété. Donc, on commence par lister l'ordre des layers puis on les remplit.
 +
 +Les layers anonymes existent. Dans ce cas, il n'est pas possible d'ajouter des éléments à l'intérieur une fois le layer définit. L'ordre des layers anonymes ne peut donc pas être modifié.
 +
 +Il existe aussi des layers imbriqués. Les noms de ces layers sont séparés par des ''.''.
 +
 +L'import de feuilles CSS dans des layers se fait via le code :
 +
 +<code css>
 +@import url("components-lib.css") layer(components);
 +@import url("dialog.css") layer(components.dialog);
 +@import url("marketing.css") layer();
 +</code>
 +
 +Exemple :
 +
 +| <code css>
 +@layer site, page;
 +
 +@layer page {
 +  h1 {
 +    text-decoration: overline;
 +    color: red;
 +  }
 +}
 +
 +@layer site {
 +  h1 {
 +    text-decoration: underline;
 +    color: green;
 +  }
 +}
 +</code><code html>
 +<h1>Is this heading underlined?</h1>
 +</code> | <HTML>
 +<style>
 +@layer code2_site, code2_page;
 +
 +@layer {
 +  body {
 +    margin: 0;
 +  }
 +}
 +
 +@layer code2_page {
 +  .code2 h1 {
 +    text-decoration: overline;
 +    color: red;
 +  }
 +}
 +
 +@layer {
 +  body {
 +    margin: 0;
 +  }
 +}
 +
 +@layer code2_site {
 +  .code2 h1 {
 +    text-decoration: underline;
 +    color: green;
 +  }
 +}
 +</style>
 +<div class="code2">
 +<h1>Is this heading underlined?</h1>
 +</div>
 +</HTML> |
 +
 +  * Ordre de priorité
 +
 +Du moins important au plus important.
 +
 +  - Ordre des layers pour les non ''!important'',
 +  - inline normal styles (''%%<h1 style="color: yellow;>%%''),
 +  - animating styles,
 +  - Ordre inverse des layers pour les ''!important'',
 +  - inline important styles,
 +  - transitioning styles,
 +
 +| <code css>
 +@layer A, B;
 +
 +h1 {
 +  color: orange;
 +  background-color: green;
 +  text-decoration: overline pink !important;
 +  box-shadow: 5px 5px lightgreen !important;
 +}
 +
 +@layer A {
 +  h1 {
 +    color: grey;
 +    background-color: black !important;
 +    text-decoration: line-through grey;
 +    box-shadow: -5px -5px lightblue !important;
 +    font-style: normal;
 +    font-weight: normal !important;
 +  }
 +}
 +
 +@layer B {
 +  h1 {
 +    color: aqua;
 +    background: yellow !important;
 +    text-decoration: underline aqua;
 +    box-shadow: -5px 5px magenta !important;
 +    font-style: italic;
 +    font-weight: bold !important;
 +  }
 +}
 +</code><code html>
 +<div>
 +  <h1 style="color: yellow; background-color: maroon !important;">Inline styles</h1>
 +</div>
 +</code> | <HTML>
 +<style>
 +@layer code3.A, code3.B;
 +
 +.code3 h1 {
 +  color: orange;
 +  background-color: green;
 +  text-decoration: overline pink !important;
 +  box-shadow: 5px 5px lightgreen !important;
 +}
 +
 +@layer code3.A {
 +  .code3 h1 {
 +    color: grey;
 +    background-color: black !important;
 +    text-decoration: line-through grey;
 +    box-shadow: -5px -5px lightblue !important;
 +    font-style: normal;
 +    font-weight: normal !important;
 +  }
 +}
 +
 +@layer code3.B {
 +  .code3 h1 {
 +    color: aqua;
 +    background: yellow !important;
 +    text-decoration: underline aqua;
 +    box-shadow: -5px 5px magenta !important;
 +    font-style: italic;
 +    font-weight: bold !important;
 +  }
 +}
 +</style>
 +<div class="code3">
 +<div>
 +  <h1 style="color: yellow; background-color: maroon !important;">Inline styles</h1>
 +</div>
 +</div>
 +</HTML> |
  
 ====Ordre de priorité==== ====Ordre de priorité====
Ligne 283: Ligne 444:
   * ''unset'' : rend la valeur par défaut et annule également la valeur par défaut de la feuille de style.   * ''unset'' : rend la valeur par défaut et annule également la valeur par défaut de la feuille de style.
  
 +=====Le modèle de boite=====
 +
 +Une boite / box stocke des données dans un rectangle et est composée d'une marge, bordure et padding.
 +
 +{{:prog:css:box-model.png?544|}}
 +
 +====Position====
 +
 +Les box peuvent être soit :
 +
 +  * dans une ligne dédiée (''display: block''). Dans ce cas, ''height'' et ''width'' sont respectés. ''h1'', ''p'' sont ''block'' par défaut.
 +  * comme un caractère dans la ligne (''display: inline''). Dans ce cas, ''height'' et ''width'' sont ignorés. Les propriétés ''top'' et ''bottom'' des propriétés ''padding'' / ''margin'' / ''borders'' n'influeront pas sur les autres box ''inline''. ''a'', ''span'', ''em'' et ''strong'' sont ''inline'' par défaut.
 +
 +Les données dans les boites peuvent être soit :
 +
 +  * comportement par défaut.
 +  * ''display: flex''. Ils ont donc une ligne dédiée mais tant que les boites se suivent, elles sont les unes a côté des autres. Elles peuvent être, soit horizontales, soit verticales en fonction de la valeur de ''flex-direction'' (''row'' (par défaut) / ''column'' / ''row-reverse'' / ''column-reverse'').
 +  * ''display: inline-flex''. Les boites ne sont pas dans une ligne dédiée et tant que les boites se suivent, elles sont les unes a côté des autres. Contrairement à ''inline'', les blocs n'ont pas une largeur de 100% mais s'adaptent au contenu.
 +  * "entre deux" (''display: inline-block''). Les boites ne sont pas sur une ligne dédiée mais ''height'' et ''width'' sont respectés.
 +
 +| <code css>
 +p,
 +ul {
 +  border: 2px solid rebeccapurple;
 +  padding: .5em;
 +}
 +
 +.block,
 +li {
 +  border: 2px solid blue;
 +  padding: .5em;
 +}
 +
 +ul {
 +  display: flex;
 +  list-style: none;
 +}
 +
 +dd {
 +  display: inline-flex;
 +  list-style: none;
 +}
 +
 +.block {
 +  display: block;
 +}
 +span .span1 {
 +  margin: 20px;
 +  padding: 20px;
 +  width: 80px;
 +  height: 50px;
 +  background-color: lightblue;
 +  border: 2px solid blue;
 +  display: inline-block;
 +}
 +span .span2 {
 +  margin: 20px;
 +  padding: 20px;
 +  width: 80px;
 +  height: 50px;
 +  background-color: lightblue;
 +  border: 2px solid blue;
 +}
 +</code><code html>
 +<ul>
 +  <li>flex 1</li>
 +  <li>flex 2</li>
 +  <li>flex 3</li>
 +</ul>
 +<dl>
 +  <dd>inline-flex 1</dd>
 +  <dd>inline-flex 1</dd>
 +<dl>
 +<p>p block <span class="block">block</span> have been wrapped in a <span>inline block</span>.</p>
 +<p>I am a paragraph and this is a inline-block <span class="span1">span</span> inside that paragraph.
 +A span is an inline element and so does respect width and height.</p>
 +<p>I am a paragraph and this is a normal <span class="span2">span</span> inside that paragraph.
 +A span is an inline element and so does not respect width and height.</p>
 +</code> | <HTML>
 +<style>
 +.code4 p,
 +.code4 ul {
 +  border: 2px solid rebeccapurple;
 +  padding: .5em;
 +}
 +
 +.code4 .block,
 +.code4 li {
 +  border: 2px solid blue;
 +  padding: .5em;
 +}
 +
 +.code4 ul {
 +  display: flex;
 +  list-style: none;
 +}
 +
 +.code4 dd {
 +  display: inline-flex;
 +  list-style: none;
 +}
 +
 +.code4 .block {
 +  display: block;
 +}
 +
 +.code4 .span1 {
 +  margin: 20px;
 +  padding: 20px;
 +  width: 80px;
 +  height: 50px;
 +  background-color: lightblue;
 +  border: 2px solid blue;
 +  display: inline-block;
 +}
 +
 +.code4 .span2 {
 +  margin: 20px;
 +  padding: 20px;
 +  width: 80px;
 +  height: 50px;
 +  background-color: lightblue;
 +  border: 2px solid blue;
 +}
 +</style>
 +<div class="code4">
 +<ul>
 +  <li>flex 1</li>
 +  <li>flex 2</li>
 +  <li>flex 3</li>
 +</ul>
 +<dl>
 +  <dd>inline-flex 1</dd>
 +  <dd>inline-flex 1</dd>
 +<dl>
 +<p>p block <span class="block">block</span> have been wrapped in a <span>inline block</span>.</p>
 +<p>I am a paragraph and this is a inline-block <span class="span1">span</span> inside that paragraph. A span is an inline element and so does respect width and height.</p>
 +<p>I am a paragraph and this is a normal <span class="span2">span</span> inside that paragraph. A span is an inline element and so does not respect width and height.</p>
 +</div>
 +</HTML> |
 +
 +====Dimension====
 +
 +  * Cas général
 +
 +Content : via ''width'' et ''height'',
 +
 +Padding : via ''padding'',
 +
 +Border : via ''border'',
 +
 +Margin : via ''margin''. Si deux éléments se touchent et que leur ''margin'' est du même signe, la combinaison des marges sera la valeur la plus éloignée de zéro (plus grande si positive ou plus petite si négative). Si l'une est positive et l'autre négative, ce sera la somme des deux.
 +
 +  * Alternative modèle
 +
 +Dans ce cas, c'est ''content'' + ''padding'' + ''border'' qui vaut ''width'' et ''height''.
 +
 +{{:prog:css:alternate-box-model.png?440|}}
 +
 +Pour l'activer, il faut ajouter ''box-sizing: border-box'' à l'élément. Pour l'ajouter à tout le monde :
 +
 +<code css>
 +html {
 +  box-sizing: border-box;
 +}
 +
 +*,
 +*::before,
 +*::after {
 +  box-sizing: inherit;
 +}
 +</code>
 +
 +  * Propriétés logiques
 +
 +Il est possible de choisir l'orientation du texte (horizontal ou vertical) avec la propriété ''writing-mode''. Dans ce cas, la propriété ''width'' peut vouloir être remplacée par la valeur de ''height''.
 +
 +{{:prog:css:horizontal-tb.png?634|}} {{:prog:css:vertical-tb.png?406|}}
 +
 +Il faut alors remplacer ''width'' par ''inline-size'' et ''height'' par ''block-size''.
 +
 +Il est aussi possible de faire la même chose avec ''margin'', ''border'' et ''padding''.
 +
 +<code css>
 +margin-block-start: 20px;
 +padding-inline-end: 2em;
 +padding-block-start: 2px;
 +border-block-start: 5px solid pink;
 +border-inline-end: 10px dotted rebeccapurple;
 +border-block-end: 1em double orange;
 +border-inline-start: 1px solid black;
 +</code>
 +
 +  * Scrollbar / ascenseur
 +
 +Si la dimension d'une boite est bloquée et qu'il y a plus de texte que la boite peut contenir, le texte va déborder. Le contrôle du débordement se fait via ''overflow'' / ''overflow-x'' / ''overflow-y'' (''visible'' : valeur par défaut, le débordement sera visible, ''hidden'' : tout ce qui déborde de la boite sera masqué (déconseillé), ''scroll'' : une scrollbar va apparaitre si besoin.)
 +
 +=====Propriétés=====
 +
 +====background====
 +
 +<code css>
 +background-color: #567895;
 +background-color: black;
 +background-color: rgb(255 255 255 / 50%);
 +</code>
 +
 +Il est aussi possible de générer des gradients de couleur avec ''linear-gradient'' / ''radial-gradient'' / ''conic-gradient''.
 +
 +La couleur de fond peut se combiner avec ''background-image: url(star.png);'' si l'image a une composante de transparence.
 +
 +Par défaut, une image n'est pas redimensionnée et est répétée pour remplir l'élément.
 +
 +Si on veut contrôler la répétition, on peut utiliser ''background-repeat'' avec :
 +
 +  * ''no-repeat'', ''repeat-x'', ''repeat-y'', ''repeat''.
 +  * ''space'' : se répète et ajoute du vide entre les images plutôt que de mettre des images tronquées à droite et en bas,
 +  * ''round'' : se répète et étire les images pour remplir le vide.
 +
 +<code css>
 +background-size: 100%;
 +background-size: cover;
 +background-size: contains;
 +</code>
 +
 +''cover'' : l'image est agrandie pour couvrir toute la surface et peut être rognée.
 +
 +''contains'' : l'image est agrandie pour couvrir 100% en hauteur ou en largeur. Elle est entièrement affichée et des bandes transparentes sont insérées pour conserver le ratio.
 +
 +Si des bandes transparentes sont affichées, il est possible d'indiquer où elles seront via la propriété ''background-position: center center;''.
 +
 +Enfin, il est possible d'avoir plusieurs images. Dans ce cas, il suffit de séparer les valeurs par des virgules :
 +
 +<code css>
 +background-image: url(image1.png), url(image2.png);
 +background-repeat: no-repeat, repeat-x;
 +background-position: 10px 20px, top right;
 +</code>
 +
 +''background-attachment'' permet de gérer le déplacement de l'image en fonction de la position de l'ascenseur.
 +
 +  * ''scroll'' : se déplace en fonction de l'ascenseur principal de la page.
 +  * ''fixed'' : ne se déplace pas.
 +  * ''local'' : se déplace en fonction de l'ascenseur principal de la page et de l'ascenseur local de l'élément.
 +
 +====border====
 +
 +Il y a 4 sous propriétés (''top'', ''bottom'', ''left'', ''right'') et 3 autres sous propriétés (''style'', ''width'', ''color'').
 +
 +<code css>
 +border-top-width: 1px;
 +border-top-style: solid;
 +border-top-color: black;
 +</code>
prog/css.1715961803.txt.gz · Dernière modification : 2024/05/17 18:03 de root