Un cœur !

https://css-tricks.com/hearts-in-html-and-css/

Animation : article

https://zellwk.com/blog/css-animations/

font-family: monospace : En action

Pour avoir un taille de caractère identique ajouter au CSS la règle suivante :

div {
  font-family: monospace;
}

Comment mettre en JS des attributs de Grille

let a = document.body.firstElementChild;
a.style.gridColumn = 5;
a.style.gridRow = 5;

En utilisanat cssText :

a.style.cssText = "grid-row:1/5;grid-column:3";

On peut même calculer les valeurs !
div.style.cssText = `grid-row:${Math.floor(i/this.grid.width)+1};grid-column:${col+1}`;

Notez pour certains attributs l'ajout de px :
`margin-left:${Math.floor(8)}px`;

voir fichier


flex : en action

Voici un truc pour réaliser un effet.

fichier 🔺

Observez tout d'abord l'effet du hover !

p:hover, p:hover ~ p {
content : "\002605";
color : red;
}

Idée

Inverser l'ordre des éléments peut s’avérer fort utile !

Inversons donc l'ordre des éléments !

section {
display : flex;
flex-direction : row-reverse;
justify-content : flex-end;
}

fichier 🔁

Version avancée :

fichier 🔂

input : in action

Il est possible d’interagir sur le design sans JS

L'écriture de la régle CSS dépend de la strcture HTML

Dans le cas d'une structure de type


  1. enoncé
  2. coche
  3. réponse


coche:not(:checked) ~ réponse {
display : none;
  }

fichier↺

JS Bin on jsbin.com


Niveau avancé :

On souhaite mettre mainteant la coche en bas !

Que faut il modifier ?

Ordre des blocs placés automatiquement : grid;

Utilisons  le simulateur et appliquons le style suivant :

.conteneur {
  display : grid;
  grid-template-columns: repeat(2, 100px);
  grid-auto-rows: 100px;
}
#it1 {
   grid-column: 2;
   grid-row: 1;
}

Nous allons tenter de comprendre l'algorithme utilisé pour placer les blocs.

Tout d'abord, les blocs "fixes" sont placés. On appelle bloc fixe un bloc qui à son emplacement défini en ligne et en colonne.
Dans notre exemple seul, le bloc rouge est un bloc fixe ; sa colonne et ligne sont définies.


Une fois que les blocs fixes sont placés, les autres éléments sont placés automatiquement dans l'ordre du DOM (défini dans le HTML).

Dans notre exemple :

Les blocs bleu, vert et gris sont placés dans cet ordre.

Remarque : le bloc bleu défini après le bloc rouge se retrouve placé avant lui.



Pour les blocs "fixes", il peut y avoir intersection des zones. Les blocs se recouvrent dans l'ordre de leur position dans le DOM, voir Intersection.

Cas des blocs définis sur la dimension définie par le flow.

Examinons ce cas



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

#it2 {
   grid-column : span 2;
}

#it3 {
  grid-row : 1;
}

Priorité des blocs :

  1. Le bloc 1 est traité en priorité (bloc fixe). 
  2. Pour grid-auto-flow: row; nous recherchons des blocs qui ont l'attribut grid-row déclaré. Le bloc 3 est traité
  3. Les blocs restants sont traités par ordre du flux.
autre exemple


Cas des blocs définis uniquement sur une dimension.



Voici un Autre cas

exemple avec grid-column-end

.conteneur {
  display : grid;
  grid-template-columns: repeat(2, 100px);
  grid-auto-rows: 100px;
  grid-gap: 10px;
}


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

#it2 {
  grid-column-end: span 2;         
}

Comme précédemment le bloc rouge est placé en priorité, ensuite le bloc bleu cherche une place où il peut se placer sans "toucher" les blocs fixes. Exemple


Les blocs vert et gris seront placés à la suite avec les mêmes conditions en respectant entre eux les précédences du DOM. Ils ne peuvent "dépasser" le bloc bleu.




Pour remplir les trous vides  grid-auto-flow: dense; fait des merveilles


Pour tout s'avoir du placement des blocs dans une grille ! niveau expert

Déterminer le placement des blocs sur la grille.

<div class="wrapper">
   <div>1</div>
   <div>2</div>
   <div>3</div>
   <div>4</div>
   <div>5</div>
   <div>6</div>
</div>
.wrapper {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 100px;
  grid-gap: 10px;
}

div:nth-child(4n+1) {
  grid-column-end: span 2;
  grid-row-end: span 2;
  background-color: blue;
}
div:nth-child(2) {
   grid-column: 3;
   grid-row: 2 / 4;
 }
div:nth-child(5) {
   grid-column: 1 / 3;
   grid-row: 1 / 3;
}


Les algorithmes utilisés sont très sensibles aux configurations.
Ce n'est pas simple.

Devenez un expert : lisez la suite.

Exemple

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