Maison > interface Web > tutoriel CSS > Comment ajouter un dégradé radial autour du curseur de la souris sur l'arrière-plan d'une page dans Vue.js

Comment ajouter un dégradé radial autour du curseur de la souris sur l'arrière-plan d'une page dans Vue.js

Barbara Streisand
Libérer: 2024-12-03 15:19:10
original
568 Les gens l'ont consulté

How to add a radial gradient around the mouse cursor on the background of a page in Vue.js

Afin de pimenter un site Web, je décide d'implémenter un dégradé radial qui brille autour du curseur, à chaque mouvement de la souris le long de l'écran. L'implémentation suivante est adaptée à un projet Vue.js construit avec TypeScript.

Afin d'arriver à ce résultat, je souhaite également utiliser, par simplicité, une bibliothèque de détection de périphériques, et mon choix se porte sur ua-parser-js, précisément la version 2.0.0.

La deuxième étape, corail, est la création d'un composant de dégradé, qui doit être le conteneur principal de toute la vue, car ce sera la zone où le dégradé brillera.

// src/components/Gradient.vue

<script lang="ts">
import { computed, ref, onMounted, onUnmounted } from 'vue'
import { isMobile } from '../utils/device'

export default {
  name: 'GradientView',
  setup() {
    const getViewCentrePosition = () => ({
      x: window.innerWidth / 2,
      y: window.innerHeight / 2
    })

    const cursorPositionRef = ref(getViewCentrePosition())

    const updateCursorPosition = (event: MouseEvent) => {
      if (!isMobile()) {
        cursorPositionRef.value = {
          x: event.clientX,
          y: event.clientY
        }
      }
    }

    onMounted(() => {
      if (!isMobile()) {
        window.addEventListener('mousemove', updateCursorPosition)
      }
    })

    onUnmounted(() => {
      if (!isMobile()) {
        window.removeEventListener('mousemove', updateCursorPosition)
      }
    })

    const gradientPosition = computed(() => {
      return `${cursorPositionRef.value.x}px ${cursorPositionRef.value.y}px`
    })

    return {
      gradientPosition
    }
  },
  data() {
    return {
      isMobileClass: isMobile()
    }
  }
}
</script>

<template>
  <div
    :class="{ 'gradient--desktop': !isMobileClass, gradient: true }"
    :style="{ '--gradient-position': gradientPosition }"
  >
    <slot />
  </div>
</template>

<style scoped lang="scss">
div {
  .gradient.gradient--desktop {
    background-image: radial-gradient(
      circle at var(--gradient-position, 50% 50%),
      var(--tertiary-color),
      var(--secondary-color) 20%
    );
    width: 100vw;
    height: 100vh;
    overflow: scroll;

    @media (prefers-color-scheme: dark) {
      background-image: radial-gradient(
        circle at var(--gradient-position, 50% 50%),
        var(--tertiary-color),
        var(--primary-color) 20%
      );
    }
  }
}
</style>
Copier après la connexion

Comprenons le code. Dans la section script, j'ai une fonction qui renvoie simplement la position initiale, le centre de la vue de l'écran. Il pourrait être géré différemment, par exemple masqué, ou en position supérieure gauche pouvant apparaître avec une animation après le premier déclenchement de la souris. C'est un choix de mise en œuvre. Pour plus de simplicité, je l'ajoute au centre de la vue.

const getViewCentrePosition = () => ({
  x: window.innerWidth / 2,
  y: window.innerHeight / 2
})
Copier après la connexion

Ensuite, je crée une référence réactive à l'objet qui sera utilisé pour suivre les mouvements du curseur de la souris, se produisant via les événements de la souris.

const cursorPositionRef = ref(getViewCentrePosition())
Copier après la connexion

Ensuite j'implémente la fonction qui se charge de mettre à jour l'objet de référence réactif, après chaque mouvement du curseur de la souris.

const updateCursorPosition = (event: MouseEvent) => {
  if (!isMobile()) {
    cursorPositionRef.value = {
      x: event.clientX,
      y: event.clientY
    }
  }
}
Copier après la connexion

Cette fonction doit être associée aux événements de la souris.

onMounted(() => {
  if (!isMobile()) {
    window.addEventListener('mousemove', updateCursorPosition)
  }
})

onUnmounted(() => {
  if (!isMobile()) {
    window.removeEventListener('mousemove', updateCursorPosition)
  }
})
Copier après la connexion

Et enfin je calcule la valeur réactive de la position du dégradé, qui sera fournie au CSS de l'élément lui-même.

const gradientPosition = computed(() => {
  return `${cursorPositionRef.value.x}px ${cursorPositionRef.value.y}px`
})
Copier après la connexion

Notez que dans la plupart des parties décrites ci-dessus, je vérifie si l'appareil détecté est sur mobile ou non, pour éviter les calculs inutiles lorsqu'ils sont inutiles.

Ensuite, dans le modèle, je crée le html du dégradé, qui se comporte comme un wrapper pleine page pour le contenu, et j'applique également le CSS relatif, uniquement si nécessaire.

<template>
  <div
    :class="{ 'gradient--desktop': !isMobileClass, gradient: true }"
    :style="{ '--gradient-position': gradientPosition }"
  >
    <slot />
  </div>
</template>
Copier après la connexion

Et voici le CSS. Je propose ici une solution pour un site Web qui implémente le thème clair et sombre, et j'utilise deux couleurs pour la transition, sur la partie externe j'utilise les couleurs --primary-color et --secondary-color, tandis que la partie interne est configuration pour les deux thèmes en tant que --tertiary-color. Mais le choix et le réglage vous appartiennent.

<style scoped lang="scss">
.gradient.gradient--desktop {
  background-image: radial-gradient(
    circle at var(--gradient-position, 50% 50%),
    var(--tertiary-color),
    var(--secondary-color) 20%
  );
  width: 100vw;
  height: 100vh;
  overflow: scroll;

  @media (prefers-color-scheme: dark) {
    background-image: radial-gradient(
      circle at var(--gradient-position, 50% 50%),
      var(--tertiary-color),
      var(--primary-color) 20%
    );
  }
}
</style>
Copier après la connexion

Enfin, c'est le seul utilitaire utilisé, comme mentionné précédemment, pour détecter l'appareil.

// src/utils/device.ts

import { UAParser } from 'ua-parser-js'

export const isMobile = (): boolean => {
  const uap = new UAParser()
  return uap.getDevice().type === 'mobile'
}
Copier après la connexion

De meilleures idées ? Curieux de les entendre.

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!

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal