Dans un projet dans lequel j'ai été récemment impliqué, on m'a demandé de recréer la fonctionnalité d'expansion de la recherche d'images de Google, similaire à la capture d'écran ci-dessous, mais dans un format de grille rigide.
Ma réaction immédiate a été que je devrais utiliser JavaScript pour définir certaines propriétés de mise en page et de modèle de boîte que je suis toujours réticent à faire et ne fera jamais qu'en dernier recours. Comme il y avait un exemple déjà parfaitement fonctionnel, j'ai décidé d'ouvrir des outils de développeur pour voir comment Google le fait (pourquoi réinventer la roue, non?)
Il s'avère que Google décompose la structure en deux divs, un div contient toutes les cellules d'image et l'autre div est pour la zone en expansion. Une fois qu'une image est cliquée (et élargie), JavaScript insère un div d'espaceur après la dernière cellule d'image de la ligne du div cliqué. JavaScript définit sa hauteur à la même chose que la div étendue et positionne la div étendue absolument dans la position que la div d'espaceur occupe. C'est intelligent, mais pas idéal en raison de sa forte dépendance à l'égard de JavaScript.
J'avais une idée de base que j'ai réussi à devenir une démo de travail en utilisant CSS pour toutes les propriétés de mise en page et de modèle de boîte. Le seul JavaScript nécessaire est de modifier les noms de classe en fonction de la bascule d'extension.
Tout d'abord, nous devons construire le conteneur .image-grid avec chaque .image__cell. Voici le HTML:
<span><span><span><section</span> class<span>="image-grid"</span>></span> </span> <span><span><span><div</span> class<span>="image__cell is-collapsed"</span>></span> </span> <span><span><span><div</span> class<span>="image--basic"</span>></span> </span> <span><span><span><a</span> href<span>="#expand-jump-1"</span>></span> </span> <span><span><span><img</span> id<span>="expand-jump-1"</span> </span></span><span> <span>class<span>="basic__img"</span> </span></span><span> <span>src<span>="https://lorempixel.com/250/250/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></a</span>></span> </span> <span><span><span><div</span> class<span>="arrow--up"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="image--expand"</span>></span> </span> <span><span><span><a</span> href<span>="#close-jump-1"</span> class<span>="expand__close"</span>></span><span><span></a</span>></span> </span> <span><span><span><img</span> class<span>="image--large"</span> </span></span><span> <span>src<span>="https://lorempixel.com/400/400/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> ... <span><span><span></section</span>></span></span>
Le balisage ci-dessus contient un exemple de l'élément de cellule d'image qui devra être dupliqué pour chaque image de la grille. Veuillez noter les identifiants pour # close-jump-1 et # expand-jump-1, et les attributs HREF suivants devront être uniques à .image__cell. Les liens de hachage tels que: href = "# expand-jump-1" permettent au navigateur de passer à la cellule d'image active lorsqu'il est enfoncé.
Nous appliquons d'abord la taille de la boîte: Border-Box; à tous les éléments, y compris: avant et: après des pseudo-éléments utilisant le sélecteur universel. Cela permettra une manipulation facile des éléments qui mélangent les largeurs de pourcentage avec des valeurs de rembourrage fixes, car elle les combine.
<span>/* apply a natural box layout model to all elements, </span><span> but allowing components to change */ </span> <span>html { </span> <span>box-sizing: border-box; </span><span>} </span> <span>*<span>, *:before, *:after</span> { </span> <span>box-sizing: inherit; </span><span>}</span>
L'élément .Image-Grid reçoit un débordement ClearFix: Hidden; Pour maintenir la disposition basée sur les flotteurs de cellules d'image.
<span><span>.image-grid</span> { </span> <span>width: 100%; </span> <span>max-width: 1310px; </span> <span>margin: 0 auto; </span> <span>overflow: hidden; </span> <span>padding: 10px 5px 0; </span><span>} </span> <span><span>.image__cell</span> { </span> <span>float: left; </span> <span>position: relative; </span> <span>width: 20%; </span><span>} </span> <span><span>.image--basic</span> { </span> <span>padding: 0 5px; </span><span>} </span> <span><span>.basic__img</span> { </span> <span>display: block; </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>margin: 0 auto; </span><span>} </span> <span><span>.image__cell.is-collapsed .arrow--up</span> { </span> <span>display: block; </span> <span>height: 10px; </span> <span>width: 100%; </span><span>} </span> <span><span>.image--large</span> { </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>display: block; </span> <span>padding: 40px; </span> <span>margin: 0 auto; </span> <span>box-sizing: border-box; </span><span>}</span>
La largeur donnée à la cellule d'image équivaut à 100 divisée par le nombre d'éléments par ligne, exprimée en pourcentage. Dans cet exemple, il y a 5 éléments par ligne, ce qui signifie que chaque .image__cell a 20% de large.
Notez que le rembourrage: 10px 5px 0; appliqué à .image-grid combiné avec le rembourrage: 0 5px; sur .image - basic et hauteur: 10px; sur .image__cell.is-collapsed .arrow-up Abandonnez l'effet de cadre de fenêtre égal autour des images carrelées. Nous pourrions augmenter l'écart entre les images, en modifiant ces valeurs.
Enfin, l'élément d'image .basic__img est donné Affichage: Block; pour éviter tout problème d'espacement. Theax-Width: 100%; et hauteur: auto; Les déclarations permettent à l'image de s'étendre à la largeur de son conteneur tout en ne dépassant pas sa propre largeur.
Le CSS ci-dessous fournit la disposition de la zone extensible.
<span><span>.image__cell.is-collapsed .image--basic</span> { </span> <span>cursor: pointer; </span><span>} </span> <span><span>.image__cell.is-expanded .image--expand</span> { </span> <span>max-height: 500px; </span> <span>margin-bottom: 10px; </span><span>} </span> <span><span>.image--expand</span> { </span> <span>position: relative; </span> <span>left: -5px; </span> <span>padding: 0 5px; </span> <span>box-sizing: content-box; </span> <span>overflow: hidden; </span> <span>background: #222; </span> <span>max-height: 0; </span> <span>transition: max-height .3s ease-in-out, </span> margin-bottom <span>.1s .2s; </span> <span>width: 500%; </span><span>}</span>
Voici quelques notes à retirer du code ci-dessus:
Visuellement, nous voulons que la zone en expansion s'aligne sur le .Image-Grid. Pour ce faire, nous devons annuler le rembourrage horizontal ensemble dans l'élément .image-grid.
C'est là que le Ndth of-Type se trouve:
Au départ, j'ai utilisé le Neh-Child pour réaliser le même effet, mais sur d'autres projets, j'ai trouvé que iOS8 Safari était assez buggy avec cela, donc j'essaie d'éviter de l'utiliser. Au lieu de cela, j'utilise le Nième de type car il sert en grande partie le même objectif. Si vous êtes intéressé, vous pouvez trouver une brève explication de la n ° de type ici <.><span><span><span><section</span> class<span>="image-grid"</span>></span> </span> <span><span><span><div</span> class<span>="image__cell is-collapsed"</span>></span> </span> <span><span><span><div</span> class<span>="image--basic"</span>></span> </span> <span><span><span><a</span> href<span>="#expand-jump-1"</span>></span> </span> <span><span><span><img</span> id<span>="expand-jump-1"</span> </span></span><span> <span>class<span>="basic__img"</span> </span></span><span> <span>src<span>="https://lorempixel.com/250/250/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></a</span>></span> </span> <span><span><span><div</span> class<span>="arrow--up"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="image--expand"</span>></span> </span> <span><span><span><a</span> href<span>="#close-jump-1"</span> class<span>="expand__close"</span>></span><span><span></a</span>></span> </span> <span><span><span><img</span> class<span>="image--large"</span> </span></span><span> <span>src<span>="https://lorempixel.com/400/400/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> ... <span><span><span></section</span>></span></span>
Dans le CSS ci-dessus, nous ciblons les zones extensibles les deuxième, troisième et quatrième .Image__cell sur chaque ligne. La valeur de marge-gauche dépend également de la position de l'élément dans la ligne. Notez que le premier élément de chaque ligne n'a pas besoin d'une valeur de marge-gauche définie car elle est déjà dans la position souhaitée. Plus l'élément est loin de la gauche, plus nous devons repousser la zone extensible vers le côté gauche (par incréments de -100%). Sans cela, la zone extensible serait alignée sur son parent, comme indiqué ci-dessous:
Nous devons également insérer le CSS illustré ci-dessous pour nous assurer que la première .Image__cell sur chaque ligne, à part la première rangée, colle à sa position lorsque les éléments. Image__cell plus tôt sont élargis.
Maintenant que la disposition de base est en place, nous pouvons ajouter quelques styles pour améliorer l'expérience utilisateur.
<span>/* apply a natural box layout model to all elements, </span><span> but allowing components to change */ </span> <span>html { </span> <span>box-sizing: border-box; </span><span>} </span> <span>*<span>, *:before, *:after</span> { </span> <span>box-sizing: inherit; </span><span>}</span>
Tout d'abord, une flèche pointant pour indiquer l'image à laquelle appartient le bloc expansé:
Notez que le style de flèche est réalisé en créant un triangle CSS, en économisant ainsi une demande HTTP. Cet effet est facilement réalisé par une utilisation intelligente des frontières et la définition de la hauteur et de la largeur sur 0.
<span><span>.image-grid</span> { </span> <span>width: 100%; </span> <span>max-width: 1310px; </span> <span>margin: 0 auto; </span> <span>overflow: hidden; </span> <span>padding: 10px 5px 0; </span><span>} </span> <span><span>.image__cell</span> { </span> <span>float: left; </span> <span>position: relative; </span> <span>width: 20%; </span><span>} </span> <span><span>.image--basic</span> { </span> <span>padding: 0 5px; </span><span>} </span> <span><span>.basic__img</span> { </span> <span>display: block; </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>margin: 0 auto; </span><span>} </span> <span><span>.image__cell.is-collapsed .arrow--up</span> { </span> <span>display: block; </span> <span>height: 10px; </span> <span>width: 100%; </span><span>} </span> <span><span>.image--large</span> { </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>display: block; </span> <span>padding: 40px; </span> <span>margin: 0 auto; </span> <span>box-sizing: border-box; </span><span>}</span>
Nous voulons également que la flèche n'apparaît que lorsque l'élément .image__cell est élargi. Ceci est fait par l'ajout de la classe .is-expansée. Enfin, nous voulons que la flèche reste dans le centre horizontal de l'élément .image__cell donc marge: 0 auto; est appliqué.
Maintenant, nous sommes prêts à coiffer le bouton «Fermer» qui permettra à l'utilisateur de fermer la zone élargie.
<span><span><span><section</span> class<span>="image-grid"</span>></span> </span> <span><span><span><div</span> class<span>="image__cell is-collapsed"</span>></span> </span> <span><span><span><div</span> class<span>="image--basic"</span>></span> </span> <span><span><span><a</span> href<span>="#expand-jump-1"</span>></span> </span> <span><span><span><img</span> id<span>="expand-jump-1"</span> </span></span><span> <span>class<span>="basic__img"</span> </span></span><span> <span>src<span>="https://lorempixel.com/250/250/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></a</span>></span> </span> <span><span><span><div</span> class<span>="arrow--up"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="image--expand"</span>></span> </span> <span><span><span><a</span> href<span>="#close-jump-1"</span> class<span>="expand__close"</span>></span><span><span></a</span>></span> </span> <span><span><span><img</span> class<span>="image--large"</span> </span></span><span> <span>src<span>="https://lorempixel.com/400/400/fashion/1"</span> alt<span>="Fashion 1"</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> ... <span><span><span></section</span>></span></span>
Notez qu'en utilisant A: Avant le pseudo-élément, nous pouvons insérer un caractère «×» sur la page sans qu'il apparaisse dans le DOM, enregistrant à nouveau au moins une demande HTTP. Le caractère spécial inséré est le caractère de multiplication que Boostrap utilise également.
Enfin, la jQuery ci-dessous bascule simplement entre la classe .is-expansée et .is-collated en cliquant sur chaque cellule d'image et le bouton Fermer.
<span>/* apply a natural box layout model to all elements, </span><span> but allowing components to change */ </span> <span>html { </span> <span>box-sizing: border-box; </span><span>} </span> <span>*<span>, *:before, *:after</span> { </span> <span>box-sizing: inherit; </span><span>}</span>
Avoir 5 cellules d'image sur chaque ligne sur des appareils plus petits n'est pas idéal, nous pouvons donc modifier le nombre d'éléments par ligne à l'aide de requêtes multimédias. Par exemple, le CSS ci-dessous le réduit à 2 images par ligne.
<span><span>.image-grid</span> { </span> <span>width: 100%; </span> <span>max-width: 1310px; </span> <span>margin: 0 auto; </span> <span>overflow: hidden; </span> <span>padding: 10px 5px 0; </span><span>} </span> <span><span>.image__cell</span> { </span> <span>float: left; </span> <span>position: relative; </span> <span>width: 20%; </span><span>} </span> <span><span>.image--basic</span> { </span> <span>padding: 0 5px; </span><span>} </span> <span><span>.basic__img</span> { </span> <span>display: block; </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>margin: 0 auto; </span><span>} </span> <span><span>.image__cell.is-collapsed .arrow--up</span> { </span> <span>display: block; </span> <span>height: 10px; </span> <span>width: 100%; </span><span>} </span> <span><span>.image--large</span> { </span> <span>max-width: 100%; </span> <span>height: auto; </span> <span>display: block; </span> <span>padding: 40px; </span> <span>margin: 0 auto; </span> <span>box-sizing: border-box; </span><span>}</span>
Pour empêcher le CSS appliqué plus tôt concernant 5 éléments par ligne, nous devrons réinitialiser ces valeurs ou extraire les propriétés et les placer dans leur propre requête multimédia, qui se fait dans le code ci-dessous, ainsi que le code précédent.
Voir la recherche sur les images Google dans CSS par SitePoint (@SitePoint) sur Codepen.
Notez l'inclusion de la fonction de cellules qui crache 50 cellules d'image pour me sauver la dérange.
Je ne voulais pas exclure les lecteurs qui n'utilisent pas Sass lors de la rédaction de cet article, mais je ne voulais pas non plus les écarter. Ce projet se prête comme un excellent cas d'utilisation pour Sass en développement, car le nombre d'articles par ligne est lié à de nombreuses propriétés différentes.
Veuillez consulter la démonstration de code de code suivante suivante. Notez que dans cette démo, j'utilise des variables SASS en haut du CSS, ce qui me permet de spécifier l'écart entre les images, la largeur d'image maximale et les images minimales et maximales par ligne. En utilisant divers calculs, le SASS se compilera en CSS en fonction des options fournies. Il calculera automatiquement les requêtes multimédias optimales en fonction du nombre maximum d'éléments par ligne, qui maintiendra les images dans leurs dimensions maximales.
Cette version SASS est expérimentale, mais veuillez me faire savoir si vous remarquez des bogues ou des améliorations de code potentielles dans la version ordinaire ou la version SASS.
Recréer la disposition de la recherche de Google Images à l'aide de CSS implique quelques étapes. Tout d'abord, vous devez créer une structure HTML de base pour vos images. Cela inclut la création d'un div pour chaque image et l'attribuer une classe. Ensuite, vous devez coiffer ces divs en utilisant CSS pour imiter la disposition des images Google. Cela implique de définir la largeur et la hauteur des Divs, ainsi que leur position sur la page. Vous pouvez également ajouter des effets de survol aux images à l'aide de CSS. Enfin, vous pouvez utiliser JavaScript pour ajouter des fonctionnalités aux images, telles que l'ouverture d'une version plus grande de l'image lorsqu'elle est cliquée.
Les propriétés CSS clés utilisées pour recréer la disposition des images Google incluent l'affichage, la grille-template-colonnes, la grille et l'adaptation d'objet. La propriété d'affichage est définie sur Grid pour créer une disposition de grille. La propriété des colonnes de la grille est utilisée pour spécifier le nombre et la taille des colonnes dans la grille. La propriété Grid-Gap est utilisée pour définir l'écart entre les cellules de la grille. La propriété d'objet-ats est utilisée pour spécifier comment une image doit être redimensionnée pour s'adapter à son conteneur.
Oui, vous pouvez personnaliser la mise en page pour répondre à vos propres besoins. Vous pouvez modifier le nombre et la taille des colonnes dans la grille, l'écart entre les cellules de la grille et la taille des images. Vous pouvez également ajouter des propriétés CSS supplémentaires pour personnaliser davantage la disposition, telles que l'ajout de bordures ou d'ombres aux images.
Vous pouvez ajouter des fonctionnalités à la fonctionnalité Images utilisant JavaScript. Par exemple, vous pouvez ajouter un écouteur d'événements aux images qui ouvrent une version plus grande de l'image lorsqu'elle est cliquée. Vous pouvez également ajouter des fonctionnalités telles que le filtrage ou le tri des images.
Si votre mise en page ne ressemble pas à la disposition des images Google, il pourrait y avoir être plusieurs raisons. Tout d'abord, assurez-vous que vous avez correctement implémenté les propriétés CSS. Deuxièmement, vérifiez si vos images sont du même rapport d'aspect. Google Images utilise des images du même rapport d'aspect pour créer une disposition uniforme. Si vos images sont des rapports d'aspect différents, la mise en page peut ne pas se ressembler.
Vous pouvez rendre votre disposition réactive en utilisant des requêtes multimédias dans votre CSS . Les requêtes multimédias vous permettent d'appliquer différents styles en fonction de la taille de l'écran de l'utilisateur. Par exemple, vous pouvez modifier le nombre de colonnes dans la grille sur des écrans plus petits pour vous assurer que les images sont toujours affichées correctement.
Oui, vous pouvez utiliser cette mise en page pour d'autres types de contenu, pas seulement des images. Vous pouvez l'utiliser pour afficher du texte, des vidéos ou tout autre type de contenu. Assurez-vous simplement d'ajuster les propriétés CSS en conséquence pour ajuster le type de contenu que vous affichez.
Vous pouvez ajouter des effets de survol aux images en utilisant Le: planer pseudo-classe dans votre CSS. Par exemple, vous pouvez modifier la couleur de la bordure de l'image lorsque l'utilisateur le plane dessus, ou vous pouvez afficher des informations supplémentaires sur l'image.
Si vos images ne s'adaptent pas correctement aux cellules de la grille, cela pourrait être dû au rapport d'aspect des images n'est pas la même que le rapport d'aspect des cellules de la grille. Vous pouvez résoudre ce problème en utilisant la propriété d'objet-ajustement dans votre CSS pour spécifier comment les images doivent être redimensionnées pour s'adapter à leur conteneur.
Oui, vous pouvez utiliser cette mise en page avec un CMS comme WordPress. Vous devez ajouter le CSS au fichier style.css de votre thème et le HTML au fichier de modèle approprié. Vous devrez peut-être également ajouter du code PHP pour générer dynamiquement le HTML pour les images, en fonction de la configuration de votre site WordPress.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!