recherche
Maisoninterface Webtutoriel CSSUne toile de fond étoilée interactive pour le contenu

Une toile de fond étoilée interactive pour le contenu

L'année dernière, j'ai eu l'occasion de collaborer avec Shawn Wang (Swyx) sur un projet de temporal. L'objectif était d'améliorer leur site Web avec des éléments créatifs. C'était un défi fascinant, car je suis plus un développeur qu'un concepteur, mais j'ai saisi la chance d'élargir mes compétences en conception.

Une de mes contributions a été une toile de fond étoilée interactive. Vous pouvez le voir en action ici:

Concept de Blockquote utilisant la perspective et les propriétés personnalisées CSS. Profiter de la liberté de création à @temporalio. Ajouter une touche de fantaisie! ⚒️ @reactjs && @tailwindcss (le site est NextJS)? Lien vers Codepen via @codepen pic.twitter.com/s9xp2trrox

- Jhey ?? ✨ (@ jh3yy) 2 juillet 2021

La force de cette conception réside dans son implémentation en tant que composant réutilisable REACT, offrant une configurabilité élevée. Besoin de formes différentes au lieu des étoiles? Vous voulez contrôler précisément le placement des particules? Vous êtes en contrôle total.

Construisons ce composant! Nous utiliserons React, Greensock et le HTML<canvas></canvas> élément. React est facultatif, mais l'utiliser crée un composant réutilisable pour les projets futurs.

Construire l'application de base

 Importer React à partir de 'https://cdn.skypack.dev/react';
Importez Reactdom depuis 'https://cdn.skypack.dev/rect-dom';
Importer GSAP à partir de 'https://cdn.skypack.dev/gsap';

const root_node = document.QuerySelector ('# app');

const starscape = () =><h1 id="Cool-Thingzzz"> Cool Thingzzz!</h1> ;

const app = () =><starscape></starscape> ;

Reactdom.render (<app></app> , Root_node);

Tout d'abord, nous rendons un<canvas></canvas> élément et saisissez une référence à utiliser dans le crochet useEffect de React. Si vous n'utilisez pas React, stockez la référence directement dans une variable.

 const starscape = () => {
  const canvasref = react.UseRef (null);
  retour<canvas ref="{canvasRef}"></canvas> ;
};

Nous allons styliser le<canvas></canvas> Pour remplir la fenêtre et asseoir derrière le contenu:

 toile {
  Position: fixe;
  Encart: 0;
  Contexte: # 262626;
  Z-Index: -1;
  Hauteur: 100VH;
  Largeur: 100 VW;
}

Ajout d'étoiles

Nous simplifierons le rendu d'étoile en utilisant des cercles avec des opacités et des tailles variables. Dessinant un cercle sur un<canvas></canvas> implique d'obtenir le contexte et d'utiliser la fonction arc . Rendons un cercle (notre étoile) au centre à l'aide d'un crochet useEffect :

 const starscape = () => {
  const canvasref = react.UseRef (null);
  const ContexTref = react.UseRef (null);
  React.Useeffect (() => {
    canvasref.current.width = window.innerwidth;
    canvasref.current.height = window.innerHeight;
    contextref.current = canvasref.current.getContext ('2d');
    contextref.current.fillstyle = 'jaune';
    contextref.current.beginPath ();
    contextref.current.arc (
      window.innerwidth / 2, // x
      window.innerheight / 2, // y
      100, // rayon
      0, // Angle de démarrage (radians)
      Math.pi * 2 // Angle de fin (radians)
    ));
    contextref.current.fill ();
  }, []);
  retour<canvas ref="{canvasRef}"></canvas> ;
};

Cela crée un cercle jaune. Le code restant sera dans cette useEffect . C'est pourquoi la pièce de réact est facultative; Vous pouvez adapter ce code pour d'autres cadres.

Nous devons générer et rendre plusieurs étoiles. Créons une fonction LOAD pour gérer la génération d'étoiles et la configuration du canevas, y compris le dimensionnement du canevas:

 const charge = () => {
  const vmin = math.min (window.innerheight, window.innerwidth);
  const star_count = math.floor (vmin * densityratio);
  canvasref.current.width = window.innerwidth;
  canvasref.current.height = window.innerHeight;
  starsRef.current = new Array (star_count) .fill (). map (() => ({
    x: gsap.utils.random (0, window.innerwidth, 1),
    y: gsap.utils.random (0, window.innerheight, 1),
    Taille: gsap.utils.random (1, sizelimit, 1),
    Échelle: 1,
    alpha: gsap.utils.random (0,1, defaultalpha, 0,1),
  }));
};

Chaque étoile est un objet avec des propriétés définissant ses caractéristiques (x, position y, taille, échelle, alpha). sizeLimit , defaultAlpha et densityRatio sont des accessoires transmis au composant Starscape avec des valeurs par défaut.

