故事开始

午饭时间,暗恋已久的学妹拉着我的衣袖:“学长学长,你能不能让这些爱心变成五颜六色的吗~”。

我在旁边笑开了花~~~

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/186051/1587909551332-26fa22bf-c7ee-4a7f-9286-a8e768d352af.png "image.png")

诶呀,口水流出来了。

我想最终效果是这样的(猜猜多少个爱心):
image.png
然后开始动手吧~

学啥本领

本文将带大家学习两个好东西:
1.生成随机色的方法;
2.Element.animate() 方法。

当然,还有撩妹技巧了~

代码走起

1. 画个小爱心

爱心怎么画,不是咱们本文重点,so,SVG搞起:

  1. <div id="heart">
  2. <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1"
  3. xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
  4. >
  5. <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0
  6. 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064
  7. 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0
  8. 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072
  9. 677.51936 192.03072z" p-id="1254"
  10. ></path>
  11. </svg>
  12. </div>

小爱心出来了:
image.png

2. 画一大堆爱心

现在删除到之前的 SVG 标签,换成动态生成咯~~

  1. let heartList = '';
  2. const n = 99;
  3. for(let i = 0; i <= n; i++){
  4. heartList += `
  5. <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1"
  6. xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32">
  7. <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0
  8. 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064
  9. 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0
  10. 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072
  11. 677.51936 192.03072z" p-id="1254"
  12. ></path>
  13. </svg>
  14. `
  15. }
  16. document.getElementById('heart').innerHTML = heartList;

一大堆小爱心出现啦:
image.png

3. 打造魔法棒

接下来我们要打造一把魔法棒,能让我们这些小爱心变成各种各样的颜色。
没错,这把魔法棒,就是用来生成随机颜色。

方法很多,我搜集以下几种简单好用的生成随机颜色的方法,基本我们业务随便一个都能用:

  1. function getRandomColor(){
  2. const r = Math.floor(Math.random()*255);
  3. const g = Math.floor(Math.random()*255);
  4. const b = Math.floor(Math.random()*255);
  5. return 'rgba('+ r +','+ g +','+ b +',0.8)';
  6. }
  7. function getRandomColor(){
  8. return '#'+Math.floor(Math.random()*16777215).toString(16);
  9. }
  10. function getRandomColor(){
  11. return '#' + (function(color){
  12. return (color += '0123456789abcdef'[Math.floor(Math.random()*16)])
  13. && (color.length == 6) ? color : arguments.callee(color);
  14. })('');
  15. }
  16. function getRandomColor(){
  17. return '#'+'0123456789abcdef'.split('').map(
  18. (v,i,a) => i>5 ? null : a[Math.floor(Math.random()*16)]
  19. ).join('');
  20. }
  21. function getRandomColor(){
  22. return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);
  23. }
  24. function getRandomColor(){
  25. const colorAngle = Math.floor(Math.random()*360);
  26. return 'hsla('+ colorAngle +',100%,50%,1)';
  27. }
  28. function getRandomColor(){
  29. return (function(m,s,c){
  30. return (c ? arguments.callee(m,s,c-1) : '#') +
  31. s[m.floor(m.random() * 16)]
  32. })(Math,'0123456789abcdef',5)
  33. }

随机色真好玩~

4. 五颜六色!变~

最后,我们修改前面 SVG 的代码片段,加入 getRandomColor 方法的调用:

  1. for(let i = 0; i <= n; i++){
  2. heartList += `
  3. <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1"
  4. xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
  5. fill="${getRandomColor()}"
  6. >
  7. <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0
  8. 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064
  9. 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0
  10. 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072
  11. 677.51936 192.03072z" p-id="1254"
  12. ></path>
  13. </svg>
  14. `
  15. }

99 个小爱心,水灵灵的!
image.png

5. 动起来吧!

这时候,每个爱心都静静躺着页面,是时候让它们动起来啦,为了学妹~

