最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js canvas實現寫字動畫效果

 更新時間:2021年04月29日 14:36:22   作者:lucky芬  
這篇文章主要為大家詳細介紹了js canvas實現寫字動畫效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js canvas實現寫字動畫效果展示的具體代碼,供大家參考,具體內容如下

頁面html:

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title>學寫一個字</title>
 <script src="jquery-2.1.3.min.js" type="text/javascript"></script>
 <link href="handwriting.css" rel="stylesheet" type="text/css"/>
 <meta name="viewport"
   content=" height = device-height,
     width = device-width,
     initial-scale = 1.0,
     minimum-scale = 1.0,
     maximum-scale = 1.0,
     user-scalable = no"/> //兼容移動端
 
</head>
<body>
 
 <canvas id="canvas">
  您的瀏覽器不支持canvas
 </canvas>//寫字區(qū)域
 <div id="controller">
  <div id="black_btn" class="color_btn color_btn_selected"></div>
  <div id="blue_btn" class="color_btn"></div>
  <div id="green_btn" class="color_btn"></div>
  <div id="red_btn" class="color_btn"></div>
  <div id="orange_btn" class="color_btn"></div>
  <div id="yellow_btn" class="color_btn"></div>
 
  <div id="clear_btn" class="op_btn">清 除</div>
  <div class="clearfix"></div>
 </div>
 
 <script src = "handwriting.js"></script>
</body>
</html>

頁面css:

#canvas{
 display:block;
 margin:0 auto;
}
#controller{
 margin:0 auto;
}
.op_btn{
 float: right;
 margin:10px 0 0 10px;
 border:2px solid #aaa;
 width:80px;
 height:40px;
 line-height:40px;
 font-size:20px;
 text-align:center;
 border-radius: 5px 5px;
 cursor:pointer;
 background-color: white;
 font-weight:bold;
 font-family: Microsoft Yahei, Arial;
}
.op_btn:hover{
 background-color:#def;
}
.clearfix{
 clear:both;
}
 
.color_btn{
 float: left;
 margin: 10px 10px 0 0;
 border:5px solid white;
 width:40px;
 height:40px;
 border-radius: 5px 5px;
 cursor:pointer;
}
.color_btn:hover{
 border: 5px solid violet;
}
.color_btn_selected{
 border: 5px solid blueviolet;
}
#black_btn{
 background-color: black;
}
#blue_btn{
 background-color: blue;
}
#green_btn{
 background-color: green;
}
#red_btn{
 background-color: red;
}
#orange_btn{
 background-color: orange;
}
#yellow_btn{
 background-color: yellow;
}

頁面js:

var canvasWidth = Math.min( 800 , $(window).width() - 20 );//如果屏幕小于800px,則取值為屏幕大小寬度,便于移動端的展示,-20是為了使得米字格不緊貼于邊緣
var canvasHeight = canvasWidth;
 
var strokeColor = "black";
var isMouseDown = false; //鼠標按下時候的狀態(tài)
var lastLoc = {x:0,y:0}; //鼠標上一次結束時的位置
var lastTimestamp = 0; //上一次時間,與筆刷粗細有關
var lastLineWidth = -1; //筆刷粗細
 
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
 
canvas.width = canvasWidth;
canvas.height = canvasHeight;
 
$("#controller").css("width",canvasWidth+"px");
drawGrid();//畫米字格
 
$("#clear_btn").click(
 function(e){
  context.clearRect( 0 , 0 , canvasWidth, canvasHeight );
  drawGrid();
 }
)
$(".color_btn").click(
 function(e){
  $(".color_btn").removeClass("color_btn_selected");
  $(this).addClass("color_btn_selected");
  strokeColor = $(this).css("background-color");
 }
)
//適用于移動端觸控
function beginStroke(point){
 
 isMouseDown = true
 //console.log("mouse down!");
 lastLoc = windowToCanvas(point.x, point.y); //上一次坐標位置
 lastTimestamp = new Date().getTime();
 
}
function endStroke(){
 isMouseDown = false;
}
function moveStroke(point){
 
 var curLoc = windowToCanvas( point.x , point.y );
 var curTimestamp = new Date().getTime();
 var s = calcDistance( curLoc , lastLoc );
 var t = curTimestamp - lastTimestamp;
 
 var lineWidth = calcLineWidth( t , s );
 
 //draw
 context.beginPath();
 context.moveTo( lastLoc.x , lastLoc.y );
 context.lineTo( curLoc.x , curLoc.y );
 
 context.strokeStyle = strokeColor;
 context.lineWidth = lineWidth;
 context.lineCap = "round";
 context.lineJoin = "round";
 context.stroke();
 
 lastLoc = curLoc;
 lastTimestamp = curTimestamp;
 lastLineWidth = lineWidth;
}
 
canvas.onmousedown = function(e){
 e.preventDefault();
 beginStroke( {x: e.clientX , y: e.clientY} );
};
canvas.onmouseup = function(e){
 e.preventDefault();
 endStroke();
};
canvas.onmouseout = function(e){
 e.preventDefault();
 endStroke();
};
canvas.onmousemove = function(e){
 e.preventDefault();
 if( isMouseDown ){
  moveStroke({x: e.clientX , y: e.clientY})
 }
};
 
canvas.addEventListener('touchstart',function(e){
 e.preventDefault();
 touch = e.touches[0];
 beginStroke( {x: touch.pageX , y: touch.pageY} )
});
canvas.addEventListener('touchmove',function(e){
 e.preventDefault();
 if( isMouseDown ){
  touch = e.touches[0];
  moveStroke({x: touch.pageX , y: touch.pageY});
 }
});
canvas.addEventListener('touchend',function(e){
 e.preventDefault();
 endStroke();
});
 
