搜索
首页web前端html教程《ReactJS》读书笔记十四_html/css_WEB-ITnose

使用渐变组的隐患

使用渐变组也有两个隐患需要非常注意的。

首先,渐变组会延迟子组件的移除直到动画完成。也就是说如果你把一个列表的组件包裹进一个 ReactCSSTransitionGroup中,却没有为 transitionName属性指定的 class明确任何 CSS,这些组件将永远无法被移除,甚至当你尝试不再渲染它们时也不可以。

其次,渐变组的每一个子组件都必须设置一个独一无二的 key属性。渐变组使用这个属性来判断组件究竟是进人还是退出,因此如果没有设置 key属性动画可能无法执行,同时组件也会变得无法移除。

注意,即使渐变组只有一个子元素,它也需要设置一个 key属性。

间隔渲染

使用 CSS3 动画能够获得巨大的性能提升并拥有简洁的代码,但它们并不总是解决问题的正确工具。有些时候你必须要为较老的、不支持 CSS3 的浏览器做兼容,还有些时候你想为 CSS 属性之外的东西添加动画,比如滚动条位置或 Canvas绘画。在这些情况下,间隔渲染能够满足我们的要求,但是相比 CSS3 动画来说,它会带来一定的性能损耗。

间隔渲染最基本的思想就是周期性地触发组件的状态更新,以明确当前处于整个动画时间中的什么阶段。通过在组件的 render()方法中加入这个状态值,组件能够在每次状态更新触发的重渲染中正确表示当前的动画阶段。

因为这种方法涉及多次重渲染,所以通常最好和 requestAnimationFrame一起使用以避免不必要的渲染。不过,在 requestAnimationFrame不被支持或不可用的情况下,降级到不那么智能的 setTimeout()就是唯一的选择了。

使用requestAnimationFrame实现间隔渲染

假设你希望使用间隔渲染将一个 div从屏幕的一边移向另一边,可以通过给它添加 position: absolute并随着时间变化不停更新 left或 top属性来实现。根据消耗时间内的变化总量,用 requestAnimationFrame来实现这个动画应该可以得出一个流畅的动画。

下面是具体实现的例子。

var Positioner = React.createClass({	getInitialState: function(){		return {			position: 0		};	},	resolveAnimationFrame: function(){		var timestamp = new Date();		var timeRemaining = Math.max(0, this.props.animationCompleteTimestamp - timestamp);		if (timeRemaining > 0){			this.setState({				position: timeRemaining			});		}	},	componentWillUpdate: function(){		if(this.props.animationCompleteTimestamp){			requestAnimationFrame(this.resolveAnimationFrame);		}	},	render: function(){		var divStyle = {			left: this.state.position		};		return <div style={divStyle}>This will animate!</div>	}});

在这个例子中,组件的 props中设置了一个名为 animationCompleteTimestamp的值,它和 requestAnimationFrame()的回调中返回的时间戳一起被用来计算剩余多少位移。计算的结果存在 this.state.position中,而 render()方法会用它来确定 div的位置。

由于 requestAnimationFrame被 componentWillUpdate()方法调用,所以只要组件的 props有任何的变动(比如改变了 animationCompleteTimestamp)它就会被触发。它又包含了在 resolveAnimationFrame中的 this.setState()调用。这意味着一旦 animationComleteTime-stamp被设置,组件就会自动调用后续的 requestAnimationFrame方法,直到当前时间超过了 animationCompleteTimestamp为止。

注意,这套逻辑只在基于时间戳的清况下成立。对 animationCompleteTimestamp所做的改变会触发逻辑,而 this.state.position的值完全依赖于当前时间与 animationCompleteTime-stamp的差。正因如此, render()方法可以自由地在各种动画中使用 this.state.position,包括设置滚动条位置、在。 Canvas上绘画,以及任何中间状态。

使用setTimeout实现间隔渲染

