经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
爱就大胆说出来,不敢?那就用代码说出来!
来源:cnblogs  作者:云端笑猿  时间:2018/10/31 8:49:35  对本文有异议

转载自本人GitHub
https://github.com/intflag/SayLOVE

运行效果

项目源码

  • 采用canvas绘制,其中「心形」绘制代码来自网络,本人觉着挺有创意的就拿来改了改,然后送给女神了,哈哈!!!

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4.     <TITLE> New Document </TITLE>
  5.     <META NAME="Generator" CONTENT="EditPlus">
  6.     <META NAME="Author" CONTENT="">
  7.     <META NAME="Keywords" CONTENT="">
  8.     <META NAME="Description" CONTENT="">
  9.     <style>
  10.         canvas {
  11.             position: absolute;
  12.             left: 0;
  13.             top: 0;
  14.             width: 100%;
  15.             height: 100%;
  16.             background-color = "#2e2e2e";
  17.         }
  18.     </style>
  19. </HEAD>
  20.  
  21. <BODY style=" background-color: #000;">
  22.  
  23. <canvas id="heart"></canvas>
  24.  
  25. <script>
  26.     window.requestAnimationFrame =
  27.             window.__requestAnimationFrame ||
  28.             window.requestAnimationFrame ||
  29.             window.webkitRequestAnimationFrame ||
  30.             window.mozRequestAnimationFrame ||
  31.             window.oRequestAnimationFrame ||
  32.             window.msRequestAnimationFrame ||
  33.             (function () {
  34.                 return function (callback, element) {
  35.                     var lastTime = element.__lastTime;
  36.                     if (lastTime === undefined) {
  37.                         lastTime = 0;
  38.                     }
  39.                     var currTime = Date.now();
  40.                     var timeToCall = Math.max(1, 33 - (currTime - lastTime));
  41.                     window.setTimeout(callback, timeToCall);
  42.                     element.__lastTime = currTime + timeToCall;
  43.                 };
  44.             })();
  45.     window.isDevice = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(((navigator.userAgent || navigator.vendor || window.opera)).toLowerCase()));
  46.     var loaded = false;
  47.     var init = function () {
  48.         if (loaded) return;
  49.         loaded = true;
  50.         var mobile = window.isDevice;
  51.         var koef = mobile ? 0.5 : 1;
  52.         var canvas = document.getElementById('heart');
  53.         var ctx = canvas.getContext('2d');
  54.         var width = canvas.width = koef * innerWidth;
  55.         var height = canvas.height = koef * innerHeight;
  56.         var rand = Math.random;
  57.         ctx.fillStyle = "rgba(0,0,0,1)";
  58.         ctx.fillRect(0, 0, width, height);
  59.  
  60.  
  61.         var heartPosition = function (rad) {
  62.             //return [Math.sin(rad), Math.cos(rad)];
  63.             return [Math.pow(Math.sin(rad), 3), -(15 * Math.cos(rad) - 5 * Math.cos(2 * rad) - 2 * Math.cos(3 * rad) - Math.cos(4 * rad))];
  64.         };
  65.         var scaleAndTranslate = function (pos, sx, sy, dx, dy) {
  66.             return [dx + pos[0] * sx, dy + pos[1] * sy];
  67.         };
  68.  
  69.         window.addEventListener('resize', function () {
  70.             width = canvas.width = koef * innerWidth;
  71.             height = canvas.height = koef * innerHeight;
  72.             ctx.fillStyle = "rgba(0,0,0,1)";
  73.             ctx.fillRect(0, 0, width, height);
  74.         });
  75.  
  76.         var traceCount = mobile ? 20 : 50;
  77.         var pointsOrigin = [];
  78.         var i;
  79.         var dr = mobile ? 0.3 : 0.1;
  80.         for (= 0; i < Math.PI * 2; i += dr) pointsOrigin.push(scaleAndTranslate(heartPosition(i), 210, 13, 0, 0));
  81.         for (= 0; i < Math.PI * 2; i += dr) pointsOrigin.push(scaleAndTranslate(heartPosition(i), 150, 9, 0, 0));
  82.         for (= 0; i < Math.PI * 2; i += dr) pointsOrigin.push(scaleAndTranslate(heartPosition(i), 90, 5, 0, 0));
  83.         var heartPointsCount = pointsOrigin.length;
  84.  
  85.         var targetPoints = [];
  86.         var pulse = function (kx, ky) {
  87.             for (= 0; i < pointsOrigin.length; i++) {
  88.                 targetPoints[i] = [];
  89.                 targetPoints[i][0] = kx * pointsOrigin[i][0] + width / 2;
  90.                 targetPoints[i][1] = ky * pointsOrigin[i][1] + height / 2;
  91.             }
  92.         };
  93.  
  94.         var e = [];
  95.         for (= 0; i < heartPointsCount; i++) {
  96.             var x = rand() * width;
  97.             var y = rand() * height;
  98.             e[i] = {
  99.                 vx: 0,
  100.                 vy: 0,
  101.                 R: 2,
  102.                 speed: rand() + 5,
  103.                 q: ~~(rand() * heartPointsCount),
  104.                 D: 2 * (% 2) - 1,
  105.                 force: 0.2 * rand() + 0.7,
  106.                 f: "hsla(0," + ~~(40 * rand() + 60) + "%," + ~~(60 * rand() + 20) + "%,.3)",
  107.                 trace: []
  108.             };
  109.             for (var k = 0; k < traceCount; k++) e[i].trace[k] = {x: x, y: y};
  110.         }
  111.  
  112.         var config = {
  113.             traceK: 0.4,
  114.             timeDelta: 0.01
  115.         };
  116.  
  117.         var time = 0;
  118.         var textLeft1 = 0;
  119.         var textLeft2 = -10;
  120.         var loop = function () {
  121.             //设置字体填充颜色
  122.             ctx.fillStyle = "red";
  123.             //设置字体样式
  124.             ctx.font = "48px 楷体";
  125.             ctx.fillText("I LOVE YOU - 宝贝", 460, 120);
  126.  
  127.             ctx.font = "26px 楷体";
  128.  
  129.             //从坐标点(50,50)开始绘制文字
  130.             var mLeft = 50;
  131.             var mTop = 250;
  132.  
  133.             //左侧文字
  134.             ctx.fillStyle = "red";
  135.  
  136.             ctx.fillText("我爱你,没有什么目的,只是爱你。", mLeft, mTop);
  137.             ctx.fillText("一辈子,就做一次自己。", mLeft, mTop + 50);
  138.             ctx.fillText("这一次,我想给你全世界;", mLeft, mTop + 100);
  139.             ctx.fillText("这一次,遍体鳞伤也没关系;", mLeft, mTop + 150);
  140.             ctx.fillText("这一次,用尽所有的勇敢;", mLeft, mTop + 200);
  141.             ctx.fillText("这一次,可以什么都不在乎。", mLeft, mTop + 250);
  142.             ctx.fillText("但只是这一次就够了。", mLeft, mTop + 300);
  143.             ctx.fillText("因为生命再也承受不起这么重的爱情。", mLeft, mTop + 350);
  144.  
  145.  
  146.             //右侧标签
  147.             ctx.font = "60px 楷体";
  148.             ctx.fillStyle = "#ff00ff";
  149.             ctx.fillText("未来", 1000, 300);
  150.             ctx.font = "45px 楷体";
  151.             ctx.fillStyle = "#ccbe06";
  152.             ctx.fillText("勇敢", 900, 500);
  153.             ctx.font = "50px 楷体";
  154.             ctx.fillStyle = "#00ffff";
  155.             ctx.fillText("真心", 1100, 600);
  156.             ctx.font = "38px 楷体";
  157.             ctx.fillStyle = "#3d85c6";
  158.             ctx.fillText("坚持", 1150, 400);
  159.             ctx.font = "38px 楷体";
  160.             ctx.fillStyle = "#ffffff";
  161.             ctx.fillText("白头", 1200, 200);
  162.  
  163.             var n = -Math.cos(time);
  164.             pulse((1 + n) * .5, (1 + n) * .5);
  165.             time += ((Math.sin(time)) < 0 ? 9 : (> 0.8) ? .2 : 1) * config.timeDelta;
  166.             ctx.fillStyle = "rgba(0,0,0,.1)";
  167.             ctx.fillRect(0, 0, width, height);
  168.             for (= e.length; i--;) {
  169.                 var u = e[i];
  170.                 var q = targetPoints[u.q];
  171.                 var dx = u.trace[0].- q[0];
  172.                 var dy = u.trace[0].- q[1];
  173.                 var length = Math.sqrt(dx * dx + dy * dy);
  174.                 if (10 > length) {
  175.                     if (0.95 < rand()) {
  176.                         u.= ~~(rand() * heartPointsCount);
  177.                     }
  178.                     else {
  179.                         if (0.99 < rand()) {
  180.                             u.*= -1;
  181.                         }
  182.                         u.+= u.D;
  183.                         u.%= heartPointsCount;
  184.                         if (0 > u.q) {
  185.                             u.+= heartPointsCount;
  186.                         }
  187.                     }
  188.                 }
  189.                 u.vx += -dx / length * u.speed;
  190.                 u.vy += -dy / length * u.speed;
  191.                 u.trace[0].+= u.vx;
  192.                 u.trace[0].+= u.vy;
  193.                 u.vx *= u.force;
  194.                 u.vy *= u.force;
  195.                 for (= 0; k < u.trace.length - 1;) {
  196.                     var T = u.trace[k];
  197.                     var N = u.trace[++k];
  198.                     N.-= config.traceK * (N.- T.x);
  199.                     N.-= config.traceK * (N.- T.y);
  200.                 }
  201.                 ctx.fillStyle = u.f;
  202.                 for (= 0; k < u.trace.length; k++) {
  203.                     ctx.fillRect(u.trace[k].x, u.trace[k].y, 1, 1);
  204.                 }
  205.             }
  206.             //ctx.fillStyle = "rgba(255,255,255,1)";
  207.             //for (i = u.trace.length; i--;) ctx.fillRect(targetPoints[i][0], targetPoints[i][1], 2, 2);
  208.  
  209.             window.requestAnimationFrame(loop, canvas);
  210.         };
  211.  
  212.         loop();
  213.     };
  214.  
  215.     var s = document.readyState;
  216.     if (=== 'complete' || s === 'loaded' || s === 'interactive') init();
  217.     else document.addEventListener('DOMContentLoaded', init, false);
  218. </script>
  219. </BODY>
  220. </HTML>
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号