var maxLineWidth = 30;
var minLineWidth = 1;
var maxStrokeV = 10;
var minStrokeV = 0.1;
function calcLineWidth( t , s ){
 
 var v = s / t;
 
 var resultLineWidth;
 if( v <= minStrokeV )
  resultLineWidth = maxLineWidth;
 else if ( v >= maxStrokeV )
  resultLineWidth = minLineWidth;
 else{
  resultLineWidth = maxLineWidth - (v-minStrokeV)/(maxStrokeV-minStrokeV)*(maxLineWidth-minLineWidth);
 }
 
 if( lastLineWidth == -1 )
  return resultLineWidth;
 
 return resultLineWidth*1/3 + lastLineWidth*2/3;
}
 
function calcDistance( loc1 , loc2 ){
 
 return Math.sqrt( (loc1.x - loc2.x)*(loc1.x - loc2.x) + (loc1.y - loc2.y)*(loc1.y - loc2.y) );
}
 
function windowToCanvas( x , y ){
 var bbox = canvas.getBoundingClientRect();
 return {x:Math.round(x-bbox.left) , y:Math.round(y-bbox.top)}
}
function drawGrid(){
 
 context.save();
 
 context.strokeStyle = "rgb(230,11,9)";
 
 context.beginPath();
 context.moveTo( 3 , 3 );
 context.lineTo( canvasWidth - 3 , 3 );
 context.lineTo( canvasWidth - 3 , canvasHeight - 3 );
 context.lineTo( 3 , canvasHeight - 3 );
 context.closePath();
 context.lineWidth = 6;
 context.stroke();
 
 context.beginPath();
 context.moveTo(0,0);
 context.lineTo(canvasWidth,canvasHeight);
 
 context.moveTo(canvasWidth,0);
 context.lineTo(0,canvasHeight);
 
 context.moveTo(canvasWidth/2,0);
 context.lineTo(canvasWidth/2,canvasHeight);
 
 context.moveTo(0,canvasHeight/2);
 context.lineTo(canvasWidth,canvasHeight/2);
 
 context.lineWidth = 1;
 context.stroke();
 
 context.restore();
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript支持的最大遞歸調用次數分析

    JavaScript支持的最大遞歸調用次數分析

    這篇文章主要介紹了JavaScript支持的最大遞歸調用次數分析,也稱JavaScript支持的最大堆棧數量,需要的朋友可以參考下
    2014-06-06
  • 微信小程序實現答題倒計時

    微信小程序實現答題倒計時

    這篇文章主要為大家詳細介紹了微信小程序實現答題倒計時,自定義計時器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 如何使用big.js解決JavaScript浮點數精度丟失問題

    如何使用big.js解決JavaScript浮點數精度丟失問題

    最近在項目中涉及到金額從元轉為分(乘100即可),發(fā)現乘法居然也會有精度丟失的問題,關于浮點數計算精度丟失是很多語言都存在的問題,本文給大家分享使用big.js解決JavaScript浮點數精度丟失問題,感興趣的朋友一起看看吧
    2023-12-12
  • 在JavaScript中使用for循環(huán)的方法

    在JavaScript中使用for循環(huán)的方法

    這篇文章主要介紹了如何在JavaScript中使用for循環(huán),通過使用JavaScript?for...in循環(huán),我們可以循環(huán)對象的鍵或屬性,在迭代對象屬性或進行調試時,它可能很有用,但在迭代數組或對對象進行修改時,應該避免使用for...in循環(huán),需要的朋友可以參考下
    2022-11-11
  • Js組件的一些寫法

    Js組件的一些寫法

    今天看了rank的一篇javascript腳本控件topic,突然想總結一下一些寫JS組件的方法,或者說一些不同人的不同coding style。
    2010-09-09
  • JS實現旋轉木馬輪播圖

    JS實現旋轉木馬輪播圖

    這篇文章主要為大家詳細介紹了JS實現旋轉木馬輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 讓任務管理器中的CPU跳舞的js代碼

    讓任務管理器中的CPU跳舞的js代碼

    下面的代碼就是利用js控制cpu的占有率,實現時高時低效果
    2008-11-11
  • JS中Iframe之間傳值的方法

    JS中Iframe之間傳值的方法

    在js中,我們時常用到用iframe做系統(tǒng)框架,在子頁面也,父頁面之間的值傳遞是一個問題,下面是js獲取父窗體和子窗體的對象js:
    2013-03-03
  • 在weex中愉快的使用scss的方法步驟

    在weex中愉快的使用scss的方法步驟

    這篇文章主要介紹了在weex中愉快的使用scss的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 微信小程序左滑刪除實現代碼實例

    微信小程序左滑刪除實現代碼實例

    這篇文章主要介紹了微信小程序左滑刪除實現代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論

龙州县| 北辰区| 巨野县| 乐陵市| 乐亭县| 新民市| 房产| 新河县| 锡林浩特市| 清苑县| 印江| 多伦县| 渭南市| 兴业县| 白河县| 平塘县| 同江市| 昭觉县| 绥棱县| 常德市| 临猗县| 灵台县| 尼木县| 夏邑县| 榆树市| 荔浦县| 陈巴尔虎旗| 巴青县| 棋牌| 兴安盟| 威远县| 台北县| 南阳市| 乌什县| 佛冈县| 平泉县| 阳城县| 酉阳| 巨野县| 余干县| 常德市|