Un exemple d'objet étoile:

 {
  "x": 1252,
  "Y": 29,
  "taille": 4,
  "échelle": 1,
  "Alpha": 0,5
}

Pour rendre ces étoiles, nous créons une fonction RENDER qui itère sur le tableau stars et rend chaque étoile en utilisant la fonction arc :

 const Render = () => {
  contextref.current.clearrect (
    0,
    0,
    canvasref.current.width,
    canvasref.current.height
  ));
  StarsRef.current.ForEach ((Star) => {
    contextref.current.fillStyle = `Hsla (0, 100%, 100%, $ {star.alpha})`;
    contextref.current.beginPath ();
    contextref.current.arc (star.x, star.y, star.size / 2, 0, math.pi * 2);
    contextref.current.fill ();
  });
};

La fonction clearRect efface la toile avant le rendu, ce qui est crucial pour l'animation.

Le composant Starscape complet (sans interactivité) est illustré ci-dessous:

Composant Starscape complet (sans interactivité)

 const starScape = ({densityRatio = 0,5, sizelimit = 5, defaultalpha = 0,5}) => {
  const canvasref = react.UseRef (null);
  const ContexTref = react.UseRef (null);
  const starsRef = react.UseRef (null);
  React.Useeffect (() => {
    contextref.current = canvasref.current.getContext ('2d');
    const charge = () => {
      const vmin = math.min (window.innerheight, window.innerwidth);
      const star_count = math.floor (vmin * densityratio);
      canvasref.current.width = window.innerwidth;
      canvasref.current.height = window.innerHeight;
      starsRef.current = new Array (star_count) .fill (). map (() => ({
        x: gsap.utils.random (0, window.innerwidth, 1),
        y: gsap.utils.random (0, window.innerheight, 1),
        Taille: gsap.utils.random (1, sizelimit, 1),
        Échelle: 1,
        alpha: gsap.utils.random (0,1, defaultalpha, 0,1),
      }));
    };
    const Render = () => {
      contextref.current.clearrect (0, 0, canvasref.current.width, canvasref.current.height);
      StarsRef.current.ForEach ((Star) => {
        contextref.current.fillStyle = `Hsla (0, 100%, 100%, $ {star.alpha})`;
        contextref.current.beginPath ();
        contextref.current.arc (star.x, star.y, star.size / 2, 0, math.pi * 2);
        contextref.current.fill ();
      });
    };
    const run = () => {
      CHARGER();
      RENDRE();
    };
    COURIR();
    window.addeventListener («redimensi», exécuter);
    return () => {
      window.reMoveEventListener («redimensi», exécuter);
    };
  }, []);
  retour<canvas ref="{canvasRef}"></canvas> ;
};

