Comment coder un site Web défilant «Alien Lander»

Dans ce didacticiel, le deuxième d'une série en deux parties, nous allons reproduire la géniale illustration vectorielle de «Comment créer un fond d'écran long pour un site Web» de Yulia Sokolova et la coder dans un site en direct.

Ce que nous allons construire

Nous allons mettre les choses en place afin que, lorsque vous faites défiler l'écran en haut de la page, vous voyiez un «Alien Lander» arriver à destination. Au début, nous verrons un OVNI planant dans l'espace.

En descendant, l'OVNI atteindra l'atmosphère et deviendra une "comète extraterrestre". 

Et puis finalement, quand il passera à travers la limite des arbres, il deviendra un "petit homme vert" qui se posera à terre..

Regardez la démo en direct!

Images SVG

Dans ce projet, nous utiliserons des images SVG afin de pouvoir tirer parti de leur capacité de redimensionnement fluide et de la taille réduite de leur fichier..

Avant de commencer à coder, vous aurez besoin de l'image créée dans la première partie de cette série de didacticiels, séparée en quatre fichiers SVG:

  1. L'OVNI sous la forme d'un fichier nommé «ufo.svg»
  2. La «comète étrangère» sous forme de fichier nommé «alien_comet.svg»
  3. Le "petit homme vert" sous forme de fichier nommé "alien_landing.svg"
  4. L'image d'arrière-plan avec les trois éléments ci-dessus supprimés, sous la forme d'un fichier nommé «background.svg»

Si vous le souhaitez, vous pouvez exporter vous-même ces images SVG à partir de votre application graphique préférée. Vous pouvez également trouver les quatre images prêtes à être utilisées dans les fichiers sources sur GitHub..

Configuration de la structure de base

Créez un nouveau dossier pour votre projet et créez un sous-dossier nommé "css" et un autre "images"..

Copiez et collez vos quatre images SVG dans le nouveau dossier «images»..

Dans le dossier «css», créez un fichier nommé «style.css»..

Dans le dossier principal, créez un nouveau fichier nommé "index.html"..

Votre structure de dossier devrait maintenant ressembler à ceci:

Dans le fichier «index.html», ajoutez le code HTML de base suivant pour obtenir l'essentiel et charger la feuille de style:

    Défilement d'Alien Lander     

Ajouter le fond

Cela peut sembler contre-intuitif, mais nous allons en fait ajouter notre image de fond en utilisant un img élément plutôt que comme une image de fond CSS. Nous faisons cela parce que:

  1. Nous voulons tirer parti de la capacité de SVG à redimensionner, en remplissant l'intégralité de la fenêtre d'affichage avec notre image «background.svg», quelles que soient les dimensions de la fenêtre du navigateur..
  2. Pour que la technique de défilement fonctionne, nous devons connaître la hauteur de l’image de fond..
  3. Parce que nous permettons à notre image d'arrière-plan d'être de taille fluide, nous n'avons aucun moyen de savoir quelle sera sa hauteur à l'avance..
  4. Comme nous ne pouvons pas connaître la hauteur de l’arrière-plan à l’avance, nous devrons la détecter après le chargement de l’image..
  5. Si nous définissons «background.svg» comme image d’arrière-plan CSS, sa hauteur n’affectera pas la présentation du site, ce qui rend sa hauteur difficile à détecter..
  6. En insérant “background.svg” comme une image normale à la place de sa hauteur volonté effectuer la mise en page du site, ce qui rend sa hauteur relativement facile à détecter à l'aide de jQuery.

Maintenant que vous comprenez pourquoi nous adoptons cette approche, commençons à coder!

Dans votre fichier «index.html», ajoutez ce code:

Si vous prévisualisez votre fichier dans un navigateur, vous devriez voir l'image remplir la fenêtre. Cependant, il y aura toujours un espace blanc sur les bords. 

En effet, les navigateurs incluent une petite marge sur le corps élément par défaut. Pour remplacer ceci, dans le fichier “style.css” ajoutez ce CSS:

