CSS box alignment




grid-auto-flow: dense;



code

Grid-area !

On peut définir des zones très facilement en nommant les lignes et les colonnes.


Dans le simulateur grid inserer le code suivant : 

Définition de la grille 


.conteneur {
  display: grid;
  grid-gap: 20px;
  grid-template-columns: [side-start] 100px [main-start] 1fr 1fr [main-end];
  grid-template-rows: [main-start] 20px
                                                   20px
                                                   20px
                                 [main-end];
padding : 5px;
     }


Affectation du bloc #it1 à la zone main :

     #it1 {
                grid-area: main;
     }
 

slide


auto-fill auto-fit

Il n'est pas facile de comprendre la différence entre auto-fill et auto-fit.

Utilisons le simulateur ↔

.conteneur { display : grid; grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
padding-bottom :10px; // pour pouvoir tirer le bloc }

  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 200px :
En 200px, nous pouvons placer 4 blocs de 50px.

  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 249px :
Les blocs se répartissent 49px équitablement, chaque bloc a une dimension de 50+12~

  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 250px :
Les blocs sont retombés à une dimension de 50px ! 

Le principe est le suivant : 250px on peut placer 5 blocs de 50px. Il n'y a que quatre blocs. les blocs ne se répartissent pas les 50px non occupé.

  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 299px :

Taille d'un bloc

Pour une largeur du conteneur de 299px et une taille de base de 50px :

nb blocs = largueur du conteneur/taille de base
taille d'un bloc = taille de base + répartition entre blocs
répartition entre blocs =  largueur du conteneur - (nb blocs*taille de base)/nb de blocs


nb blocs = 299/50 =  5
taille d'un bloc = 50 + (299-5*50)/5 = ~60px

auto-fill

Plaçons le bloc rouge en [2,2].

.conteneur { display : grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
padding-bottom :10px; // pour pouvoir tirer le bloc }


#it1 { grid-column : 2/3; grid-row : 2/3; }


  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 399px :

Dans 399px on peut placer 3 blocs de 100px et on reparti le reste des 99px sur chaque blocs. Ainsi sont placés 3 blocs de 133px.


  • augmenter le bloc noir à l'aide du curseur en bas à droite pour atteindre 400px.
Dans 400px on peut placer 4 blocs de 100px, mais il n'y a que 3 blocs. Les blocs prennent 100px chacun.








  • Déplacer le bloc noir à l'aide du curseur en bas à droite pour atteindre 499px :



auto-fit

Le comportement est différent ici c'est le nombre "réels" de blocs qui se répartie l'ensemble de la longueur.

Ainsi dans le cas d'un conteneur de 400px, on reparti les 100px équitablement sur 3 blocs.




Grid en action

Nous allons utiliser "grid" pour réaliser un placement de blocs.

Code de départ

Nous écrivons un flux.
<section class="intro">
        <h1>Quai </h1>
        <h2><a href="#">voyager</a></h2>
        <img src="https://www.ibisc.univ-evry.fr/~dupont/52.jpg" alt="test">
        <p>Sous le rideau l'eau de la mer
</p>
</section>

le placement dans la grille de chaque balise permettra de modifier visuellement le flux (ordre des éléments)

Voici le résultat à obtenir après le placement des différents blocs. 



La plus grande difficulté du projet est la création de la grille ; le codage ne devant pas poser de difficulté à un spécialiste CSS.

Voici la grille que l'on peut imaginer comme un calque sur votre projet.

Elle est constituée de 3 colonnes et de quatre lignes.


Examinons quelques exemples de placement

l'image

Le placement de l'image prend toute la largeur et 3 lignes.

Pour donner l'aspect final, il faudra jouer sur d'autres propriétés en particulier la taille doit être mise à 100% (du conteneur)

{    width: 100%;    height: 100%;    object-fit: fill; // ou object-fit: cover;    opacity: 0.6;
}


le bloc  : voyager

Le placement de ce bloc est simple. 

Comme précédemment, il faudra un grand nombre d'ajouts pour obtenir le résultat final désiré.


{
    text-transform: uppercase;
    border: 1px solid black;
    background: rgba(255, 255, 255, 0.6);
    padding: 1rem 0.5rem 0.6rem;
    font-size: 1.2rem;
    margin: 0;
    align-self: self-start; // permet de mettre le bloc en haut de l'emplacement.
}

Le bloc : Quai

L'idée initiale de placer le bloc "quai" au centre, ne permettrait pas à la bordure rouge de prendre toute la longueur.
Le placement du bloc doit donc s'étendre sur toute la second ligne.


L'ajout de propriété sur le body {text-align: center;} et sur  le bloc { border-bottom: 20px solid red }
permettront de donner l'allure finale.

Les étapes du projet

Nous allons tenter de mettre en place une grille correspond aux attentes (du client).

Utilisation du simulateur

Avant de penser aux éléments réels du projet, nous allons penser en termes de blocs de couleur.

L'idée est d'arriver à construire une grille suivante : 


Allez sur http://dupontcss.blogspot.fr/p/test-grill.html

Ecrivez le code suivant

.conteneur {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr;
}


Ajouter les dispositions centrer

.conteneur {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr;
grid-gap: 2em; justify-content: center; align-items: center; text-align: center;
}

#it3 { width : 100%; height : 100%; grid-column: 1 / -1; grid-row: 1 / 4; object-fit: fill; opacity: 0.6; z-index:3; }


#it1 { text-transform: uppercase; grid-column: 1 / -1; grid-row: 2 / 3; font-size: calc(1rem + 1vw); margin-left: 1rem; margin-right: 1rem; z-index : 2; }



#it2 { text-transform: uppercase; border: 1px solid black; background: rgba(255, 255, 255, 0.6); padding: 1rem 0.5rem 0.6rem; font-size: 1rem; grid-column: 2 / 3; grid-row: 3 / 4; align-self: self-start; z-index : 2; }



#it4 { grid-column: 1 / -1; grid-row: 4 / 5; align-self: center; width: 66%; justify-self: center; font-size: calc(0.75rem + 1vw); line-height: 1.5; margin: 0; }


En action :




See the Pen Example grid by dupont (@dupontcodepen) on CodePen.

flex en action

Nous nous intéressons ici au comportement d'un menu qui s'adapte à la taille de votre écran.

Pour le HTML suivant

<article id="demoflexh">
    <header role="banner">
      <h1><a href="#">Cours @ </a></h1>
      <nav role="navigation"><ul>
        <li><a href="#">Cours</a></li>
        <li><a href="#">TD</a></li>
        <li><a href="#">TP</a></li>
        <li><a href="#">Website</a></li>
      </ul></nav>
    </header>
</article>

Voici le comportement attendu.


La réalisation de ce menu repose sur l'utilisation de média capable de modifier le CSS de votre passage en fonction de la taille !

L'idée est d'écrire pour chaque média (la taille de la fenêtre) le CSS indiquant les règles de comportement.

@media (min-width: tailleDuMédia) {
    règles
}

Dans cet exemple, deux tailles de média seront prises en charge.


Travail

Voici un lien pour aborder la notion de média  @media


rem

rem : root em est proportionnelle à la taille spécifiée pour la balise html.

body { font-size: 1.5rem; }
-> la taille de base de body sera de 24px = 1,5*16px (taille de base de HTML)

On pourra écrire :
    font-size: calc(0.75rem + 1vw);

margin-top : auto en action

Gridflex



Diminuer/Augmenter la taille

la grille

en bref
Utilisation de repeat avec comme valeur auto-fit. la largeur min est fixée à 200px
display: grid;  
grid-template-columns: 
repeat(auto-fit, minmax(200px, 1fr));
  grid-gap: 2rem; 
 
Pour l'instant le bug doit être corrigé en indiquant explicitement
sur chaque div
une valeur min (ou max) !
grid

NEWS

min-width: 200px; corrige le bug de minmax()
corne de brume ?
display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
Notez l'utilisation astucieuse pour les paragraphes de margin-top: auto;
flex

Img

cool !
Astuce du chef
margin-top: auto; 
le lien sera en bas !
margin-top : auto


Bug dans la conception de minmax !

JS Bin on jsbin.com

Grid et flex.


Diminuer/Augmenter la taille

la grille

en bref
Utilisation de repeat avec comme valeur auto-fit. la largeur min est fixée à 200px
display: grid;  
grid-template-columns: 
repeat(auto-fit, minmax(200px, 1fr));
  grid-gap: 2rem; 
 

items

corne de brume ?
Chaque item est flex
display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
Notez l'utilisation astucieuse pour les paragraphes de margin-bottom: 0;

Img

cool !
Les images sont définies avec
order: -1;
Les images vont apparaitre en haut des items