尽管 requestAnimationFrame总体上能够以最小的性能损耗实现最流畅的动画,但它在较老的浏览器上是无法使用的,而且它被调用的次数可能比你想象的更频繁(也更加无法预)。在这些情况下你可以使用 setTimeout()。

var Positioner = React.createClass({	getInitialState: function(){		return {			position: 0		};	},	resolveSetTimeout: function(){		var timestamp = new Date();		var timeRemaining = Math.max(0, this.props.animationCompleteTimestamp - timestamp);		if (timeRemaining > 0){			this.setState({				position: timeRemaining			});		}	},	componentWillUpdate: function(){		if (this.props.animationCompleteTimestamp){			setTimeout(this.resolveSetTimeout, this.props.timeoutMs);		}	},	render: function(){		var divStyle = {			left: this.state.position		};		return <div style={divStyle}>This will animate!</div>	}});

由于 setTimeout()接受一个显式的时间间隔,而 requestAnimationFrame是自己来决定这个时间间隔的,因此这个组件需要额外依赖一个变量 this.props.timeoutMs,以此来明确要使用的间隔。

总结

使用这些动画技术,你现在可以:

  1. 在状态改变过程中,使用 CSS3 和渐变组高效地应用渐变动画。
  2. 使用 requestAnimationFrame为 CSS 之外的东西添加动画,如滚动条位置或 Canvas绘画。
  3. 当 requestAnimationFrame不被支持时降级到 setTimeout()方法。
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何在 Bootstrap 4 中实现多项目轮播?如何在 Bootstrap 4 中实现多项目轮播?Apr 30, 2025 pm 03:24 PM

在Bootstrap4中实现多项目轮播的解决方案在Bootstrap4中实现多项目轮播并不是一件简单的事情。虽然Bootstrap...

deepseek官网是如何实现鼠标滚动事件穿透效果的?deepseek官网是如何实现鼠标滚动事件穿透效果的?Apr 30, 2025 pm 03:21 PM

如何实现鼠标滚动事件穿透效果?在我们浏览网页时,经常会遇到一些特别的交互设计。比如在deepseek官网上,�...

HTML 视频的播放控件样式怎么修改HTML 视频的播放控件样式怎么修改Apr 30, 2025 pm 03:18 PM

无法直接通过CSS修改HTML视频的默认播放控件样式。1.使用JavaScript创建自定义控件。2.通过CSS美化这些控件。3.考虑兼容性、用户体验和性能,使用库如Video.js或Plyr可简化过程。

在手机上使用原生select会带来哪些问题?在手机上使用原生select会带来哪些问题?Apr 30, 2025 pm 03:15 PM

在手机上使用原生select的潜在问题在开发移动端应用时,我们常常会遇到选择框的需求。通常情况下,开发者倾...

在手机上使用原生select的弊端是什么?在手机上使用原生select的弊端是什么?Apr 30, 2025 pm 03:12 PM

在手机上使用原生select的弊端是什么?在移动设备上开发应用时,选择合适的UI组件是非常重要的。许多开发者�...

如何使用Three.js和Octree优化房间内第三人称漫游的碰撞处理?如何使用Three.js和Octree优化房间内第三人称漫游的碰撞处理?Apr 30, 2025 pm 03:09 PM

使用Three.js和Octree优化房间内第三人称漫游的碰撞处理在Three.js中使用Octree实现房间内的第三人称漫游并添加碰�...

在手机上使用原生select会遇到哪些问题?在手机上使用原生select会遇到哪些问题?Apr 30, 2025 pm 03:06 PM

使用原生select在手机上的问题在移动设备上开发应用时,我们经常会遇到需要用户进行选择的场景。虽然原生sel...

为什么有的网站能实现鼠标滚动穿透效果,而有的不行?为什么有的网站能实现鼠标滚动穿透效果,而有的不行?Apr 30, 2025 pm 03:03 PM

探究鼠标滚动事件的实现原理在浏览一些网站时,你可能注意到某些页面元素在鼠标悬停时仍然允许滚动整个页...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器