Expérimentez les accessoires dans une démo pour voir leurs effets. Pour gérer le redimensionnement de la fenêtre, nous appelons LOAD et RENDER sur redimensionnement (avec le débouchement pour l'optimisation, qui est omis pour la concision ici).

Ajout d'interactivité

Maintenant, rendons la toile de fond interactive. Lorsque le pointeur se déplace, les étoiles près du curseur s'éclaiment et se montent.

Nous ajouterons une fonction UPDATE pour calculer la distance entre le pointeur et chaque étoile, puis entre l'échelle de l'étoile et l'alpha à l'aide de l'utilitaire mapRange de Greensock. Nous ajouterons également des accessoires scaleLimit et proximityRatio pour contrôler le comportement de mise à l'échelle.

 const update = ({x, y}) => {
  StarsRef.current.ForEach ((Star) => {
    const Distance = math.sqrt (math.pow (star.x - x, 2) math.pow (star.y - y, 2));
    gsap.to (étoile, {
      Échelle: scalemapperref.current (math.min (distance, vMinref.current * proximityratio)),
      alpha: alphamapperref.current (math.min (distance, vMinref.current * proximityratio)),
    });
  });
};

Pour rendre les mises à jour, nous utilisons gsap.ticker (une bonne alternative à requestAnimationFrame ), ajoutant RENDER au ticker et le supprimant dans le nettoyage. Nous définissons les cadres par seconde (FPS) sur 24. La fonction RENDER utilise désormais la valeur star.scale lors du dessin de l'arc.

 CHARGER();
gsap.ticker.add (rendu);
gsap.ticker.fps (24);
window.addeventListener («redimensi», charge);
document.addeventListener ('PointerMove', Update);
return () => {
  window.reMoveEventListener («redimensi», charge);
  Document.RemoveEventListener («PointerMove», mise à jour);
  GSAP.Ticker.Remove (rendu);
};

Maintenant, lorsque vous déplacez votre souris, les étoiles réagissent!

Pour gérer le cas où la souris quitte la toile, nous ajoutons un auditeur d'événements pointerleave qui revient les étoiles à leur état d'origine:

 const exit = () => {
  gsap.to (starsRef.current, {scale: 1, alpha: defaultalpha});
};

// ... Écouteurs d'événements ...
document.addeventListener ('PointerLeave', exit);
return () => {
  // ... nettoyage ...
  Document.RemoveEventListener («PointerLeave», exit);
  GSAP.Ticker.Remove (rendu);
};

Bonus: Oeuf de Pâques de code konami

Ajoutons un oeuf de Pâques de code konami. Nous écouterons les événements du clavier et déclencherons une animation si le code est entré.

 const konami_code = 'arrowup, arrowup, arrowdown, arrowdown, arrowleft, arrowright, arrowleft, arrowright, keyb, keya';
const CodeRef = react.UseRef ([]);
React.Useeffect (() => {
  const handlecode = (e) => {
    CodeRef.Current = [... CodeRef.Current, E.Code] .Slice (CodeRef.Current.Length> 9? CodeRef.Current.Length - 9: 0);
    if (CodeRef.Current.Join (','). TolowerCase () === Konami_Code.tolowerCase ()) {
      // déclenche une animation d'oeuf de Pâques
    }
  };
  window.addeventListener ('keyup', handlecode);
  return () => {
    window.reMoveEventListener ('KeyUp', handlecode);
  };
}, []);

Le composant Starscape complet et interactif avec l'œuf de Pâques du code Konami est assez long et omis ici pour la concision. Cependant, les principes décrits ci-dessus montrent comment créer une toile de fond étoilée interactive entièrement fonctionnelle et personnalisable à l'aide de React, Greensock et HTML<canvas></canvas> . L'animation des œufs de Pâques impliquerait de créer un gsap.timeline pour animer les propriétés des étoiles.

Cet exemple montre les techniques nécessaires pour créer vos propres fonds personnalisés. N'oubliez pas de considérer comment la toile de fond interagit avec le contenu de votre site. Expérimentez avec différentes formes, couleurs et animations pour créer des visuels uniques et engageants.

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!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Le positionnement de l'ancre ne se soucie pas de l'ordre sourceLe positionnement de l'ancre ne se soucie pas de l'ordre sourceApr 29, 2025 am 09:37 AM

Le fait que le positionnement de l'ancrage évite l'ordre de source HTML est si CSS-y parce qu'il est une autre séparation des préoccupations entre le contenu et la présentation.

Que signifie marge: 40px 100px 120px 80px?Que signifie marge: 40px 100px 120px 80px?Apr 28, 2025 pm 05:31 PM

L'article traite de la propriété CSS Margin, en particulier "Marge: 40px 100px 120px 80px", son application et les effets sur la mise en page de la page Web.

Quelles sont les différentes propriétés de la frontière CSS?Quelles sont les différentes propriétés de la frontière CSS?Apr 28, 2025 pm 05:30 PM

L'article traite des propriétés des frontières CSS, en se concentrant sur la personnalisation, les meilleures pratiques et la réactivité. Argument principal: Border-Radius est le plus efficace pour les conceptions réactives.

Quels sont les arrière-plans CSS, énumérez les propriétés?Quels sont les arrière-plans CSS, énumérez les propriétés?Apr 28, 2025 pm 05:29 PM

L'article traite des propriétés de fond CSS, de leurs utilisations dans l'amélioration de la conception du site Web et des erreurs courantes à éviter. L'accent est mis sur la conception réactive en utilisant la taille de l'arrière-plan.

Quelles sont les couleurs CSS HSL?Quelles sont les couleurs CSS HSL?Apr 28, 2025 pm 05:28 PM

L'article traite des couleurs CSS HSL, de leur utilisation dans la conception Web et des avantages par rapport à RVB. L'objectif principal est d'améliorer la conception et l'accessibilité grâce à une manipulation intuitive des couleurs.

Comment pouvons-nous ajouter des commentaires dans CSS?Comment pouvons-nous ajouter des commentaires dans CSS?Apr 28, 2025 pm 05:27 PM

L'article traite de l'utilisation des commentaires dans CSS, détaillant les syntaxes de commentaires à ligne unique et multi-lignes. Il soutient que les commentaires améliorent la lisibilité, la maintenabilité et la collaboration du code, mais peuvent avoir un impact sur les performances du site Web si elles ne sont pas gérées correctement.

Que sont les sélecteurs CSS?Que sont les sélecteurs CSS?Apr 28, 2025 pm 05:26 PM

L'article traite des sélecteurs CSS, de leurs types et de l'utilisation pour le style des éléments HTML. Il compare les sélecteurs ID et classe et aborde les problèmes de performances avec des sélecteurs complexes.

Quel type de CSS détient la priorité la plus élevée?Quel type de CSS détient la priorité la plus élevée?Apr 28, 2025 pm 05:25 PM

L'article traite de la priorité CSS, en se concentrant sur les styles en ligne ayant la plus grande spécificité. Il explique les niveaux de spécificité, les méthodes de remplacement et les outils de débogage pour gérer les conflits CSS.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel