Générateur CSS pour un effet de verre haute résolution
(glass3d.dev)- glass3d generator est un outil qui permet de prévisualiser instantanément et de copier du CSS à texture de verre en modifiant les paramètres
- Les principaux réglages se composent du blur, de la brightness et de la saturation de
backdrop-filter, ainsi que de la couleur et du choix de texture - La couleur est gérée en HSL avec une valeur alpha ; la valeur d’exemple est
hsl(189 80% 10% / 0.2) - Les textures disponibles sont rice paper, egg shell, ink jet, coarse et topology
- Le CSS généré combine
.glass3d,::before,::afteret lez-indexdes éléments enfants pour séparer le filtre d’arrière-plan, la texture de bruit, l’ombre interne et la couche de contenu
Valeurs ajustables dans glass3d generator
- Quand les paramètres sont modifiés, le résultat est immédiatement reflété dans l’interface elle-même
- Le CSS finalisé peut être copié et utilisé
- Les principaux paramètres sont les suivants
backdrop-filterblurbrightnesssaturationcolortexture
Structure du CSS généré
- La classe
.glass3ddéfinit les variables CSS et la base des calques--filter-glass3d:blur(32px) brightness(0.85) saturate(2.5)--color-glass3d:hsl(189 80% 10% / 0.2)--noise-glass3d:egg-shell.pngdetransparenttextures.com- Utilise
position: relative,z-index: 4et plusieurs niveaux debox-shadow
.glass3d::beforeapplique le filtre d’arrière-plan et la texture- Utilise
var(--filter-glass3d)pour-webkit-backdrop-filteretbackdrop-filter - Les variables de couleur et de bruit sont respectivement utilisées dans
background-coloretbackground-image - Définit
background-size: 100pxetbackground-repeat: repeat
- Utilise
.glass3d::afterajoute une ombre interne de surbrillance- Utilise plusieurs valeurs
inset box-shadow
- Utilise plusieurs valeurs
.glass3d > *appliqueposition: relativeetz-index: 6afin que le contenu apparaisse au-dessus
1 commentaires
Commentaires sur Hacker News
Cette approche a le problème de n’appliquer le flou qu’aux pixels situés juste derrière la surface, ce qui est bien montré ici : https://www.joshwcomeau.com/css/backdrop-filter/#the-issue
Ça vaut le coup de le lire avec la discussion suivante : https://news.ycombinator.com/item?id=42302907. Si l’arrière-plan bouge en dessous, le problème du flou limité aux pixels juste derrière devient assez important ; avec un fond statique, ce n’est généralement pas très grave.
border-radiusavec un masque SVGÇa fonctionnait bien sur des éléments codés en dur, mais je n’ai pas encore résolu comment le faire fonctionner dans une bibliothèque complète de composants où le
border-radiuschange selon le branding du client et les container queries.Le matériau par défaut se rapproche plutôt du papier.
Pour moi, la version ajustée entre en conflit avec les indices de profondeur, ce qui la rend bien plus distrayante et plus fausse.
Le rendu est plutôt réussi, mais sans la réfraction du verre, on perd ce qui fait selon moi la principale contribution de Liquid Glass : cette forte sensation de séparation entre les couches
Material propose d’excellentes ressources de design montrant en 3D latérale que les apps doivent être composées de couches cohérentes en mouvement. Mais une fois tout aplati en 2D, il devient très difficile de repérer où se trouvent les fonctionnalités. Les gens ratent très souvent les boutons d’action dans les coins
Le mouvement aide un peu à distinguer le chrome du contenu, mais il y a trop peu d’éléments qui définissent visuellement l’ensemble. Le plus grand atout de Liquid Glass, à mon avis, c’est la distorsion des bords. Quand le contenu bouge, cela crée un mouvement non linéaire, et la vision humaine le capte immédiatement
Les captures d’écran statiques ne sont pas toujours flatteuses, mais en mouvement, la séparation des éléments fonctionne bien mieux que tout ce que j’ai vu jusqu’ici. Il manque ici cet élément clé de réfraction, qui exploite fortement la sensibilité humaine au mouvement
J’avais déjà vu une autre excellente démo web, mais je n’arrive plus à la retrouver ; à la place, cette démo est moins bonne visuellement et peu performante sur mobile, mais elle montre bien étape par étape à quel point ce travail est complexe. Reproduire la distorsion des bords uniquement avec des filtres SVG est une voie assez brutale : https://atlaspuplabs.com/blog/liquid-glass-but-in-css#breaki...
J’ai aussi retrouvé une collection d’essais autour de Liquid Glass (CodePen Spark), et je trouve que le deuxième lien est un exemple très réussi, avec un SVG prédéfini et fortement codé en dur : https://codepen.io/spark/453 https://codepen.io/lucasromerodb/pen/vEOWpYM
Les gens voient du vrai verre tous les jours, donc ils ont une intuition de ce qui paraît authentique et juste. Du coup, les imitations semblent évidemment moins bonnes, et Apple peut conserver son image de produit « haut de gamme ».
Dans le projet actuel, l’objectif était de créer un matériau à l’aspect soigné, cohérent entre navigateurs, et sans recourir à de la vraie 3D. Tu as aussi raison de dire que l’effet fonctionne mieux quand il se déplace sur un fond fixe. C’est ce que je fais sur le site de démo de la bibliothèque en cours, mais ce n’est pas encore prêt.
Je sais que le vrai verre se comporte ainsi, mais je n’ai pas envie d’y prêter attention. On dirait qu’on a pris les pires aspects du skeuomorphisme pour les pousser deux fois plus loin, et je dis ça tout en préférant l’ère d’avant iOS 7.
C’est un bel effet, mais pour moi, ça ne donne pas l’impression de vrai verre
La différence la plus immédiate, c’est que la lumière n’interagit pas avec le biseau. Je m’attendrais à ce que la lumière rentre à nouveau dans le verre et affecte aussi l’éclairage et les couleurs. Ajouter simplement du flou ne suffit pas
Le verre peut aussi avoir ses propres ombres et des motifs de concentration lumineuse intéressants. Ici, on voit bien une ombre, mais elle ressemble à une simple drop shadow, donc l’ensemble évoque davantage une carte plate qu’un objet physique 3D faisant partie de ce nouveau flux
Quoi qu’il en soit, ce n’est pas simple à imiter uniquement en CSS, et des shaders exécutés sur le GPU semblent mieux adaptés.
divclassique ? Si on ne peut pas appliquer d’effets GPU au HTML de base et qu’il faut les réserver à des éléments personnalisés comme un assemblage arbitraire de Canvas, alors autant recréer directement un tout nouveau moteur de rendu capable d’appliquer ces effets GPUPour moi, le HTML est mort. Pour transmettre du texte, quelques balises suffisent ; tout le reste sert surtout à transformer les pages web en bombardements publicitaires. Donc autant repartir de zéro avec une balise
<text>et une meilleure intégration GPU, et supprimer le reste.J’ai créé une version JavaScript qui réfracte réellement les éléments de la page : https://real-glass.vercel.app/
Je rassemble ce genre de choses : https://github.com/swyxio/spark-joy
Parmi d’autres ressources, il y a un générateur CSS gratuit basé sur les spécifications de design glassmorphism https://ui.glass/generator/, un en-tête fixe en verre dépoli https://www.joshwcomeau.com/css/backdrop-filter/, ainsi que glassy glassmorphism sur codepen et in context
C’est vraiment très bien fait. Je suis toujours surpris de voir que l’infographie ressemble moins à « une astuce bizarre » qu’à 5 astuces empilées
Obtenir en plus une compatibilité entre navigateurs, c’est une difficulté supplémentaire. Je me demande quelle partie consomme le plus de ressources. Instinctivement, je dirais
backdrop-filterTon intuition est la bonne : la partie la plus gourmande en ressources, c’est le flou de
backdrop-filter. Plus la valeur de flou est élevée, plus il faut « échantillonner » de pixels voisins avant le renduUn autre facteur coûteux, c’est qu’il faut redessiner en permanence quand on scrolle ou quand un fond vidéo modifie l’apparence du verre
On dirait que ça utilise des techniques proches de mon implémentation du verre : https://news.ycombinator.com/item?id=42225481
En particulier l’usage très poussé de
box-shadowme semble similairePetit problème : l’ombre entre le haut et la zone scrollable avec le toggle/le code disparaît quand on fait défiler vers le bas. J’ai l’impression qu’elle devrait être cachée au départ puis apparaître
Ces
box-shadowen « surplomb » ont été conçues pour être appliquées à l’intérieur d’un élément plutôt que comme une ombre portée vers le bas depuis un élément ; dans ce cas, j’ai réalisé qu’il fallait appliquer le second type d’ombreSur mon téléphone, le défilement du contenu est assez lent. Je me demande s’il y a un autre effet de scroll qui le ralentit volontairement, ou si c’est un effet secondaire de l’effet de verre
J’ai peut-être raté quelque chose, mais sur mobile ce serait bien plus utile si on pouvait masquer ou replier la boîte
En l’état, elle prend tout l’écran et on voit à peine les effets derrière. Ça m’intéresse quand même, donc je retenterai plus tard sur un écran plus grand, mais une option pour masquer la boîte améliorerait beaucoup l’expérience
Dans la première implémentation, j’avais placé un petit rectangle de démo au-dessus de l’interface du générateur, mais même petit il prenait trop de place et rendait l’UI difficile à utiliser. Si on faisait scroller toute la page, les gens trouvaient frustrant qu’il faille rester tout en haut pour voir le rectangle en cours d’édition
Cet outil est surtout pensé pour coder, donc je privilégie l’expérience desktop, et le mobile sert plutôt d’aperçu rapide et de preuve que ça fonctionne aussi sur mobile. Cela dit, si tu connais une UI similaire qui marche vraiment bien sur mobile, je veux bien voir le lien