Maison  >  Article  >  interface Web  >  Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

青灯夜游
青灯夜游avant
2021-07-19 19:31:083522parcourir

Cet article vous présentera la méthode de création d'animation Pikachu en utilisant CSS+JavaScript. Il vous présentera également étape par étape comment dessiner Pikachu en utilisant CSS et comment utiliser js pour obtenir des effets dynamiques et faire bouger Pikachu.

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Enregistrez simplement vos idées, il existe de nombreuses zones qui peuvent être optimisées

Dessinez un nez (en forme d'éventail)

Utilisez transparent pour dessiner un triangle approprié

.nose {
  position: absolute;
  border: 10px solid black;
  border-color: black transparent transparent;
  border-bottom: none;
  left: 50%;
  top: 145px;
  margin-left: -10px;
}

Ensuite, dessinez le demi-cercle sur le triangle pour formez un éventail

.yuan {
  position: absolute;
  height: 8px;
  width: 20px;
  top: -18px;
  left: -10px;
  border-radius: 8px 8px 0 0;
  background-color: black;
}

Dessinez deux yeux noirs à gauche et à droite

.eye {
  position: absolute;
  border: 2px solid #000000;
  width: 64px;
  height: 64px;
  left: 50%;
  top: 100px;
  margin-left: -32px;
  border-radius: 50%;
  background-color: #2e2e2e;
}
.eye.left {
  transform: translateX(-118px);
}
.eye.right {
  transform: translateX(118px);
}

Puis dessinez les yeux blancs à l'intérieur des yeux noirs

.eye::after {
  content: "";
  display: block;
  position: absolute;
  border: 2px solid black;
  background: #ffffff;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  left: 10px;
}

Dessinez les lèvres

Faites la lèvre gauche

.mouth .up .lip.left {
  border: 3px solid black;
  width: 86px;
  height: 24px;
  border-radius: 0 0 0 50px;
  border-top-color: transparent;
  border-right-color: transparent;
  position: relative;
  transform: rotate(-15deg);
  position: absolute;
  left: 50%;
  margin-left: -50%;
}

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Utilisez ensuite des pseudo éléments pour couvrir le noir sous le nez Lignes verticales

.mouth .up .lip.left::before {
  content: "";
  display: block;
  width: 5px;
  height: 30px;
  position: absolute;
  right: -4px;
  bottom: 0px;
  background-color: #ffdb00;
}

Utilisez le même principe pour faire la lèvre droite

.mouth .up .lip.right {
  border: 3px solid black;
  width: 86px;
  height: 24px;
  border-radius: 0 0 50px 0;
  border-top-color: transparent;
  border-left-color: transparent;
  position: relative;
  transform: rotate(15deg);
  position: absolute;
  right: 50%;
  margin-right: -50%;
}
.mouth .up .lip.right::before {
  content: "";
  display: block;
  width: 5px;
  height: 30px;
  position: absolute;
  left: -4px;
  bottom: 0px;
  background-color: #ffdb00;
}

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Faire la lèvre inférieure

.mouth .down {
  border: 1px solid red;
  height: 166px;
  width: 100%;
  position: relative;
  overflow: hidden;
}

.mouth .down .yuan1 {
  border: 1px solid black;
  position: absolute;
  width: 124px;
  height: 1000px;
  left: 50%;
  margin-left: -62px;
  bottom: 0;
  border-radius: 85px/280px;
  background: #9b000a;
}

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Puis ajoutez le même fond que le corps dans .bouche .up .lèvre Dessinez ensuite la partie intérieure et les joues rouges

.mouth .down .yuan1 .yuan2 {
  border: 1px solid red;
  position: absolute;
  width: 150px;
  height: 300px;
  background: #fa595b;
  left: 50%;
  margin-left: -75px;
  bottom: -165px;
  border-radius: 100px;
}

.face {
  border: 3px solid black;
  position: absolute;
  width: 88px;
  height: 88px;
  left: 50%;
  margin-left: -44px;
  top: 210px;
}
.face.left {
  transform: translateX(-166px);
  border-radius: 50%;
  background: #ff0000;
}
.face.right {
  transform: translateX(166px);
  border-radius: 50%;
  background: #ff0000;
}

Ajoutez des effets d'animation

Ajoutez des effets d'animation au nez

@keyframes wave {
  0% {
    transform: rotate(0);
  }
  33% {
    transform: rotate(6deg);
  }
  66% {
    transform: rotate(-6deg);
  }
  100% {
    transform: rotate(0);
  }
}
.nose:hover {
  transform-origin: center bottom;
  animation: wave 220ms infinite linear;
}

Affichage dynamique

Laissez un nombre augmenter automatiquement de 1

  • Créez-en un nouveautest.html et test.js
  • dans Dans test.html, écrivez un div avec l'identifiant demo
let n = 1;
demo.innerHTML = n;
setInterval(() => {
  n += 1;
  demo.innerHTML = n;
}, 1000);

Vous pouvez écrire un paragraphe ci-dessous, et chaque mot apparaît un par un

const string = "大家好,我是你们的老朋友";
let n = 1;
demo.innerHTML = string.substr(0, n);
setInterval(() => {
  n += 1;
  demo.innerHTML = string.substr(0, n);
}, 300);

Mais il y a toujours un bug dans le code ci-dessus If. vous tapez n, vous constaterez qu'une fois les mots affichés, n Il continue d'augmenter. Il suffit d'annuler la minuterie après avoir affiché les mots. La méthode pour annuler la minuterie est la suivante

const string = "大家好,我是你们的老朋友";
let n = 1;
demo.innerHTML = string.substr(0, n);
let id = setInterval(() => {
  n += 1;
  if (n > string.length) {
    window.clearInterval(id);
    return;
  }
  demo.innerHTML = string.substr(0, n);
}, 300);

Maintenant que nous connaissons le principe. d'afficher un mot par un, affichons ensuite notre CSS.

Préparez deux divs dans test.html, l'un est utilisé pour écrire des balises CSS et l'autre est utilisé pour afficher le contenu CSS sur la page.

Cependant, il y a toujours un problème après cela, l'animation affichée est repoussée vers le bas par le texte. Comme le montre l'image

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

Ajoutez le code suivant à test.html

<style>
  #html {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 50vh;
  }
