这是一款使用HTML5 Canvas制作的黑板特效,该黑板特效支持手机移动端,它能模拟使用粉笔在黑板上写字的效果。该黑板特效的特点还有:
- 使用鼠标左键能够在黑板上写字。
- 使用鼠标右键能够擦除已写的字。
- 按空格键可以清空黑板上的内容。
- 点击下载按钮可以将写入的内容保存为图片并下载。
使用方法
JavaScript
该HTML5 Canvas黑板特效的完整js代码如下:
$(document).ready(chalkboard); function chalkboard(){ $( '#chalkboard' ).remove(); $( '.chalk' ).remove(); $( 'body' ).prepend( '<div class="panel"><a class="link" target="_blank">Save</a></div>' ); $( 'body' ).prepend( '<img src="img/bg.png" id="pattern" width=50 height=50>' ); $( 'body' ).prepend( '<canvas id="chalkboard"></canvas>' ); $( 'body' ).prepend( '<div class="chalk"></div>' ); var canvas = document.getElementById( "chalkboard" ); $( '#chalkboard' ).css( 'width' ,$(window).width()); $( '#chalkboard' ).css( 'height' ,$(window).height()); canvas.width = $(window).width(); canvas.height = $(window).height(); var ctx = canvas.getContext( "2d" ); var width = canvas.width; var height = canvas.height; var mouseX = 0; var mouseY = 0; var mouseD = false ; var eraser = false ; var xLast = 0; var yLast = 0; var brushDiameter = 7; var eraserWidth = 50; var eraserHeight = 100; $( '#chalkboard' ).css( 'cursor' , 'none' ); document.onselectstart = function (){ return false ; }; ctx.fillStyle = 'rgba(255,255,255,0.5)' ; ctx.strokeStyle = 'rgba(255,255,255,0.5)' ; ctx.lineWidth = brushDiameter; ctx.lineCap = 'round' ; var patImg = document.getElementById( 'pattern' ); document.addEventListener( 'touchmove' , function (evt) { var touch = evt.touches[0]; mouseX = touch.pageX; mouseY = touch.pageY; if (mouseY < height && mouseX < width) { evt.preventDefault(); $( '.chalk' ).css( 'left' , mouseX + 'px' ); $( '.chalk' ).css( 'top' , mouseY + 'px' ); //$('.chalk').css('display', 'none'); if (mouseD) { draw(mouseX, mouseY); } } }, false ); document.addEventListener( 'touchstart' , function (evt) { //evt.preventDefault(); var touch = evt.touches[0]; mouseD = true ; mouseX = touch.pageX; mouseY = touch.pageY; xLast = mouseX; yLast = mouseY; draw(mouseX + 1, mouseY + 1); }, false ); document.addEventListener( 'touchend' , function (evt) { mouseD = false ; }, false ); $( '#chalkboard' ).css( 'cursor' , 'none' ); ctx.fillStyle = 'rgba(255,255,255,0.5)' ; ctx.strokeStyle = 'rgba(255,255,255,0.5)' ; ctx.lineWidth = brushDiameter; ctx.lineCap = 'round' ; $(document).mousemove( function (evt){ mouseX = evt.pageX; mouseY = evt.pageY; if (mouseY<height && mouseX<width){ $( '.chalk' ).css( 'left' ,(mouseX-0.5*brushDiameter)+ 'px' ); $( '.chalk' ).css( 'top' ,(mouseY-0.5*brushDiameter)+ 'px' ); if (mouseD){ if (eraser){ erase(mouseX,mouseY); } else { draw(mouseX,mouseY); } } } else { $( '.chalk' ).css( 'top' ,height-10); } }); $(document).mousedown( function (evt){ mouseD = true ; xLast = mouseX; yLast = mouseY; if (evt.button == 2){ erase(mouseX,mouseY); eraser = true ; $( '.chalk' ).addClass( 'eraser' ); } else { if (!$( '.panel' ).is( ':hover' )){ draw(mouseX+1,mouseY+1); } } }); $(document).mouseup( function (evt){ mouseD = false ; if (evt.button == 2){ eraser = false ; $( '.chalk' ).removeClass( 'eraser' ); } }); $(document).keyup( function (evt){ if (evt.keyCode == 32){ ctx.clearRect(0,0,width,height); layPattern(); } }); $(document).keyup( function (evt){ if (evt.keyCode == 83){ changeLink(); } }); document.oncontextmenu = function () { return false ;}; function draw(x,y){ ctx.strokeStyle = 'rgba(255,255,255,' +(0.4+Math.random()*0.2)+ ')' ; ctx.beginPath(); ctx.moveTo(xLast, yLast); ctx.lineTo(x, y); ctx.stroke(); // Chalk Effect var length = Math.round(Math.sqrt(Math.pow(x-xLast,2)+Math.pow(y-yLast,2))/(5/brushDiameter)); var xUnit = (x-xLast)/length; var yUnit = (y-yLast)/length; for ( var i=0; i<length; i++ ){ var xCurrent = xLast+(i*xUnit); var yCurrent = yLast+(i*yUnit); var xRandom = xCurrent+(Math.random()-0.5)*brushDiameter*1.2; var yRandom = yCurrent+(Math.random()-0.5)*brushDiameter*1.2; ctx.clearRect( xRandom, yRandom, Math.random()*2+2, Math.random()+1); } xLast = x; yLast = y; } function erase(x,y){ ctx.clearRect (x-0.5*eraserWidth,y-0.5*eraserHeight,eraserWidth,eraserHeight); } $( '.link' ).click( function (evt){ $( '.download' ).remove(); var imgCanvas = document.createElement( 'canvas' ); var imgCtx = imgCanvas.getContext( "2d" ); var pattern = imgCtx.createPattern(patImg, 'repeat' ); imgCanvas.width = width; imgCanvas.height = height; imgCtx.fillStyle = pattern; imgCtx.rect(0,0,width,height); imgCtx.fill(); var layimage = new Image; layimage.src = canvas.toDataURL( "image/png" ); setTimeout( function (){ imgCtx.drawImage(layimage,0,0); var compimage = imgCanvas.toDataURL( "image/png" ); //.replace('image/png','image/octet-stream'); $( '.panel' ).append( '<a href="' +compimage+ '" download="chalkboard.png" class="download">Download</a>' ); $( '.download' ).click( function (){ IEsave(compimage); }); }, 500); }); function IEsave(ctximage){ setTimeout( function (){ var win = window.open(); $(win.document.body).html( '<img src="' +ctximage+ '" name="chalkboard.png">' ); },500); } $(window).resize( function (){ chalkboard(); }); } |
Chalkboard黑板特效的github地址为:https://github.com/mmoustafa/Chalkboard
网盘下载密码:dvf9