摘要:根據瀏覽器設備的繪制限制來更新動畫,回調的次數常是每秒次。鼠標移入則停止自動改變樹枝狀態,轉為由鼠標的橫縱坐標控制。基本的深拷貝方法數組,等方法,新增運算符對象思路是把對象拆開分別賦值,同樣可以使用新增運算符,循環等。
canvas動畫
???????動畫的形成:先畫出一幅圖,改變其中的一些參數,重新繪制圖片...不斷的重復形成動畫。
fillStyle:設置或返回填充繪畫的顏色,漸變或模式
strokeStyle:設置或返回用于筆觸的顏色,漸變或模式
fill(): 填充當前路徑(如果路徑未關閉則會從路徑結束點到開始點之間添加一條線)
stroke():繪制已定義的路徑。
moveTo():把路徑移動到畫布中的指定點,不創建線條
beginPath():起始一條路徑或重置當前路徑
closePath():創建從當前點回到起始點的路徑
lineTo():添加一個新點,創建一條連接至該點的線條
clearRect():清除指定矩形內的像素
arc():創建弧或曲線
rotate():創建兩點之間的弧或曲線
translate():重新映射畫布上的(0,0)位置
drawImage():繪制圖像、畫布或視頻
save():保存當前環境狀態
restore():返回之前保存過的路徑和狀態
getContext():返回一個用于在畫布上繪圖的環境
requestAnimationFrame():回調例程調用 requestAnimationFrame()。根據瀏覽器設備的繪制限制,來更新動畫,回調的次數常是每秒60次。
canvas學習——樹鏡創建一個類,實例化根元素,遞歸創建分支直到層數,每層分支長度(length)遞減,直至層數>=5;
調用drawBranch生成一張圖片
改變樹枝展開角度以及位置執行requestA nimationFrame();重復執行;形成動畫
將12個不同旋轉角度的動畫canvas添加到canvas2.圍成一圈。
鼠標移入則停止自動改變樹枝狀態,轉為由鼠標的橫縱坐標控制。
class Branch { /** * 分枝類,以下為參數,都帶有默認值 * 位置 position * 長度 length * 分支位置 divergeAt * 展開角度 angle * 層數 depth * 分支展開角度變化量 spread */ constructor(position = {x : 0, y: 0}, length = 100, divergeAt = 0.5, angle = 0, depth = 0, spread = 45 * TO_RADIAN) { this.position = position; this.length = length; this.divergeAt = divergeAt; this.angle = angle; this.depth = depth; this.color = "#000"; this.spread = spread; this.branches = []; this.grow(); } grow() { /** * 創建分支,如果canBranch = true(未達到最大分支數量) * 新分支長度為父級的0.75,深度加1 * 展開角度變化spread * 由于構造方法中調用了grow方法,所以會不斷重復創建上述過程 */ if (!this.canBranch) { return; } this.branches = []; const nextLength = this.length * 0.75; const nextDepth = this.depth + 1; this.branches.push( new Branch( this.growPosition, nextLength, this.divergeAt, this.angle + this.spread, nextDepth, this.spread ), new Branch( this.growPosition, nextLength, this.divergeAt, this.angle - this.spread, nextDepth, this.spread ) ); } update(spread, divergeAt) { this.spread = spread; this.divergeAt = divergeAt; this.grow(); } get growPosition() { const dl = this.length * this.divergeAt; return { x: this.position.x + (Math.cos(this.angle) * dl), y: this.position.y + (Math.sin(this.angle) * dl), }; } get canBranch() { return this.depth < maxDepth; } }
/** * 保存當前狀態 * 根據branch類中的數據畫圖(顏色,直線和圓點) * 遞歸對分支進行繪圖 */ const drawBranch = (branch, phase) => { const h = ~~(200 + (160 * phase)); const l = 50 + ~~(((branch.depth / (maxDepth + 1))) * 50); const endX = branch.length; const endY = 0; const r = 2; ctx.save(); ctx.strokeStyle = `hsl(${h}, 100%, ${l}%)`; ctx.translate(branch.position.x, branch.position.y); ctx.rotate(branch.angle); ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(endX, endY); ctx.stroke(); ctx.closePath(); ctx.beginPath(); ctx.fillStyle = `hsl(${h}, 100%, 50%)`; ctx.arc(endX, endY, r, 0, PI * 2, false); ctx.fill(); ctx.closePath(); ctx.restore(); branch.branches.forEach((b) => { drawBranch(b, phase); }); };
const loop = () => { /** * 改變類中參數的值 * 將第一個canvas添加到在第二個canvas中循環12次每次旋轉2PI/12的角度,形成一個環狀 * 調用requestAnimationFrame() 重新根據類中的數據畫圖 */ let phase = rootBranch.spread / maxSpread; clear(phase); if (autoAnimate) { phase = map(Math.sin(autoTick), -1, 1, 0, 1); spread = phase * maxSpread; divergeAt = map(Math.sin(autoTick), -1, 1, 0, 0.5); autoTick += autoSpeed; } rootBranch.update(spread, divergeAt); drawBranch(rootBranch, phase); const numSegments = 12; const angleInc = PI * 2 / numSegments; let angle = tick; for (let i = 0; i < numSegments; i++) { ctx2.save(); ctx2.translate(midX, midY); ctx2.rotate(angle); ctx2.drawImage(canvas, -w / 2, -h / 2); ctx2.restore(); angle += angleInc; } tick += 0.002; requestAnimationFrame(loop); };element-ui 安裝
npm安裝: npm i element-ui -s
cdn
引入import ElementUI from "element-ui"; import "element-ui/lib/theme-chalk/index.css"; Vue.use(ElementUI);
需要安裝 babel-plugin-component:
npm install babel-plugin-component -D
在.babelrc中添加:
"plugins": [ "transform-vue-jsx", "transform-runtime", [ "component", { "libraryName": "element-ui", "styleLibraryName": "theme-chalk" } ] ]
import {Loading, Tabs, TabPane,} from "element-ui"; Vue.use(Loading); Vue.use(Tabs); Vue.use(TabPane);自定義主題 在項目中直接改變scss變量
/* 改變主題色變量 */ $--color-primary: teal; /* 改變 icon 字體路徑變量,必需 */ $--font-path: "~element-ui/lib/theme-chalk/fonts"; @import "~element-ui/packages/theme-chalk/src/index";命令行主題工具
npm i element-theme -g
之后步驟為:
安裝主題
初始化變量文件
修改變量
編譯成css
引入
JavaScript 對象的深拷貝???????在星盤改版的時候遇到了相關的問題,數據從父組件傳遞到子組件,當時沒考慮到這方面的問題,只是對數據進行了一層的拷貝,因為當時傳進來的數據是有很多層的,所以還是會導致源數據改變。所以總結一下,寫成一個方法,這個應該會比較常用。
???????Object屬于引用類型,對它進行簡單賦值(obj1 = obj2)的話只是創建一個指針指向原數據的地址,改變它的值也會改變源數據的值,會造成很多問題。
基本的深拷貝方法concat,slice 等方法,es6 新增運算符‘...’
思路是把對象拆開分別賦值,同樣可以使用es6 新增運算符‘...’,for循環等。
深拷貝的實現運用遞歸逐層拷貝。
function depCopy(obj){ let value; if(typeof obj === "object"){ if(Object.prototype.toString.call(obj).slice(8,-1)==="Array"){ // debugger; value = []; for(let i = 0, length = obj.length; i
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94178.html
摘要:相關頻道最后的坦白最后我得承認這一次我又標題黨了無非是想吸引更多前端初學者進來,希望大家都能少走一些彎路,也希望那些從零開始自學前端的同學更有勇氣去面對自己的選擇。 我是怎么走上前端開發這條路? 首先,我是個文科生,大學里只學過vb,覺得計算機編程這東西太玄乎,不是我玩得轉的。 后來機緣巧合去做了一家互聯網創業公司的HR,閱了上千份程序員的簡歷,面了上百個不同水平不同領域的程序員。跟程...
摘要:官方資料微信公眾平臺注冊小程序。官網開發文檔社區開發工具部署微信小程序微信小程序本身不需要部署,在微信開發工具中直接上傳代碼就行。 為什么 學習 Java 三年,目前已經工作了2年,因為自學,基礎差,所以打算年末總結一下常見的基礎知識和面試點; 也可以通過獨立做一個項目整合自己工作期間學習的知識,加深印象。 但是想著回家或是平時手機用的多,做一款APP和小程序很方便查看。 項目展示 本...
摘要:在有了基礎之后,進一步學習內容包括框架。前端學習交流群禁止閑聊,非喜勿進。代碼提交前必須做的三個事情檢查所有變更跑一邊單元測試手動運行一遍所有 網站開發開發大致分為前端和后端,前端主要負責實現視覺和交互效果,以及與服務器通信,完成業務邏輯。其核心價值在于對用戶體驗的追求。可以按如下思路學習系統學習: 基礎知識: html + css 這部分建議在?w3school 在線教程上學習,邊...
摘要:在有了基礎之后,進一步學習內容包括框架。前端學習交流群禁止閑聊,非喜勿進。代碼提交前必須做的三個事情檢查所有變更跑一邊單元測試手動運行一遍所有 網站開發開發大致分為前端和后端,前端主要負責實現視覺和交互效果,以及與服務器通信,完成業務邏輯。其核心價值在于對用戶體驗的追求。可以按如下思路學習系統學習: 基礎知識: html + css 這部分建議在?w3school 在線教程上學習,邊...
閱讀 1467·2021-11-22 14:44
閱讀 2846·2021-11-16 11:44
閱讀 3213·2021-10-13 09:40
閱讀 1986·2021-10-08 10:04
閱讀 2368·2021-09-24 10:28
閱讀 2911·2021-09-06 15:02
閱讀 2962·2019-08-30 15:52
閱讀 2396·2019-08-30 13:20