摘要:童鞋已經(jīng)造了個(gè)版本。這里很明顯,方案和方案可應(yīng)對(duì)簡(jiǎn)單場(chǎng)景如沒(méi)有回調(diào)等,方案可編程性最大,最靈活,可以適合復(fù)雜的動(dòng)畫場(chǎng)景或者承受復(fù)雜的交互場(chǎng)景。主要是那上面的演示和傳統(tǒng)的直接操作的方式對(duì)比。注釋里已經(jīng)寫了這是優(yōu)化重點(diǎn)。
簡(jiǎn)介
transformjs在非react領(lǐng)域用得風(fēng)生水起,那么react技術(shù)棧的同學(xué)能用上嗎?答案是可以的。junexie童鞋已經(jīng)造了個(gè)react版本。
動(dòng)畫實(shí)現(xiàn)方式傳統(tǒng) web 動(dòng)畫的兩種方式:
純粹的CSS3 :如:transition/animation+transform(大名鼎鼎的animate.css)
JS + CSS3 transition或者animation:這里第一種一樣,只是通過(guò)js里add class和remove class去增加或者移除對(duì)應(yīng)的動(dòng)畫
純粹JS控制時(shí)間軸:第一和第二種都是自帶時(shí)間軸,使用 setInterval / setTimeout / requestAnimationFrame 不斷地修改 DOM 的 style 屬性產(chǎn)生動(dòng)畫
對(duì)應(yīng)在react中:
使用CSS3
使用 ReactCSSTransitionGroup 來(lái)實(shí)現(xiàn)
相關(guān)動(dòng)畫的class都有對(duì)應(yīng)的state,修改state相當(dāng)于增加或者移除class,也就相當(dāng)于js里add class和remove class去增加或者移除對(duì)應(yīng)的動(dòng)畫
純粹JS控制時(shí)間軸
仍然使用 setInterval / setTimeout / requestAnimationFrame,修改某個(gè) state 值,然后映射到 component 的 style 上。
這里很明顯,方案1和方案2可應(yīng)對(duì)簡(jiǎn)單場(chǎng)景(如沒(méi)有prop change 回調(diào)等),方案3可編程性最大,最靈活,可以適合復(fù)雜的動(dòng)畫場(chǎng)景或者承受復(fù)雜的交互場(chǎng)景。
安裝npm install css3transform-reactAPI
//set "translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ" render() { return (); } // you can also use other porps, such as "className" or "style" render() { return ( sthsth
通過(guò)上面的聲明,就可以設(shè)置或者讀取"translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ"!
方便吧!
使用姿勢(shì)import React, { Component } from "react"; import { render } from "react-dom"; import Transform from "../../transform.react.js"; class Root extends Component { constructor(props, context) { super(props, context); this.state = { el1: {rotateZ: 0}, el2: {rotateY: 0} }; this.animate = this.animate.bind(this); } animate() { this.setState({ el1: {rotateZ: this.state.el1.rotateZ + 1}, el2: {rotateY: this.state.el2.rotateY + 1} }, () => { requestAnimationFrame(this.animate); }); } componentDidMount() { setTimeout(this.animate, 500); } render() { return (); } } render(transformjs transformjs , document.getElementById("root") );
更加復(fù)雜的詳細(xì)的使用代碼可以看這里:https://github.com/AlloyTeam/AlloyTouch/blob/master/transformjs/react/example/src/index.jsx
在線演示http://alloyteam.github.io/AlloyTouch/transformjs/react/example/
性能對(duì)比因?yàn)閞eact版本會(huì)有diff過(guò)程,然后apply diff to dom的過(guò)程,state改變不會(huì)整個(gè)innerHTML全部替換,所以對(duì)瀏覽器渲染來(lái)說(shuō)還是很便宜,但是在js里diff的過(guò)程的耗時(shí)還是需要去profiles一把,如果耗時(shí)嚴(yán)重,不在webworker里跑還是會(huì)卡住UI線程導(dǎo)致卡頓,交互延緩等。所以要看一看CPU的耗時(shí)還是很有必要的。
主要是那上面的演示和傳統(tǒng)的直接操作dom的方式對(duì)比。就是下面這種傳統(tǒng)的方式:
var element1 = document.querySelector("#test1"); Transform(element1); ... ... function animate() { element1.rotateZ++; ... requestAnimationFrame(animate); } animate();
對(duì)兩種方式使用chrome profiles了一把。
先看總耗時(shí)對(duì)比:
react:
傳統(tǒng)方式:
react在8739秒內(nèi)CPU耗時(shí)花費(fèi)了近似1686ms
傳統(tǒng)方式在9254ms秒內(nèi)CPU耗時(shí)花費(fèi)近似700ms
在不進(jìn)行profiles就能想象到react是一定會(huì)更慢一些,因?yàn)閟tate的改變要走把react生命周期走一遍,但是可以看到react的耗時(shí)還是在可以接受的范圍。但是,我們還是希望找到拖慢的函數(shù)來(lái)。
那么在使用transformjs react版本中,哪個(gè)函數(shù)拖了后腿?展開(kāi)profiles tree可以看到:
就是它了。
/** * Reconciles the properties by detecting differences in property values and * updating the DOM as necessary. This function is probably the single most * critical path for performance optimization. * * TODO: Benchmark whether checking for changed values in memory actually * improves performance (especially statically positioned elements). * TODO: Benchmark the effects of putting this at the top since 99% of props * do not change for a given reconciliation. * TODO: Benchmark areas that can be improved with caching. * * @private * @param {object} lastProps * @param {object} nextProps * @param {?DOMElement} node */ _updateDOMProperties: function (lastProps, nextProps, transaction) {
打開(kāi)對(duì)應(yīng)的代碼可以看到。注釋里已經(jīng)寫了這是優(yōu)化重點(diǎn)。
開(kāi)始使用吧官方網(wǎng)站:http://alloyteam.github.io/AlloyTouch/transformjs/
Github地址:https://github.com/AlloyTeam/AlloyTouch/tree/master/transformjs
任何問(wèn)題和意見(jiàn)歡迎new issue給我們。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86540.html
摘要:主要更新版本已經(jīng)支持事件回調(diào)了魚(yú)和熊掌兼得慢,什么是魚(yú)什么是熊掌魚(yú),性能。讀取當(dāng)觸發(fā)了之后,會(huì)去清除定時(shí)器。這里需要注意,當(dāng)用戶傳了配置,會(huì)延遲清除定時(shí)器,因?yàn)樾U倪^(guò)程需要。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司師姐昨日在KM發(fā)了篇長(zhǎng)文,主要結(jié)論RAF+transform3d就...
摘要:主要更新版本已經(jīng)支持事件回調(diào)了魚(yú)和熊掌兼得慢,什么是魚(yú)什么是熊掌魚(yú),性能。讀取當(dāng)觸發(fā)了之后,會(huì)去清除定時(shí)器。這里需要注意,當(dāng)用戶傳了配置,會(huì)延遲清除定時(shí)器,因?yàn)樾U倪^(guò)程需要。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司師姐昨日在KM發(fā)了篇長(zhǎng)文,主要結(jié)論RAF+transform3d就...
摘要:前面不短時(shí)間持續(xù)投入了時(shí)間在做應(yīng)用架構(gòu)方面的考量一個(gè)是冒險(xiǎn)進(jìn)行了一次應(yīng)用架構(gòu)的調(diào)整另一個(gè)是跟進(jìn)了的進(jìn)展當(dāng)然實(shí)際上是同一個(gè)事情也許錯(cuò)過(guò)的比收獲的還多一些不過(guò)能走到現(xiàn)在也算幸運(yùn)了畢竟單頁(yè)面應(yīng)用還面臨很多不成熟之處國(guó)慶長(zhǎng)假過(guò)去不少現(xiàn)在的想法估計(jì)會(huì) 前面不短時(shí)間持續(xù)投入了時(shí)間在做 React 應(yīng)用架構(gòu)方面的考量一個(gè)是冒險(xiǎn)進(jìn)行了一次應(yīng)用架構(gòu)的調(diào)整, 另一個(gè)是跟進(jìn)了 Redux 的進(jìn)展當(dāng)然, 實(shí)際...
摘要:擁有兩個(gè)版本,無(wú)依賴的獨(dú)立版和版本。除了對(duì)象,也可監(jiān)聽(tīng)內(nèi)元素的手勢(shì)需要引擎內(nèi)置對(duì)象支持綁定相關(guān)事件。據(jù)不完全統(tǒng)計(jì),目前服務(wù)于興趣部落群動(dòng)漫騰訊學(xué)院騰訊等多個(gè)部門團(tuán)隊(duì)和項(xiàng)目。也可以在事件回調(diào)里根據(jù)攜帶的信息使用去操作。 簡(jiǎn)介 針對(duì)多點(diǎn)觸控設(shè)備編程的Web手勢(shì)組件,快速幫助你的web程序增加手勢(shì)支持,也不用再擔(dān)心click 300ms的延遲了。擁有兩個(gè)版本,無(wú)依賴的獨(dú)立版和react版本。...
摘要:如何用獲取虛擬鍵盤高度前端早讀課月號(hào)早讀文章由湯谷投稿分享。大殺器和把動(dòng)畫轉(zhuǎn)換成原生動(dòng)畫初來(lái)乍到,本文搬運(yùn)自我月份在知乎發(fā)的文章。 前端面試之 CSS3 新特性 除了 HTML5 的新特性,CSS3 的新特性也是面試中經(jīng)常被問(wèn)到的。 如何用 js 獲取虛擬鍵盤高度?-前端早讀課 9月7號(hào)早讀文章由@湯谷投稿分享。正文從這開(kāi)始~ 這是一個(gè)存在很久的歷史問(wèn)題了,對(duì)于這樣一個(gè)具有普遍性的問(wèn)題...
閱讀 600·2021-10-08 10:20
閱讀 1490·2021-09-23 11:22
閱讀 3214·2019-08-30 15:55
閱讀 1581·2019-08-28 18:25
閱讀 1857·2019-08-28 18:14
閱讀 1229·2019-08-26 11:37
閱讀 2893·2019-08-26 10:18
閱讀 2419·2019-08-23 18:39