corps marge: 0; 

Il y a aussi un autre navigateur par défaut que nous devrons remplacer, celui du afficher propriété sur les images étant définie sur en ligne. Si vous faites défiler l'écran jusqu'en bas de votre page, vous remarquerez qu'il existe actuellement un petit espace blanc sous l'image en raison de ce paramètre par défaut. Changez-le en ajoutant:

img display: block; 

Vous devriez maintenant voir l'image «background.svg» remplir la fenêtre au ras des bords, et si vous redimensionnez la largeur de la fenêtre, l'image SVG sera redimensionnée pour s'adapter à la nouvelle taille. La hauteur de la présentation du site changera également pour conserver le rapport de format correct pour l'image «background.svg»..

Ajouter un conteneur de premier plan

Pour que l’image que nous venons de placer se comporte comme une image d’arrière-plan, nous devons trouver un moyen de placer le reste de notre contenu au premier plan. Nous pouvons y arriver en ajoutant un div élément qui agira en tant que conteneur, puis en modifiant sa position et z-index Propriétés.

Dans votre fichier “index.html”, après l'image que vous venez d'ajouter, insérez cette nouvelle div:

 

Et dans “style.css”, ajoutez ce CSS:

.au premier plan position: absolue; en haut: 0; gauche: 0; hauteur: 100%; largeur: 100%; z-index: 1; 

Passons en revue ce que nous faisons avec le code ci-dessus.

Tout d'abord, en mettant position à absolu nous retirons l'élément du flux de documents normal (qui le placerait sinon sous l'image de fond), ce qui nous permet de le placer où bon nous semble.

Ensuite, nous définissons le Haut et la gauche propriétés à 0 qui déplace l'élément vers le haut de la fenêtre et l'aligne horizontalement avec notre image d'arrière-plan.

Après cela, nous donnons à l'élément un la taille et largeur de 100%. Cela permet de s’assurer que l’élément n’est pas réduit à néant, en masquant le contenu..

Enfin, nous définissons la z-index à 1 ce qui amène l’élément vers l’avant, de sorte qu’il se place devant notre image d’arrière-plan (qui est par défaut). z-index de auto). Cela évite que le contenu de l'élément ne soit masqué par l'image d'arrière-plan..

Notre conteneur de premier plan est maintenant prêt à recevoir du contenu..

Ajouter le panneau UFO

La façon dont nous allons faire atterrir notre OVNI sur le sol au fond est de créer trois panneaux, un pour chaque étape. Nous ajouterons ensuite l'image SVG correspondante pour chaque panneau, telle que le fichier «ufo.svg» par exemple, en tant qu'image d'arrière-plan à position fixe. L'image restera alors en place pendant le défilement pendant que l'arrière-plan se déplace derrière elle, créant ainsi l'illusion d'une descente.

Dans votre "premier plan" div, ajouter cette nouvelle div:

Maintenant, ajoutez le code suivant à votre CSS:

.ufo_section height: 100%; fond: url (… /images/ufo.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 40% auto; attachement de fond: fixe; 

Dans la première ligne de notre code ci-dessus, nous donnons à l'élément un la taille de 100% pour vous assurer que son contenu sera visible. Ensuite, nous ajoutons notre image «ufo.svg» comme arrière-plan. Nous mettons Répétition du fond à non répété comme nous voulons seulement qu'un OVNI apparaisse, et nous faisons alors position de fond place l'image au centre horizontalement et verticalement.

Avec notre taille de fond propriété, nous définissons la largeur sous forme de pourcentage et nous permettons à la hauteur d'être calculée automatiquement. Cette largeur est tirée de l'image vectorielle d'origine dans laquelle la largeur de l'OVNI est d'environ 40% de la largeur de l'illustration globale..

En définissant la largeur de notre image «ufo.svg» sous forme de pourcentage, lorsque la fenêtre est redimensionnée et que l'image «background.svg» change avec elle, l'image UFO ajustera également sa largeur pour conserver les proportions souhaitées..

Sur la dernière ligne nous avons mis pièce jointe à fixé, ce qui signifie que l'image restera fixe à mesure que nous faisons défiler, nous donnant notre illusion de descente.

Essayez d'actualiser votre page et de faire défiler maintenant, vous devriez voir l'OVNI bouger verticalement parmi les planètes..

Ajouter la comète et les panneaux d'atterrissage

Lorsque vous faites défiler votre site, une fois que vous descendez suffisamment, vous remarquerez que l'OVNI disparaît. Cela se produit parce que nous faisons défiler au-delà de la hauteur de la ufo_section panneau donc à ce stade, nous ne pouvons plus voir son fond. 

Nous allons empiler trois panneaux comme celui-ci les uns sur les autres, de sorte que lorsque nous passons devant un et que son arrière-plan disparaisse, l'arrière-plan du panneau suivant apparaît, créant l'effet d'une image remplacée par la suivante.

Nous allons donc maintenant répéter le processus que nous avons utilisé ci-dessus pour insérer les images «alien_comet.svg» et «alien_landing.svg»..

À votre code HTML, ajoutez ce qui suit juste après votre ufo_section div et toujours dans votre div de premier plan:

Ajoutez ensuite à votre CSS ces nouvelles classes:

.comet_section height: 100%; fond: url (… /images/alien_comet.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 15% auto; attachement de fond: fixe;  .landing_section height: 100%; fond: url (… /images/alien_landing.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 15% auto; attachement de fond: fixe; position: relative; 

Nous utilisons tous le même code et les mêmes techniques ici, avec seulement les noms de fichier image modifiés et la largeur sur le taille de fond propriété définie sur 15% en fonction des images plus étroites que nous venons d'ajouter.

Votre CSS complété

Votre fichier “style.css” est maintenant terminé et devrait contenir le code suivant:

corps marge: 0;  img display: block;  .foreground position: absolute; en haut: 0; gauche: 0; hauteur: 100%; largeur: 100%; z-index: 1;  .ufo_section height: 100%; fond: url (… /images/ufo.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 40% auto; attachement de fond: fixe;  .comet_section height: 100%; fond: url (… /images/alien_comet.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 15% auto; attachement de fond: fixe;  .landing_section height: 100%; fond: url (… /images/alien_landing.svg); répétition de fond: non répétée; position de fond: centre; taille du fond: 15% auto; attachement de fond: fixe; position: relative; 

Retournez sur votre site maintenant, faites défiler l'écran vers le bas et vous devriez voir l'OVNI se transformer en comète, puis un peu plus bas dans le «petit homme vert».

Ajouter des calculs de hauteur de panneau

En ce moment, vous remarquerez que nous avons quelques problèmes à résoudre lors du défilement, qui sont:

  1. Les trois panneaux ne sont pas assez hauts. Cela donne l'impression que l'atterrisseur extraterrestre passe trop tôt d'une forme à l'autre, de sorte qu'il ne parvient jamais à atterrir.
  2. Vous pouvez voir que l'image «alien_comet.svg» commence à apparaître avant que l'image «ufo.svg» ait complètement disparu, ce qui semble étrange..

Comme notre image «background.svg» n’a pas une taille fixe, nous ne saurons pas quelle est la hauteur exacte en pixels de chaque panneau avant le chargement. Cependant, ce que nous pouvons décider dès le départ est la hauteur que chaque panneau doit représenter en tant que pourcentage de la hauteur de «background.svg»..

En utilisant jQuery, nous pouvons implémenter ce processus:

  1. Définit la hauteur souhaitée pour chaque panneau en pourcentage (ou fraction) de la hauteur de l'image «background.svg»..
  2. Détecte la hauteur de “background.svg” après son chargement.
  3. Calculer et régler les hauteurs des panneaux en fonction des deux informations ci-dessus..

Pendant que nous y sommes, nous ajouterons également quelques divs vides supplémentaires pour servir d’espaceurs entre chaque panneau et définir leur hauteur à l’aide de jQuery. L'ajout d'espace entre les panneaux permettra une transition plus douce, résolvant le problème de l'affichage de l'image «alien_comet.svg» avant que l'image «ufo.svg» ne disparaisse.

Mettez à jour votre code HTML afin qu'il y ait un div spacer entre chaque div existante, comme ceci:

Et dans la section head, chargez jQuery en ajoutant ce qui suit:

Configurer la fonction JavaScript

Avant la fermeture tag, créer une paire de balises et configurer une nouvelle fonction à l'intérieur comme ceci:

Nous voulons que cette fonction soit activée lors du premier chargement de la page, et chaque fois qu'elle est redimensionnée. Pour ce faire, ajoutez également le code suivant après votre ouverture. scénario étiquette:

$ (document) .ready (function () set_section_heights ();); $ (fenêtre) .resize (function () set_section_heights (););

Obtenez la hauteur de l'image de fond

À l'intérieur de set_section_heights () Pour ce faire, la première chose à faire est de déterminer la hauteur actuelle de l’image d’arrière-plan et de l’enregistrer en tant que variable. Pour ce faire, ajoutez ce code:

var_doc_height = $ (". background"). height ();

Avec la première partie du code, $ (". background"), jQuery trouve l'élément avec le nom de la classe Contexte. Le annexe .la taille() fonction obtient alors la hauteur en pixels de cet élément sous forme d'entier. Cela nous indique la hauteur de notre image «background.svg» et enregistre ce nombre dans la variable. doc_height.

Définir les hauteurs de coupe prévues

Nous allons maintenant configurer un objet dans lequel nous pouvons définir:

  1. Le nom de classe de chaque élément pour lequel nous voulons définir une hauteur.
  2. Quelle hauteur doit avoir cet élément en fraction de la hauteur du fond. 

Nous allons parcourir cet objet et utiliser les valeurs qu'il contient pour redimensionner les sections de notre premier plan.

Commençons par une seule entrée dans l'objet:

var section_heights = "ufo_section": 0.25

Ici, nous avons défini l’index (la valeur à gauche) sur ufo_section pour correspondre au nom de classe de notre première section.

Ensuite, nous avons défini la valeur sur 0,25 ce qui est une autre façon d’exprimer 25%. Dans un instant, nous allons multiplier cette valeur par le nombre stocké dans le doc_height variable, c’est-à-dire la hauteur de l’image d’arrière-plan. En faisant cela, nous dirons que nous voulons la ufo_section panel à 25% de la hauteur actuelle de «background.svg».

Par exemple, si la hauteur de «background.svg» était 1000px la hauteur de la section ufo_servait sortir comme 250px:

 1000 * 0,25 = 250

Maintenant que nous avons examiné le fonctionnement de cet objet, ajoutons quelques entrées pour les autres éléments sur lesquels nous voulons définir des hauteurs. Mettez à jour votre objet comme suit:

var section_heights = "ufo_section": 0.25, "spacer_one": 0.03, "comet_section": 0.36, "spacer_two": 0.06, "landing_section": 0.298

Remarque: J'ai sélectionné ces valeurs sur la base d'essais et d'erreurs, alors n'hésitez pas à jouer avec les chiffres après avoir terminé ce tutoriel pour voir les effets.

Itérer le section_heights Objet

Avec notre objet terminé, nous sommes prêts à commencer à itérer et à redimensionner nos panneaux..

D'abord nous aurons besoin d'un $ .each () fonction pour itérer le section_heights object et extrait l'index et la valeur (représentant respectivement le nom de la classe et la hauteur) de chaque entrée qu'il contient.

Ajoutez ce code après votre section_heights objet:

$ .each (section_heights, fonction (index, valeur) console.log ("Index:" + index, "| Valeur:" + valeur););

Pour vous permettre de voir comment la fonction d’itération ci-dessus génère le indice et valeur les variables, nous utilisons console.log () écrire un petit message sur la console pour chaque entrée du section_heights objet.

Rechargez votre site, ouvrez Chrome Web Developer Tools (ou son équivalent dans votre navigateur préféré) et consultez la console. Vous devriez voir ceci:

À gauche de chaque message après Indice: tu peux voir le indice pour chaque entrée, c'est-à-dire les noms de classe des éléments à redimensionner.

A droite de chaque message après Valeur: tu peux voir le valeur pour chaque entrée, c’est-à-dire la fraction de la hauteur totale de chaque panneau doit être.

Calculer et régler les hauteurs de section

Maintenant, au lieu de simplement enregistrer ces données sur la console, utilisons-les pour définir la taille de nos sections de premier plan. Supprimer le console.log () ligne et le remplacer par ceci:

$ ("." + index) .height (Math.floor (value * doc_height));

Décomposons ce que cette ligne fait.

D'abord nous avons $ ("." + index). Nous l'utilisons pour trouver l'élément que nous voulons redimensionner. Par exemple, avec la première entrée de notre objet, le indice est défini sur ufo_section. Dans ce cas, la première partie de notre code sera évaluée pour devenir $. (".ufo_section"). Avec ce code, jQuery est invité à rechercher l'élément avec la classe dans la page. ufo_section.

Ensuite nous ajoutons .la taille(… ). Avec ce code, jQuery définira la hauteur de l'élément trouvé, en le changeant pour la valeur transmise entre les crochets..

Entre les parenthèses, vous verrez valeur * doc_height. C'est ici que nous effectuons la multiplication mentionnée précédemment pour calculer la hauteur de panneau souhaitée. Par exemple, la première entrée de notre objet a la valeur 0,25. Ce nombre sera multiplié par le nombre enregistré dans le répertoire. doc_height variable.

Autour de la multiplication de ces deux variables, vous verrez Math.floor (). Ceci arrondit le résultat de notre multiplication au nombre entier le plus proche. 

Donc, mettre tout cela ensemble, si la valeur de doc_height est 5197, la première entrée dans notre objet multiplierait par 0,25 nous donnant un résultat de 1299.25

Math.floor () arrondira ce montant à 1299. Cela signifie que notre code serait maintenant évalué pour devenir: $. (".ufo_section") .height (1299);

Avec cette ligne, jQuery trouvera l'élément avec la classe ufo_section et mettre sa hauteur à 1299px.

Votre HTML et JavaScript terminés

Cela encapsule votre HTML et JavaScript. Votre fichier “index.html” complété doit maintenant contenir le code suivant:

    Défilement d'Alien Lander      

Rechargez votre site maintenant pour voir le code en action, et lorsque vous inspectez votre code HTML, vous devriez voir les tailles nouvellement calculées apparaître en ligne:

Redimensionnez la fenêtre de votre navigateur et vous devriez voir ces valeurs recalculer et mettre à jour, par exemple:

Et tu as fini!

Regardez le résultat final! Maintenant, lorsque vous commencez tout en haut de la page et commencez à faire défiler, vous verrez l'OVNI commencer à descendre. Quand il atteint l'atmosphère, il disparaît un peu et une «comète extraterrestre» prend sa place et continue la descente. Au sommet des arbres, il disparaît une fois de plus et un «petit homme vert» achève le parcours jusqu'au sol..

Comme je l’ai dit plus tôt, c’est une excellente idée de jouer avec les valeurs énoncées dans le section_heights objet de sorte que vous pouvez voir comment ils affectent le flux de l'atterrisseur à travers ses différentes étapes.

J'espère que vous avez apprécié ce tutoriel et que vous avez de nouvelles idées pour des choses sympas que vous pouvez faire avec des images SVG et des arrière-plans fixes.

Merci encore à Yulia pour l'illustration vectorielle originale, merci à vous pour la lecture, et à bientôt!