JS实现的手写书信效果

重点:

  一:两个<div>标签,一个letter_src用于存放将逐一显示的文档内容(本身内容不显示),另一个letter将通过innerHTML显示letter_src中的内容。(这样的设计很巧妙!)

  二:两张动态图片pen.gif和inkwell2.gif.(一开始我还真想不到这是两张动态图片,还自己捉摸着用JS是怎么实现这种效果的,原来...)

  三:一个CSS3新属性:background-size.属性值cover,contain,auto的不同运用。

  四:事件window.onload(),网页在一打开就会运行JS

  五:最重要的函数doStep()的创建和调用.setTimeout(doStep, iDelay)函数的运用其实用到了高级语言编程里的递归思想。文档内容是一个字符一个字符的加进innerHTML中的,但每个字符的处理方式都是一样,只是会有不同的情况,doStep()函数其实就是一个处理文档字符并将其显示的函数。

  六:字符的几种情况:

           1.正常字符 直接sChars += SChar;

           2.模拟错误情况,用"|"表示写错的字符

           3.内置标签起始符"<"

           4.内置特殊字符起始符"&"

           5.句截至符号"."

           6.分号","

           7.最最重要的单词截至符——空格" "

  七:iCurInk的巧妙使用(实现的单词颜色改变)

  八:inkwell2.gif的隐藏和显示

 

主函数dosTep()代码:

  1 window.onload = function(){
  2                 /*
  3                 整个letter部分的内容由以下构成:
  4                     一:字符
  5                     二:空格
  6                     三:错误emulator—— “|”
  7                     四:段截止符:“.”
  8                     五:“,”
  9                     六:文章截止符“”
 10                 每种符号都有自己的处理方式
 11                 */
 12                 
 13                     //用到的变量
 14                     var vLetter = document.getElementById("letter");
 15                     var iSpeedInk = 5;
 16                     var sText = document.getElementById("letter_src").innerHTML;
 17                     var iChar = 0;
 18                     var sChars = "<span>";
 19                     var iCurInk = 0;                  //设置iCurInk变量,墨汁颜色的最大值
 20                   var sCurCaret = "";
 21                   var sCaret = "&nbsp;<img src='pen.gif' style='position:absolute' />";        //空格了留的很巧妙
 22                   
 23                   //主要函数
 24                   var doStep = function(){
 25                       var sChar = sText.charAt(iChar);
 26                       var iDelay = 32;
 27                       
 28                       //判断字符
 29                       if(sChar == "")                                   //文章结束标志
 30                         {
 31                             sCurCaret = "";
 32                         }
 33                       
 34                       else if(sChar == "|")                         //遇到错误单词
 35                           {
 36                               sChar = "";
 37                               sChars = sChars.substring(0, sChars.length - 1);
 38                               iDelay = 64;
 39                           }
 40                       else if(sChar == "<")                        //转行
 41                           {
 42                               var iPos = sText.indexOf(">",iChar);
 43                               sChar = sText.substring(iChar, iPos + 1);
 44                               iChar = iPos;
 45                           }
 46                       else if(sChar == "&")                          //html 特殊字符
 47                           {
 48                               var iPos2 = sText.indexOf(";",iChar);
 49                               sChar = sText.substring(iChar, iPos2 +1);
 50                               iChar = iPos2;
 51                           }
 52                       else if(sChar == ".")
 53                           {
 54                               iDelay = 300;
 55                           }
 56                       else if(sChar == ",")
 57                           {
 58                               iDelay = 100;
 59                           }
 60                       else if(iChar > 5)
 61                           {
 62                               sCurCaret = sCaret;
 63                           }
 64                           
 65                       if(sChar == " ")                             //刚写完一个单词
 66                         {
 67                             iCurInk += iSpeedInk;
 68                             sChar = '</span><span style="color:rgb(' + iCurInk + ',' + iCurInk + ',' + iCurInk + ')">' + sChar;
 69                         }
 70                       if(document.getElementById("inkwell2").style.visibility == "visible")
 71                        {
 72                           sCurCaret = sCaret;
 73                           sChar = "</span><span style='color:rgb(0,0,0)'>" + sChar;
 74                           document.getElementById("inkwell2").style.visibility = "hidden";
 75                        }
 76                       
 77                       if(iCurInk > 160)                //设置计数值,重新蘸取墨汁
 78                        {
 79                          iCurInk = 0;
 80                          document.getElementById("inkwell2").style.visibility = "visible";
 81                          iDelay = 1000;
 82                          sCurCaret = "";
 83                        }
 84                                         
 85                       sChars += sChar;
 86                       
 87                       if(iChar == sText.length - 1)
 88                       {
 89                           sCurCaret = "";
 90                       }
 91                       
 92                       vLetter.innerHTML = sChars + sCurCaret;
 93                       
 94                       iChar++;
 95                       
 96                       if(iChar < sText.length)
 97                        {
 98                            setTimeout(doStep, 20 + iDelay);           //iDelay值得设置为正常写字的速度
 99                        }
100                       }        //dostop()函数
101                   doStep();              //必须先调用函数
102                 };

资料来源:

http://www.script-tutorials.com/animated-old-letter/

 

转载于:https://www.cnblogs.com/Adeline-p2y/archive/2012/10/21/2733031.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的使用canvas画布实现手写签名效果的示例代码: HTML代码: ```html <canvas id="signature-canvas" width="400" height="200"></canvas> <button id="clear-button">清除</button> ``` JavaScript代码: ```javascript const canvas = document.getElementById('signature-canvas'); const context = canvas.getContext('2d'); let isDrawing = false; let lastX = 0; let lastY = 0; // 监听鼠标按下事件 canvas.addEventListener('mousedown', (event) => { isDrawing = true; [lastX, lastY] = [event.offsetX, event.offsetY]; }); // 监听鼠标移动事件 canvas.addEventListener('mousemove', (event) => { if (isDrawing) { context.beginPath(); context.moveTo(lastX, lastY); context.lineTo(event.offsetX, event.offsetY); context.stroke(); [lastX, lastY] = [event.offsetX, event.offsetY]; } }); // 监听鼠标松开事件 canvas.addEventListener('mouseup', () => { isDrawing = false; }); // 监听鼠标离开事件 canvas.addEventListener('mouseleave', () => { isDrawing = false; }); // 监听清除按钮点击事件 const clearButton = document.getElementById('clear-button'); clearButton.addEventListener('click', () => { context.clearRect(0, 0, canvas.width, canvas.height); }); ``` 这个示例代码中,我们使用了canvas的2D绘图上下文对象(context),监听了鼠标的按下、移动、松开和离开事件,通过绘制连续的线条来实现手写签名效果。此外,我们还添加了一个清除按钮,用于清除画布上的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值