[译]视图切换动画教程

原文出处: https://developers.google.com/web/fundamentals/look-and-feel/animation...css

咱们常常须要将用户切换到不一样视图,切换中的动画可让用户有更好的体验。html

重点:web

  • 使用translation实现视图间移动,避免使用left,top这样的任何会触发布局的属性完成动画。
  • 确保动画短且时髦(snappy)
  • 考虑屏幕尺寸变大时的动画和布局,适合小屏幕的动画不必定适合大屏幕

动画的选择要改由视图切换类型来决定,例如模态对话框出现的动画和列表到详情的动画就有区别。浏览器

注意:app

  • 须要保证动画频率为60fps以免卡顿
  • 使用will-change属性让浏览器优化动画,视图动画中咱们推荐will-change: transform

视图切换时使用translation

这里咱们实现列表视图到详情视图的切换,用户点击列表项时详情滑动出现,替换掉列表页。布局

要实现这个效果你须要一个包含两个视图的容器,容器设置overflwo:hidden,这样就能保证两个视图并排也不出现水平滚动条。性能

容器对应的CSS以下:优化

.container {
  width: 100%;
  height: 100%;
  overflow: hidden;
  position: relative;
}

容器设置position: relative是为了视图能够方便地绝对定位,而后使用transform进行移动。使用transform性能比left属性好,由于left会触发布局和重绘。动画

视图样式以下:google

.view {
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;

  will-change: transform;
}

为视图transform添加transition可以产生很好的滑动效果,咱们使用cubic-bezier曲线来完成。

.view {
  transition: transform 0.3s cubic-bezier(0.465, 0.183, 0.153, 0.946);
}

须要隐藏的视图应该translate到右边:

.details-view {
  transform: translateX(100%);
}

下面添加一些JavaScript实现类的切换。

var container = document.querySelector('.container');
var backButton = document.querySelector('.back-button');
var listItems = document.querySelectorAll('.list-item');

/**
 * Toggles the class on the container so that
 * we choose the correct view.
 **/
function onViewChange(evt) {
  container.classList.toggle('view-change');
}

/**
 * when you click on a list item bring on the details view
 **/
for (var i = 0, len = listItems.length; i < len; ++i) {
  listItems[i].addEventListener('click', onViewChange, false);
}

backButton.addEventListener('click', onViewChange, false);

最后添加必要的CSS

.view-change .list-view {
  transform: translateX(-100%);
}

.view-change .details-view {
  transform: translateX(0);
}

你能够扩展这个例子到多视图模式,基本理念依然不变:不可见的视图须要隐藏在屏幕外面,而后在须要的时候显示出来,而且把当前视图移除。

这里是完整的在线demo

<iframe width="100%" height="300" src="//jsfiddle.net/gwcnx505/embedded/result,css,js,html" allowfullscreen="allowfullscreen" frameborder="0"></iframe>

注意:

跨浏览器实现这个效果是颇有挑战性的,好比在iOS中须要添加-webkit-overflwo-scrolling: touch来‘reenable’ fling scrolling,可是你不须要控制具体的axis。

以上的方法可使用到其余滑动元素,例如侧边导航。惟一的区别在于你不须要移动其余视图。

相关文章
相关标签/搜索