继续改造前面 SVG 代码,为每个 SVG 标签添加连续 ID 值:

  1. for(let i = 0; i <= n; i++){
  2. heartList += `
  3. <svg id="heart_${i}" t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1"
  4. xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
  5. fill="${getRandomColor()}"
  6. >
  7. <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0
  8. 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064
  9. 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0
  10. 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072
  11. 677.51936 192.03072z" p-id="1254"
  12. ></path>
  13. </svg>
  14. `
  15. }

生命随机放大倍数,并设置动画效果:

  1. let getRandomNum = () => Math.floor(Math.random()*2+1);
  2. setTimeout(function(){
  3. for (let i = 0; i <= n; i++) {
  4. const item = `heart_${i}`;
  5. document.getElementById(item).animate([
  6. // keyframes translateY(0px)
  7. { transform: `scale(${getRandomNum()})` },
  8. { transform: `scale(${getRandomNum()})` },
  9. { transform: `scale(${getRandomNum()})` },
  10. { transform: `scale(${getRandomNum()})` },
  11. { transform: `scale(${getRandomNum()})` },
  12. { transform: `scale(${getRandomNum()})` },
  13. ], {
  14. // timing options
  15. duration: 5000,
  16. iterations: Infinity
  17. });
  18. }
  19. }, 100)

然后,小爱心们动起来啦。

爱心666 (1).gif

6. 飞起来吧~

接下来,要让这些小爱心飞起来~

爱心666 (3).gif

下面贴代码。

  1. html,body{
  2. overflow: hidden;
  3. width: 100%;
  4. height: 100%;
  5. margin: 0;
  6. }
  7. #heart{
  8. position: relative;
  9. }
  10. .item{
  11. position: absolute;
  12. }

逻辑修改:

  1. let heartList = '';
  2. const n = 666; // 总爱心数
  3. // 生成随机颜色
  4. function getRandomColor() {
  5. return (function (m, s, c) {
  6. return (c ? arguments.callee(m, s, c - 1) : '#') +
  7. s[m.floor(m.random() * 16)]
  8. })(Math, '0123456789abcdef', 5)
  9. }
  10. // 生成爱心列表
  11. for(let i = 0; i <= n; i++){
  12. heartList += `
  13. <svg id="heart_${i}" class="item" t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1"
  14. xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
  15. fill="${getRandomColor()}"
  16. >
  17. <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0
  18. 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064
  19. 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0
  20. 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072
  21. 677.51936 192.03072z" p-id="1254"
  22. ></path>
  23. </svg>
  24. `
  25. }
  26. // 随机放大倍数
  27. const getRandomNum = (scale) => Math.floor(Math.random()*scale+1);
  28. const boxWidth = window.innerWidth;
  29. const boxHeight = window.innerHeight;
  30. setTimeout(function(){
  31. for (let i = 0; i <= n; i++) {
  32. const item = `heart_${i}`;
  33. const width = getRandomNum(boxWidth);
  34. const height = getRandomNum(boxHeight);
  35. const cWidth = getRandomNum(1000) - width;
  36. const cHeight = getRandomNum(1000) - height;
  37. document.getElementById(item).animate([
  38. { transform: `scale(${getRandomNum(2)})`,left: `0px`, top: `0px` },
  39. { transform: `scale(${getRandomNum(2)})`,left: `${boxWidth/2}px`, top: `${boxHeight/2}px` },
  40. { transform: `scale(${getRandomNum(2)})`,left: `${cWidth * 2}px`, top: `${cHeight * 2}px` },
  41. ], {
  42. duration: 9000,
  43. iterations: Infinity,
  44. easing: 'ease-in-out'
  45. });
  46. }
  47. }, 100)
  48. document.getElementById('heart').innerHTML = heartList;

聪明的你,再配上BGM,浪漫~

还能做更多有意思的小玩意,靠各位发挥啦。

故事结束

继续~

对了,送给学妹的代码我放在仓库:
https://github.com/pingan8787/Leo-JavaScript/blob/master/Leo-Demo/7-WeiteHeartPop.html