1. 程式人生 > >簡單的 canvas 翻角效果

簡單的 canvas 翻角效果

狀態 返回 math hid key cde 圖形 -s ria

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <style>
    .container:before {
    content: 
""; position: absolute; left: 50px; top: 0; width: 1px; height: 102px; background: #fff; } .container:after { content: ""; position: absolute; left: 0px; top: 50px; width: 102px; height: 1px; background: #fff; } .container { background: #abcdef; display: inline
-block; font-size: 0; position: relative; } </style> </head> <body> <div class="container"> <canvas class="myCanvas" width="100" height="100"></canvas> </div> <script> var canvas = document.querySelector(.myCanvas
); //獲取canvas對應dom // var ctx = canvas.getContext(‘2d‘); //此方法較為基礎 , 意為獲取canvas繪畫2d內容的工具(上下文) // var cw = 100; //分辨率 , 其實直接從dom上獲取可能更好些 // var ch = 100; //分辨率 , 其實直接從dom上獲取可能更好些 //API //保存上下文狀態 (比如畫筆尺寸 顏色 旋轉角度) // ctx.save() //返回上次保存的上下文狀態 //ctx.restore() //上下文移動到具體位置 //ctx.moveTo(x,y) //上下文以劃線的形式移動到某位置 //ctx.lineTo(x,y) // 畫線動作 //ctx.stroke() //上下文(畫筆)按貝塞爾曲線移動(簡單理解為可控的曲線即可) //ctx.quadraticCurveTo() //畫圓 //ctx.arc() //開啟新的畫筆路徑 //ctx.beginPath() //關閉當前畫筆路徑 //ctx.closePath() //創建canvas漸變對象 //ctx.createLinearGradient() //對閉合區域進行填充 //ctx.fill() //畫筆的重疊模式 //ctx.globalCompositeOperation /** 首先是繪制黑色翻出的部分 , 圖形分解為如下幾部分(請根據上圖腦補) 左上角向右下的半弧 ╮ 然後是豎直向下的豎線 | 然後是向右的半圓 ╰ 再然後是向右的橫線 接著還是向右下的半弧 ╮ 最後是將線連接會起點 **/ var canvas = document.querySelector(.myCanvas); var ctx = canvas.getContext(2d); var cw = 100; var ch = 100; var percent = 0; var points = { x1 : 100, y1 : 0, x2 : 100, y2 : 0 } var speed = 1; var aSpeed = 0.1; ctx.moveTo(0,0); ctx.strokeStyle = black; ctx.strokeWidth= 1; ctx.save(); var deg = Math.PI / 180; function start(type){ if(type === show){ points = { x1 : 100, y1 : 0, x2 : 100, y2 : 0 } aSpeed = .1; speed = 1; }else{ points = { x1 : 50, y1 : 0, x2 : 100, y2 : 50 } aSpeed = -.1; speed = -1; } draw(points , type); } function draw(points , type){ var disX = Math.floor(points.x2 - points.x1); var disY = Math.floor(points.y2 - points.y1); if(disY < 0 && type == hide){ // console.log(‘改展開動畫了‘); ctx.clearRect(0,0,cw,ch); setTimeout(function(){ start(show); } , 2000) return ; }else if(disY > 50 && type == show){ // console.log(‘改收起動畫了‘); setTimeout(function(){ start(hide); } , 2000) return ; } ctx.clearRect(0,0,cw,ch); drawPageCorShow(points , disX , disY); drawPageCor(points, disX , disY); window.requestAnimationFrame(function(){ draw(points , type); }) } function drawPageCorShow(points, disX , disY){ ctx.save(); ctx.beginPath(); //閉合三角形 ctx.moveTo(points.x1 , points.y1); ctx.lineTo(points.x2 , points.y2); ctx.lineTo(points.x2 , points.y1); ctx.lineTo(points.x1 , points.y1); ctx.closePath(); ctx.strokeStyle = "#080"; ctx.stroke(); ctx.fillStyle = #ff6600; ctx.fill(); //重疊模式 ctx.globalCompositeOperation = source-atop; ctx.beginPath(); ctx.font = 14px Arial; ctx.textAlign = center; ctx.translate(78 , 22); ctx.rotate(45 * deg); ctx.fillStyle = #fff; ctx.fillText(NEW , 0 , 0); ctx.closePath(); ctx.restore(); } function drawPageCor(points, disX , disY){ ctx.save(); ctx.beginPath(); //移動到位置 左上 ctx.moveTo(points.x1,points.y1); //畫第一個曲線 ctx.quadraticCurveTo(points.x1 + (disX/10),points.y1 + disY/10 ,(points.x1 + disX/10),points.y1 + disY/2); //直線向下 ctx.lineTo(points.x1 + disX / 10 , points.y2 - (disY/5)); //半圓向右 ctx.arc(points.x1+disX/5,points.y2 - (disY/5),disY/10,deg*180 , deg*90,true); // 直線向右 ctx.lineTo(points.x2 - disX/2 , points.y2 - (disY / 10)) //曲線向右 ctx.quadraticCurveTo(points.x2 -disX/10,points.y2 - (disY/10) ,points.x2,points.y2 ); //閉合圖形 ctx.lineTo(points.x1,points.y1); ctx.closePath(); var gradient = ctx.createLinearGradient(points.x1 , points.y2 , points.x1 + (disX/2) , points.y1 + disY/2); gradient.addColorStop(0 , #ccc); gradient.addColorStop(0.7 , #111); gradient.addColorStop(1 , #000); ctx.fillStyle = gradient; ctx.fill(); ctx.restore(); //更新速度位置 points.x1 -= speed; points.y2 += speed; speed += aSpeed; } start(show); </script> </body> </html>

原文地址:http://web.jobbole.com/93229/

簡單的 canvas 翻角效果