概述
Velocity 是一個簡單易用、高性能、功能豐富的輕量級JS動畫庫。它能和 jQuery 完美協作,並和$.animate()有相同的 API, 但它不依賴 jQuery,可單獨使用。 Velocity 不僅包含了 $.animate() 的全部功能, 還擁有:顏色動畫、轉換動畫(transforms)、循環、 緩動、SVG 動畫、和 滾動動畫 等特色功能。
它比 $.animate() 更快更流暢,性能甚至高於 CSS3 animation, 是 jQuery 和 CSS3 transition 的最佳組合,它支持所有現代瀏覽器,最低可兼容到 IE8 和 Android 2.3。
Velocity 目前已被數以千計的公司使用在自己的項目中,包括 WhatsApp, Tumblr, Windows, Samsung, Uber 等,這里 Libscore.com 統計了哪些站點正使用 velocity.js。
英文官網:http://velocityjs.org/下載 Velocity.js
先來看第一個 Velocity 的例子:
<body> <!-- dom --> <div class="element"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.5.0/velocity.min.js"></script> </body>
// 標准寫法 // (為了簡潔,后面的示例代碼中 將直接使用 $element 來代替 jQuery 選擇器) $(".element").velocity({ left: "200px" }, { duration: 450, delay: 1000 }); // $.animate() 的寫法,效果同上 $(".element").delay(1000).velocity({left: "200px"}, 450);
你可以通過 npm 或 bower 安裝 Velocity:
npm:npm install velocity-animate
bower:bower install velocity
Basics 基礎用法
1. Dependencies 模塊依賴
1-1. Velocity 不依賴 jQuery
Velocity.js 可以在不引入 jQuery 的情況下單獨使用。如果 你需要大部分動畫效果能兼容 IE8,就必須引入 jQuery 1×。 它也可以和 Zepto 一起使用,寫法和 jQuery 一樣:
// 無 jQuery 或 Zepto 時,Velocity()方法掛載在 window 對象上 (window.velocity) // ( 第一個參數為原生js的dom選擇器 ) Velocity(document.getElementById("dummy"), { opacity: 0.5 }, { duration: 1000 }); // 使用 jQuery 或 Zepto 時 $("#dummy").velocity({ opacity: 0.5 }, { duration: 1000 });
1-2. 模塊加載器:Webpack, Browserify
使用 jQuery 時,必須在 Velocity 之前加載 jQuery:
window.jQuery = window.$ = require("path/to/jquery-x.x.x.js"); require("path/to/velocity.js"); require("path/to/velocity.ui.js"); // velocity.ui 在 velocity 之后加載 /* Your app code here. */ $("body").velocity({ opacity: 0.5 });
不使用 jQuery 就直接加載 Velocity:
var Velocity = require("path/to/velocity.js"); require("path/to/velocity.ui.js"); /* Your app code here. */ Velocity(document.body, { opacity: 0.5 });
1-3. 模塊加載器:RequireJS
require.config({ paths: { "jquery": "/path/to/jquery-x.x.x", "velocity": "path/to/velocity", // 如果你使用了 velocity.ui "velocity-ui": "path/to/velocity.ui" }, shim: { "velocity": { deps: [ "jquery" ] }, // velocity.ui 依賴 velocity "velocity-ui": { deps: [ "velocity" ] } } }); require([ "jquery", "velocity", "velocity-ui" ], function ($, Velocity) { /* Your app code here. */ $("body").velocity({ opacity: 0.5 }); });
2. Arguments 參數
2-1. 參數概述和基礎寫法:
Velocity 接收一組 css 屬性鍵值對 (css map) 作為它的第一個參數,該參數作為動畫效果的最終屬性。第二個參數是可選參數 為動畫的額外配置項。下面為參數的寫法:
$element.velocity({
width: "500px", // 動畫屬性 寬度到 "500px" 的動畫 property2: value2 // 屬性示例 }, { /* Velocity 動畫配置項的默認值 */ duration: 400, // 動畫執行時間 easing: "swing", // 緩動效果 queue: "", // 隊列 begin: undefined, // 動畫開始時的回調函數 progress: undefined, // 動畫執行中的回調函數(該函數會隨着動畫執行被不斷觸發) complete: undefined, // 動畫結束時的回調函數 display: undefined, // 動畫結束時設置元素的 css display 屬性 visibility: undefined, // 動畫結束時設置元素的 css visibility 屬性 loop: false, // 循環 delay: false, // 延遲 mobileHA: true // 移動端硬件加速(默認開啟) });
2-2. 單一對象的參數寫法:
Velocity 也支持 single-argument 的語法,看下面示例:
$element.velocity({
properties: { opacity: 1 }, options: { duration: 500 } }); // 或者: $element.velocity({ p: { opacity: 1 }, // 可以將 properties 簡寫成 p o: { duration: 500 } });
2-3. 逗號分割的參數寫法(類似 $.animate):
$element.velocity({ top: 50 }, 1000); $element.velocity({ top: 50 }, 1000, "swing"); $element.velocity({ top: 50 }, "swing"); $element.velocity({ top: 50 }, 1000, function() { alert("Hi"); });
3. Properties Map 動畫屬性
如果不寫屬性值的單位, Velocity 會將像素(px)作為默認單位
// 等同 padding: 1px $element.velocity({ padding: 1 }); // 等同 padding-left: 1px, padding-right: 1px $element.velocity({ paddingLeft: 1, paddingRight: 1 }); // 但你不能這樣寫!因為這樣相當於為 padding 賦了多個值 $element.velocity({ padding: "1 1 1 1" }); // error
Velocity 在 1.2.0+ 版本里增加了對 "px, em, rem, %, deg, vw/vh" 這些單位的支持, 如果不填寫屬性單位 默認單位還是"px",但 "deg" 用於 rotateZ 屬性時可以省略不寫。 Velocity 還支持動態計算屬性值,包括 "+, -, *, /",還可以設置元素在動畫執行前的初始值,看下面示例:
( 注意:"rem" 只支持 IE9+,"vh/vw" 只支持 IE9+ 和 Android 4.4+ )
$element.velocity({
top: 50, // 等同於 "50px" left: "50%", width: "+=5rem", // 每次在當前值上疊加 5rem height: "*=2" // 每次在當前值上疊乘 2 color: ["#888", "#000"] // 每次動畫執行前,color 的初始值都為"#000"(從"#000"過渡成"#888") });
4. Chaining 鏈式動畫
當一個元素連續應用多個velocity()時,動畫將以隊列的方式執行:
$element
/* 先執行寬度變為75px的動畫 */ .velocity({ width: 75 }) /* 等前面的寬度動畫結束后,再執行高度變為0的動畫 */ .velocity({ height: 0 });