CSS3 transition优化网页内容加载后高度变化

现在web技术不断发展,视图与数据渲染更多由前端呈现,后台更多与数据打交道。于是,我们会经常看到这样的交互场景。页面加载,看到一个框框里面有个菊花在转,然后内容呈现;或者点击个按钮,菊花在转,然后列表动态加载呈现。例如:

是不是没有任何问题?确实,功能上OK,有菊花,用户也愿意等。但是,大家有没有觉得所有交互,出现菊花→出现内容,都是“砰砰砰”很生硬的感觉,尤其当内容是动态,高度不确定的时候。我们使用一些比较好的手机APP(如微信)的时候一定不会有这样的感觉,整个交互流程都是很流畅的,就像山涧的泉水,涓涓细流到山脚,而不是巨人在峡谷走路的感觉。

所以,如果菊花的呈现到内容的展示能够通过自然的动画过渡呈现,势必会增强用户体验。

而动态内容呈现主要变化的关键因素就是——高度,而过渡效果最佳利器是CSS3 transition, 于是,脑中不禁疑问,是不是可以借助CSS3 transition实现动态内容的高度动画呈现,渐进增强用户体验。

其实,早在12年的时候,我就开始了这方面的尝试,若有兴趣可以查看此文:“更多|收起交互中渐进使用transition动画”。我自己也瞅了瞅,发现当年的我讲废话的本领甩了现在的我两条长安街。大家直接从Part5 看就好了。 其中,受限于当年略显稚嫩的技术,里面获得容器高度的方法,有些傻,大家就假装没看到。

CSS3 transition的难点

如果直接一行CSS代码就可以让动态呈现动画化,那就不需要本文了,早就各个站点都是这类优质体验的交互了。究其根本就是CSS3 transition的一个局限性,对"auto"*冷淡!嘛意思?

大家很好理解,所谓“过渡”,就是从一个地方到另外一个地方,比方说,从0到100. 但是,你来个从0到auto, 傻眼了吧。大学时看过一部美国科幻片《心灵传输者》,其中男主也不是想瞬间位移就瞬间位移的,也是需要知道目的地和路径的。

然而,当我们在一个div呈现动态内容的时候,由于我们并不知道里面的内容(都说了是动态的嘛),所以,我们的height其实都是auto,于是,就算transition: height .35s走起,也不会有动画效果的,我们需要的是固定值。

于是难点和关键点来了,如何赋予固定高度值?

固定高度值与transition触发

说白了很简单,当前高度固定值,获得动态内容载入后的高度固定值,再style设置,over~

代码细节我就不讲了,其实没什么人关心的,“我需要的是代码,代码!”估计很多人心里是这么咆哮的。

 代码如下 复制代码
// 高度无缝动画方法
var funTransitionHeight = function(element, time) { // time, 数值,可缺省
    if (typeof window.getComputedStyle == "undefined") return;
   
    var height = window.getComputedStyle(element).height;
    element.style.height = "auto";
    var targetHeight = window.getComputedStyle(element).height;
    element.style.height = height;
    element.offsetWidth = element.offsetWidth;
    if (time) element.style.transition = "height "+ time +"ms";
    element.style.height = targetHeight;
};

十行出头点代码。

element就是容器元素;如果transition你是写在CSS中的,time参数可以不要,例如:

 代码如下 复制代码

element { transition: height 250ms; overflow: hidden; }

funTransitionHeight(element)

funTransitionHeight名字如果你不喜欢,可以自己改掉。IE9+有效,IE10+有动画,IE6~IE8老样子,所谓渐进增强。

点击页面上“点击我”按钮,里面就有有高度不固定内容呈现,大伙儿就可以看到内容呈现时候不是砰砰砰了,而是?_?_?_~

 


如何调用?很简单,初始化时候funTransitionHeight()一下,赋个固定值;然后每次菊花完毕,内容载入后在funTransitionHeight()一下,动画就来啦。也就是说,相比你们以前的JS代码,就多了一行funTransitionHeight(element)调用而已,是不是实用又低成本!

时间: 2024-12-30 20:33:31

CSS3 transition优化网页内容加载后高度变化的相关文章

网页进度条设计:关于讨论loading加载后的一些心得

文章描述:Loading,让烦躁少一些. 前一阵子,接到一个app切图制作加载圆形进度条的任务,看到那个小进度条转啊转的,我若有所思-同时,一个做印象派制作间控件设计的同学最近做了改版,那个控件登陆需要一些时间,看到他对loading加载条进行了优化,然后就一起交流了一下.作为一个刚毕业入行不久的新人,请允许我分享一下关于讨论loading加载后的一些心得- 这是一个浮躁的年代,长听到这样的抱怨"好慢!""等到死!",每次看到那个转啊转的圈圈,或者是那个"

Jquery 在页面加载后执行的几种方式

 这篇文章主要介绍了Jquery 在页面加载后执行的几种方式,需要的朋友可以参考下 方式1:   代码如下: $(function(){    initPublish();    });    说明: initPublish() 即为你要运行的JS函数:这段代码,放在页面最低端.    方式2:  代码如下: $(document).ready(function () {    // add your code here    initPublish();    $(.a).click( fun

reference-QT中ortp库加载后,里面的函数未定义的问题

问题描述 QT中ortp库加载后,里面的函数未定义的问题 undefined reference to `ortp_init' 解决方案 http://blog.csdn.net/nemo2011/article/details/7371266 解决方案二: 你对应函数delib库没有link进来 解决方案三: 具体怎么做啊,不会弄那个,能说下步骤吗?

linux驱动加载后能找到设备,但是/dev下不能找到设备文件

问题描述 linux驱动加载后能找到设备,但是/dev下不能找到设备文件 linux驱动加载后能找到设备,但是/dev下不能找到设备文件,我用的是动态分配设备号,insmod也能通过,但是/dev下就是找不到设备文件,加载后也不能通过测试程序我基本上直接用的板子例程,静态动态我都试了,就是不行,日志文件里面也什么都没有,板子是2410的,主机是红帽的,希望大神能够指点迷津/*****************************************Copyright (c)********

优化tableView加载cell与model的过程

优化tableView加载cell与model的过程   效果图   说明 1. 用多态的特性来优化tableView加载cell与model的过程 2. swift写起来果然要比Objective-C简洁了不少   源码 https://github.com/YouXianMing/Swift-TableViewDemo https://github.com/YouXianMing/OC-TableViewDemo // // ViewController.swift // Swift-Tab

loadlibrary-DLL显式加载后,得到了DLL内的导出函数地址,但是调用的时候出现了0X00000005

问题描述 DLL显式加载后,得到了DLL内的导出函数地址,但是调用的时候出现了0X00000005 如题,DLL加载内内存都没有问题,调用GetProcAddress也返回了正常的地址,但是偏偏调用时就出错了,请问如果是DLL加壳或者内部有算法会导致这样的问题吗? strcpy_s(macRountineName,sizeof(macRountineName),"fnRequestOperation"); if (hinstLib == NULL) hinstLib = LoadLib

C# webBrowser 页面加载后,点击里面的不同连接

问题描述 C#webBrowser页面加载后,点击里面的不同连接.但前面几个连接的数据取到了.后面的不行了.如何才能准确的取到内容?if(e.Url==webBrowserlogo.Url&&(e.Url.ToString()=="http://www.bestb2b.com/jsp/signin.jsp"))//加载一次{count++;if(count==1){//第一次加载验证码更换HtmlElementImgeTag=webBrowserlogo.Documen

数据加载后保存数据到另外数据表中急急急急急急急急急急急急急急

问题描述 数据加载后保存数据到另外数据表中急急急急急急急急急急急急急急 datagrid容器 数据加载后保存到另一个数据库表 sqlite数据库中加载一组数据到datagrid中. 现在把数据保存到sql server 数据库中. 解决方案 Dim Con As New ADODB.Connection '定义ADO对象 Dim rs As New ADODB.Recordset Con.ConnectionString = "driver=SQL Server;server=192.168.1

solrcloud-Solrcloud 修改配置文件,如何重新加载后重新索引?

问题描述 Solrcloud 修改配置文件,如何重新加载后重新索引? 5C Solrcloud 修改配置文件 schemal.xml synonyms.txt,如何重新加载后重新索引? 解决方案 配置文件自动重新加载 解决方案二: 索引update下,有solr命令吧,搜下