JavaScript字串動畫輪播效果
分享一段程式碼例項,它利用js實現了字串動畫輪播效果。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> html, body { background: #212121; height: 100%; } .container { height: 100%; width: 100%; justify-content: center; align-items: center; display: flex; } .text { font-weight: 100; font-size: 50px; color: #FAFAFA; } .dud { color: #757575; } </style> <script> class TextScramble { constructor(el) { this.el = el; this.chars = '!<>-_\\/[]{}—=+*^?#________'; this.update = this.update.bind(this); } setText(newText) { const oldText = this.el.innerText; const length = Math.max(oldText.length, newText.length); const promise = new Promise((resolve) => this.resolve = resolve); this.queue = []; for (let index = 0; index < length; index++) { const from = oldText[index] || ''; const to = newText[index] || ''; const start = Math.floor(Math.random() * 40); const end = start + Math.floor(Math.random() * 40); this.queue.push({ from, to, start, end }); } cancelAnimationFrame(this.frameRequest); this.frame = 0; this.update(); return promise; } update() { let output = ''; let complete = 0; for (let index = 0, n = this.queue.length; index < n; index++) { let { from, to, start, end, char } = this.queue[index]; if (this.frame >= end) { complete++; output += to; } else if (this.frame >= start) { if (!char || Math.random() < 0.28) { char = this.randomChar(); this.queue[index].char = char; } output += `<span class="dud">${char}</span>`; } else { output += from; } } this.el.innerHTML = output; if (complete === this.queue.length) { this.resolve(); } else { this.frameRequest = requestAnimationFrame(this.update); this.frame++; } } randomChar() { return this.chars[Math.floor(Math.random() * this.chars.length)]; } } window.onload=function(){ const phrases = [ '螞蟻部落', 'css教程', 'js教程', 'softwhy.com', '努力奮鬥', 'json教程' ]; const el = document.querySelector('.text'); const fx = new TextScramble(el); let counter = 0; const next = () => { fx.setText(phrases[counter]).then(() => { setTimeout(next, 800) }) counter = (counter + 1) % phrases.length; } next() } </script> </head> <body> <div class="container"> <div class="text"></div> </div> </body> </html>
上面的程式碼實現了我們的要求,下面介紹一下它的實現過程。
程式碼註釋:
(1).class TextScramble {}建立一個類。
(2).constructor(el) {
this.el = el;
this.chars = '!<>-_\\/[]{}—=+*^?#________';
this.update = this.update.bind(this);
},類的建構函式,能夠初始化一些值。
this.update = this.update.bind(this),這個的目的是為了固定函式的this指向,不管其他地方怎麼呼叫update()方法, update()內部的this都是指向當前的那個例項物件。
(3).setText(newText) {},宣告一個原型上的方法,引數是一個語句。
(4).const oldText = this.el.innerText,獲取當前元素的文字內容。
(5).const length = Math.max(oldText.length, newText.length),獲取當前元素字串和新傳入字串的最大長度。
(6).const promise = new Promise((resolve) => this.resolve = resolve),建立一個promise物件例項,後面會用到,之所以將resove方法賦值給this.resolve,是為了在可以在其他地方用例項物件來呼叫此方法。
(7).this.queue = [],建立一個陣列,後面會用到。
(8).for (let index = 0; index < length; index++) {
const from = oldText[index] || '';
const to = newText[index] || '';
const start = Math.floor(Math.random() * 40);
const end = start + Math.floor(Math.random() * 40);
this.queue.push({ from, to, start, end });
}通過for迴圈來為陣列新增元素,下面分步介紹一下:
const from = oldText[index] || '';
const to = newText[index] || '';
原來的文字和新傳入的不一定哪個更長,index有可能會超出,所以如果超出就賦值給空字元。
(9).const start = Math.floor(Math.random() * 40);
const end = start + Math.floor(Math.random() * 40);
40這個數字沒有特別的邏輯,也可以是其他數字,生成一個起始值和結束值。
(10).this.queue.push({ from, to, start, end }),將物件壓入陣列。
(11).cancelAnimationFrame(this.frameRequest),取消上一個動畫的執行。
(12).this.frame = 0,賦值為0,後面會用到。
(13).this.update(),呼叫update()方法。
(14).return promise,返回promise物件。
(15).update() {},此函式是實現動畫變換的核心。
(16).let output = '',宣告一個變數,用儲存輸出新顯示的語句。
(17).let complete = 0,宣告一個變數並賦初值為0,後面會用到。
(18).for (let index = 0, n = this.queue.length; index < n; index++) {
let { from, to, start, end, char } = this.queue[index];
if (this.frame >= end) {
complete++;
output += to;
} else if (this.frame >= start) {
if (!char || Math.random() < 0.28) {
char = this.randomChar();
this.queue[index].char = char;
}
output += `<span class="dud">${char}</span>`;
} else {
output += from;
}
}
雖然程式碼看起來比較多,其實邏輯很簡單。
this.frame剛開始是0並且能夠累加,剛開始有很大的概率是小於end,所以就會執行後面兩個if語句分支的程式碼,於是就會出現展現原來字串內容和chars所規定的特殊的字元效果;隨著this.frame累加,最終會大於等於end,那麼output中的字元只有新的陣列字元。
(19).this.el.innerHTML = output,在文件中顯示指定字串。
(20).if (complete === this.queue.length) {
this.resolve();
} else {
this.frameRequest = requestAnimationFrame(this.update);
this.frame++;
},如果if (complete === this.queue.length)成立,那麼說明新字串組合完畢,比如"螞蟻部落"連線完整。
那麼就執行this.resolve()方法,改變promise的狀態。
否則繼續動畫的執行。
相關文章
- 雙輪播加切換動畫效果元件動畫元件
- JavaScript焦點圖輪播效果詳解JavaScript
- javascript實現的焦點圖輪播效果詳解JavaScript
- Axure實現輪播效果
- jQuery實現輪播效果jQuery
- CSS動畫之旋轉魔方輪播CSS動畫
- JavaScript元素動畫效果JavaScript動畫
- 縮放效果的輪播圖 iOSiOS
- 輪播圖(JavaScript定時器)JavaScript定時器
- 原生JS實現輪播圖的效果JS
- JavaScript 簡單動畫效果JavaScript動畫
- JavaScript 動畫效果例項JavaScript動畫
- Javascript實現動畫效果JavaScript動畫
- 一對一直播系統原始碼,軟體首頁輪播圖輪播效果原始碼
- jQuery打造淘寶展示效果和淘寶輪播圖jQuery
- Android UI 實現廣告 Banner 輪播效果AndroidUI
- JavaScript簡單的動畫效果JavaScript動畫
- jQuery輪播圖之上下輪播jQuery
- 教你如何實現 Android TextView 文字輪播效果AndroidTextView
- WEB機試題--最大透明度輪播效果Web
- 視覺差緩動效果的輪播--React版視覺React
- Vue實現內部元件輪播切換效果Vue元件
- Android自定義View實現文字輪播效果AndroidView
- AndroidApp圖片輪播效果的元件化AndroidAPP元件化
- 用JavaScript實現動畫效果 (轉)JavaScript動畫
- JS實現輪播圖效果(有詳細註釋)JS
- 直播平臺開發,使用swiper實現輪播效果
- 直播app開發,首頁輪播圖效果實現APP
- javascript字串大小寫轉換效果JavaScript字串
- JavaScript教程全套影片合集:DOM動畫效果JavaScript動畫
- javascript實現文字拼寫動畫效果JavaScript動畫
- js、jQuery實現文字上下無縫輪播、滾動效果JSjQuery
- 網站首頁的輪播新聞flash效果實現網站
- android圖片輪播效果,RollViewPager的簡單使用AndroidViewpager
- 原生JS實現輪播圖--第二章動畫實現JS動畫
- TWEEN動畫、JQUERY、ES6 — 3、 輪播圖-左右運動版本動畫jQuery
- 文字輪播與圖片輪播?CSS 不在話下CSS
- JavaScript 動畫效果簡單例項程式碼JavaScript動畫單例