14
loading...
This website collects cookies to deliver better user experience
---
width: 17
height: 23.5
pages: 488
offset: true
---
offset: true
pour préciser que les pages sont plus petites que la couverture elle-même, ce qui est parfois le cas pour les gros livres (voir le gif ci-dessus)liquid
, je pourrais alors générer des styles inline à partir de ces variables :<img style="width: {{ item.data.width * 10 }}px">
20cm
de large dans le monde physique fera 200px
sur mon site.<div
class="book {% if item.data.offset %}book--offset{% endif %}"
style="
--width: {{ item.data.width }};
--height: {{ item.data.height }};
--pages: {{ item.data.pages }};
"
>
offset
, si elle est présente, permet d'ajouter une classe supplémentaire à l'élément .book
.style
, et sont maintenant disponibles pour chaque élément .book
..book
possède désormais ces 3 variables qui ne sont accessibles qu'à lui-même et ses enfants..book {
/* The books will be contained inside a square of this dimension */
--base-size: 250;
--base-size-rem: calc(var(--base-size) * 0.0625rem);
@include medium {
--base-size: 350;
}
}
250
pixels de côté (--base-size
). Je décline ensuite cette valeur en rem
(mieux que les pixels), grâce à une petite multiplication.@medium
est une media query qui me permet d'agrandir la taille de base sur des écrans plus larges.--base-size-rem
dans la mixin @medium
. En effet, --base-size-rem
est dynamiquement calculée à partir de --base-size
. Quand l'une change, l'autre aussi, y compris à l'intérieur d'une media query..book {
--is-portrait: clamp(
0,
calc((var(--height) - var(--width)) * 999),
1
);
}
--is-portrait
. (ça fait ça de moins à saisir dans la "base de données").clamp
est une fonction CSS qui va me donner une valeur entre deux bornes (le premier et le troisième paramètre).clamp(0, 0.2, 1); /* 0.2, car c'est entre les bornes */
clamp(0, -15, 1); /* 0, car le chiffre du milieu est trop petit */
clamp(0, 4, 1); /* 1, car le chiffre du milieu est trop grand */
(height - width) * 999
.(height - width)
est positif. La multiplication par 999
va nous faire obtenir un nombre très grand, transformé en 1 par les bornes du clamp
.clamp
.--base-size-rem
. S'il est en paysage, au contraire, cela devrait être dépendant de largeur, qui elle sera --base-size-rem
.object-fit: contain
pour contenir l'image n'est pas suffisante ici, car d'autres éléments et pseudo-éléments constitutifs de l'effet final ont besoin de connaître les dimensions exactes..book {
/* Height is base size if portrait, based on size ratio otherwise */
--height-rem: clamp(
calc(var(--is-portrait) * var(--base-size-rem)),
calc(var(--base-size-rem) / (var(--width) / var(--height))),
var(--base-size-rem)
);
}
clamp
, on connaît déjà, alors regardons nos bornes. Que remarque t-on si le livre est en mode portrait ? La première borne :var(--is-portrait) * var(--base-size-rem)
--base-size-rem
, puisque is-portrait
vaut 1. Et c'est aussi la valeur de la seconde borne. Si les bornes sont identiques, peut importe la valeur du milieu, le résultat sera --base-size-rem
.0
grâce à notre booléen. Et donc la valeur du milieu pourra entrer en action. La voici :var(--base-size-rem) / (var(--width) / var(--height))
clamp
.@mixin supports-clamp {
@supports (width: clamp(0px, 1px, 2px)) {
@content;
}
}
.book {
--height-rem: var(--base-size-rem);
@include supports-clamp {
/* Height is base size if portrait, based on size ratio otherwise */
--height-rem: clamp(
calc(var(--is-portrait) * var(--base-size-rem)),
calc(var(--base-size-rem) / var(--ratio-width-height)),
var(--base-size-rem)
);
}
}
clamp
n'est pas supporté, le navigateur utilisera la première ligne et ignorera tout le reste. Pour quelques utilisateurs, le rendu sera un peu moins subtil, mais le contenu reste lisible et c'est l'essentiel.