</style>

Nous avons résolu le problème de la façon d'animer, et il y a un problème de code invisible. Ensuite, nous résoudrons le problème de la façon de animer. faites défiler automatiquement la barre de défilement vers le bas. Et l'animation est corrigée

Le contenu du code HTML n'a pas besoin d'être vu par l'utilisateur, il peut être masqué directement

<style>
  #demo2 {
    display: none;
  }
  #demo{
    position: fixed;
    height: 50vh;
    top: 0;
    left: 0;
    width: 100%;
    overflow-y: auto;
  }
  #html {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 50vh;
  }
</style>

Mettez à jour le code dans test.js pour laisser la barre de défilement défiler. faire défiler automatiquement vers le bas

let id = setInterval(() => {
  n += 1;
  if (n > string.length) {
    window.clearInterval(id);
    return;
  }
  demo.innerText = string.substr(0, n);
  demo2.innerHTML = string.substr(0, n);
  demo.scrollTop = demo.scrollHeight; //更新了这里
}, 0);

Après avoir masqué la barre de défilement, l'utilisateur peut toujours faire défiler le contenu

#demo::-webkit-scrollbar {
  display: none; 
}

Implémenter des fonctions de lecture lente, moyenne et rapide

  • Ajouter des boutons lecture, pause, lent, moyen et rapide

  • Après rafraîchissement, j'ai constaté que le bouton est d'abord devenu plus grand puis restauré, c'est parce que la réinitialisation CSS affecte le bouton, mettez à jour le code dans test et js

Divisez le style en deux parties sans s'affecter

