Notes sur CSS, partie 2

Sources : w3schools, Pierre Giraud

Howto

accordion

  

L'effet accordéon (accordion) regroupe des lignes de titre qui, une fois cliquées, affichent un contenu détaillé.

Dans l'exemple fourni par w3schools, les couples button/div sont utilisés.

Le button est stylé en une ligne pleine (100% de largeur),

quand on clique sur ce bouton, la partie div cachée (display: none), apparaît.

Le survol du bouton provoque une transition de la couleur de fond en gris, sur 0,4 seconde.

Puis un clic sur le bouton passe le display en block.

C'est javascript avec addEventListener sur click qui programme les actions associées aux boutons.

nextElementSibling permet d'atteindre l'élément frère suivant le bouton, soit la div immédiatement en-dessous.

La classe active est basculée grâce à this.classList.toggle("active");

On peut considérer que cet exemple est responsive, même sans media query, car les éléments prennent 100% de la largeur.

Voir l'exemple Icons, pour ajouter les signes + et -

accordion

centrer1

  

Blocs centrés dans une div

La div conteneur a une hauteur définie, les blocs sont centrés verticalement et horizontalement.

Démo

Bloc 1

Bloc 2

Bloc 3

Bloc 4

Source
<style>
.conteneur01 {
  width: 50%;
  height: 150px;
  line-height: 150px;
  background-color: lightblue;
  text-align: center; /* centre horizontalement */
}
.conteneur01 p{
  display: inline-block;
  vertical-align: middle;
  line-height: 1.3rem;
  border: 1px solid black;
  text-align: center; /* centre verticalement */
  padding: 10px;
}
</style>

<div class="conteneur01">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>

centrer2

  

Bloc centré dans une page

Centrer verticalement et horizontalement un bloc, sur tout l'espace restant, par exemple pour une page d'accueil.

Source
<style>
.container02 {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateX(-50%) translateY(-50%);
    border: 1px solid red;  /* repérer la div */
}
.center02{
    text-align: center; /* centrer horizontalement dans la div interne */
}
</style>
<div class="container02">
    <div class="center02">
        Bloc centré verticalement et horizontalement<br>
        avec position et tranform
    </div>
</div>

centrer3

  

Centrer avec flex

Démo
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
<style>
html, body, .container03 {
    height: 100%;
}
.container03 {
    display: flex;
    align-items: center;
    justify-content: center;

        display: -webkit-flexbox;
        display: -ms-flexbox;
        display: -webkit-flex;
        -webkit-flex-align: center;
        -ms-flex-align: center;
        -webkit-align-items: center;
}
</style>
</head>
<body>
<div class="container03">
    <span>
        Bloc centré verticalement et horizontalement<br>
        avec flex
    </span>
</div>

</body>
</html>

centrer4

  

Centrer une image en arrière-plan dans le body

Fonctionne quelles que soient les dimensions de l'image.

Attention : s'il y a une barre de menu en haut, l'image n'est pas décalée vers le bas, donc elle n'est pas complètement centrée sur l'espace visible.

https://www.w3schools.com/cssref/pr_background-position.asp

Source
<!DOCTYPE html>
<html>
<head>
<style>
body {
    background-color: black; /* couleur visible, non couverte par une image plus petite que l'écran */
    background-image:url(http://gangand.net/mm/mnu/wallpapers/wp02.jpg);
    background-repeat:no-repeat;
    background-attachment:fixed;
    background-position:center;
    /* version shorthand */
    /* background: black url(http://gangand.net/mm/mnu/wallpapers/wp10.jpg) no-repeat fixed center; */
    /* background: lightblue url("img_tree.gif") no-repeat fixed center; */
}
</style>
</head>
<body>
</body>
</html>

centrer5

Quelques trucs

Centrer avec flex, ...

menus

  

Menus sur w3schools, cliquer ci-dessous

Menus

page Giraud sticky

menu0 (topnav)

  

Progression

menu1

  

Menu déroulant 1

Video (3 mn)

Progression

menu2

  

Menu déroulant 2

Video (9 mn)

Progression

menu3

  

Menu déroulant 3

Video (12 mn)

Progression

menu4

  

Menu déroulant 4

Video (21 mn)

menu5

Menu déroulant 5

Video (37 mn)

Progression

Flex

flex_intro

  

Selon Wikipédia, les Flex Box CSS sont un standard CSS3 de disposition des éléments dans une page web. Ce standard permet d'avoir un design adaptatif à l'écran. Les éléments peuvent être réagencés selon que l'on est sur un téléphone portable ou un écran d'ordinateur.
flexbox travaille sur deux axes : l'axe principal (main axis) et l'axe secondaire (cross axis), qui lui est perpendiculaire.
"La plupart des propriétés flexbox s'appliquent à l'élément conteneur, car elles concernent la suite de blocs inclus, les items flex". Premiers pas en CSS3 et HTML5 (Francis Draillard)

flex-direction oriente les blocs horizontalement(row) ou verticalement (column). flex-wrap gère les retours à la ligne avec wrap ou no-wrap.
flex-flow est un raccourci pour ces deux propriétés :
flex-flow = flex-direction + flex-wrap.

Pour voir une explication détaillée de flex, voici un très bon article de 17 pages d'explications en français.
Cliquer sur Sans flex pour voir les blocs sans style.

Sans flex

Les blocs prennent toute la largeur et se placent les uns sous les autres.

Bloc 1

Bloc 2

Bloc 3


Bloc 3, ligne 5

Bloc 4

Bloc 5
La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...

Source
<style>
.conteneur_flex {
    padding: 9px;
    border-radius: 10x;
    border: 1px solid blue;
    width: 299px;
}
.conteneur_flex p {
    border: 1px solid white;
    padding: 10px;
}
</style>

<div class="conteneur_flex">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3<br><br><br>Bloc 3, ligne 5</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>

flex1

  

Cliquer sur Démo pour voir les blocs dans un style flex.

Flex1

Les blocs sont juxtaposés et peuvent même dépasser du conteneur.

Bloc 1

Bloc 2

Bloc 3


Bloc 3, ligne 5

Bloc 4

Bloc 5
La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...

Source
<style>
.conteneur_flex{
    display: flex;
    padding: 9px;
    border-radius: 10x;
    border: 1px solid blue;
    width: 299px;
}
.conteneur_flex p{
    border: 1px solid white;
    padding: 10px;
}
</style>

<div class="conteneur_flex">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3<br><br><br>Bloc 3, ligne 5</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>
Flex1 + height auto

Les blocs sont juxtaposés et ont la même hauteur.

Bloc 1

Bloc 2

Bloc 3


Bloc 3, ligne 5

Bloc 4

Bloc 5
La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...

Source
<style>
.conteneur_flex2{
    display: flex;
    padding: 9px;
    border-radius: 10x;
    border: 1px solid blue;
    width: 299px;
}
.conteneur_flex2 p{
    border: 1px solid white;
    padding: 10px;
    height: auto;
}
</style>

<div class="conteneur_flex1">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3<br><br><br>Bloc 3, ligne 5</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>
Flex1 column

Les blocs sont superposés.

Bloc 1

Bloc 2

Bloc 3


Bloc 3, ligne 5

Bloc 4

Bloc 5
La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...

Source
<style>
.conteneur_flex{
    display: flex;
    flex-direction: column;
    padding: 9px;
    border-radius: 10x;
    border: 1px solid blue;
    width: 299px;
}
.conteneur_flex p{
    border: 1px solid white;
    padding: 10px;
}
</style>

<div class="conteneur_flex">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3<br><br><br>Bloc 3, ligne 5</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>

flex2

flex2

  

Cliquer sur Démo pour voir l'action de wrap.

Flex wrap

Flex wrap ...

Bloc 1

Bloc 2

Bloc 3


Bloc 3, ligne 5

Bloc 4

Bloc 5
La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...

Source
<style>
.conteneur_flex{
    display: flex;
    flex-wrap: wrap;
    padding: 9px;
    border-radius: 10x;
    border: 1px solid blue;
    width: 299px;
}
.conteneur_flex p{
    border: 1px solid white;
    padding: 10px;
}
</style>

<div class="conteneur_flex">
    <p>Bloc 1</p>
    <p>Bloc 2</p>
    <p>Bloc 3<br><br><br>Bloc 3, ligne 5</p>
    <p>Bloc 4</p>
    <p>Bloc 5<br>La ligne 2 du bloc 5 est plutôt longue, n'est-ce pas ...</p>
</div>

flex_et_grid

flex_et_grid

Notes sur la vidéo de Amélie Benoît (26:57)

On ajoute display: flex; au parent, ceci permet d'agencer les éléments enfant. flex ne gère que les éléments de premier niveau, les éléments enfant.
justify-content: gère l'alignement sur l'axe principal.
align-items: gère l'alignement sur l'axe secondaire.
flex-wrap: très intéressant pour le responsive.

CSS-grid simplifie en quelques lignes les effets obtenus avec bootstrap sur de longues lignes : Bootstrap et CSS-grid. Avec grid, les propriétés sont surtout affectées au conteneur : display: grid, grid-template-columns, grid-template-rows.

css_grid

Notes sur la vidéo de Jen Simmons (15:24)

Jen Simmons
ToucheAction
Basics of CSS Grid - The Big Picture 15:24
9 Biggest Mistakes with CSS Grid 14:20

Ressource en ligne : CSS Grid Layout Module Level 1