.skin * {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.skin *::before,
*::after {
  box-sizing: border-box;
}
.skin {
  background: #ffdb00;
  min-height: 50vh;
  position: relative;
}

Comment créer une animation Pikachu avec CSS+JS (analyse de code)

3. Idée

  • Pause : Effacer le minuteur (réveil)
  • Jouer : Exécuter le minuteur
  • Lent : Écraser le réveil, le réinitialiser, le temps sera plus lent

Optimisation du code

btnSlow.onclick = () => {
  window.clearInterval(id);
  time = 300;
  id = setInterval(() => {
    run();
  }, time);
};
// 等价于
btnSlow.onclick = () => {
  window.clearInterval(id);
  time = 300;
  id = setInterval(run, time);
};

Le l'optimisation complète est la suivante

暂停;
btnPause.onclick = () => {
  window.clearInterval(id);
};
播放;
btnPlay.onclick = () => {
  id = setInterval(() => {
    run();
  }, time);
};
慢速;
btnSlow.onclick = () => {
  window.clearInterval(id);
  time = 300;
  id = setInterval(() => {
    run();
  }, time);
};
中速;
btnNormal.onclick = () => {
  window.clearInterval(id);
  time = 50;
  id = setInterval(() => {
    run();
  }, time);
};
快速;
btnFast.onclick = () => {
  window.clearInterval(id);
  time = 0;
  id = setInterval(() => {
    run();
  }, time);
};

Les résultats d'optimisation du code ci-dessus sont les suivants↓↓↓

const run = () => {
  n += 1;
  if (n > string.length) {
    window.clearInterval(id);
    return;
  }
  demo.innerText = string.substr(0, n);
  demo2.innerHTML = string.substr(0, n);
  demo.scrollTop = demo.scrollHeight;
};

const play = () => {
  return setInterval(run, time);
};

let id = play();

const pause = () => {
  window.clearInterval(id);
};

//暂停
btnPause.onclick = () => {
  pause();
};
// 播放
btnPlay.onclick = () => {
  id = play();
};
//慢速
btnSlow.onclick = () => {
  pause();
  time = 300;
  id = play();
};
//中速
btnNormal.onclick = () => {
  pause();
  time = 50;
  id = play();
};
//快速
btnFast.onclick = () => {
  pause();
  time = 0;
  id = play();
};

Si une fonction ne fait rien, appelle simplement une autre fonction, alors la fonction externe peut être omise directement

Par exemple

btnSlow.onclick = () => {
  slow();
};
//等价
btnSlow.onclick = slow;

bloquez plusieurs fonctions ensemble et faites face à un seul objet

const play = () => {
  return setInterval(run, time);
};

let id = play();

const pause = () => {
  window.clearInterval(id);
};

const slow = () => {
  pause();
  time = 300;
  id = play();
};

const normal = () => {
  pause();
  time = 50;
  id = play();
};
const fast = () => {
  pause();
  time = 0;
  id = play();
};
const player = {
  run: () => {
    n += 1;
    if (n > string.length) {
      window.clearInterval(id);
      return;
    }
    demo.innerText = string.substr(0, n);
    demo2.innerHTML = string.substr(0, n);
    demo.scrollTop = demo.scrollHeight;
  },
  play: () => {
    return setInterval(player.run, time);
  },
  pause: () => {
    window.clearInterval(id);
  },

  slow: () => {
    player.pause();
    time = 300;
    id = player.play();
  },
  normal: () => {
    player.pause();
    time = 50;
    id = player.play();
  },
  fast: () => {
    player.pause();
    time = 0;
    id = player.play();
  },
};

...

  bindEvents: () => {
    document.querySelector("#btnPause").onclick = player.pause;
    document.querySelector("#btnPlay").onclick = player.play;
    document.querySelector("#btnSlow").onclick = player.slow;
    document.querySelector("#btnNormal").onclick = player.normal;
    document.querySelector("#btnFast").onclick = player.fast;
  }
  //

Modularité

Mettez un tas de code dans un fichier et exportez-le, puis importez-le

Pour plus de connaissances liées à la programmation, veuillez visiter : Vidéo de programmation ! !

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer