CSS3 Transition详解

Transition是CSS3中新添加的特性,不知道翻译成什么叫法更好听一点,暂且叫做“转换”吧,即当元素在大小、颜色、布局、透明度等数值改变时(请注意是数值的改变),可以使其产生过渡的动画效果,比如当元素的大小变动时,可以使用Transition将这个变动过程变得分平滑,可以增强网站的体验。

基础知识

Transition对应的CSS属性列表:
transition-property
* 指定当元素哪个属性改变时执行Transition效果,属性可以时以下属性:none、all以及其他可以触发浏览器reflow或repaint的属性。
* 当指定为none时,动画立即停止,当指定为all的时候,则当元素产生任何属性值变化时都将执行“转换”效果,比如大小改变。
* 初始默认值为all.

transition-duration
* 指定“转换”过程的时间,如:1s、none。
* 初始默认值为0.

transition-timing-function
* 指定“转换”过程中可用的效果,预设的有:ease, linear, ease-in, ease-out, ease-in-out, cubic-bezier(x1, y1, x2, y2),默认值时easy。
* cubic-bezier为通过贝塞尔曲线来计算“转换”过程中的属性值,如下曲线所示,通过改变P1(x1, y1)和P2(x2, y2)的坐标可以改变整个过程的Output Percentage。

* 初始默认值为default.

transition-delay
* 指定一个动画开始执行的时间,即当改变元素属性值后多长时间开始执行“转换效果”
* 初始默认值为0.

以上属性可看下面这个demo(如果无法看到效果,请更换你的浏览器):

这是一个参照物

深度问题挖掘

属性值连写(短属性)
* transition和background等CSS属性一样支持属性值连写,比如:-webkit-transition: width 1s easy-in-out;
* 需要值得注意的是,原则上所有属性值是不区分位置的,但是“时间属性值”有点不同,浏览器会根据先后顺序决定,第一个可以解析为时间的属性值将体现为transition-duration,第二个可以解析为时间的属性值将体现为transition-delay

浏览器支持状况?
* Chrome 2+(-webkit-transition),Firefox3.7+(-moz-transition),Safari 3.1+(-webkit-transition),Opera 10.5+(-o-transition),其他浏览器暂不支持

ReflowRepaint
* Transition执行过程中,同样会产生大量的Reflow和Repaint,不过不同的是,这些变化都有一定是按照CSS中定义的运作方式规律的进行,所以浏览器可以预知整个过程的Reflow和Repaint过程,从而对其进行优化处理。(个人猜测,这需要查看webkit源码后再作结论)

正确理解Timing-function
* 这是几个Timing-function曲线图:

* 这是几个默认timing-function的示例:

default »
linear »
ease-in »
ease-out »
ease-in-out »
cubic-bezier »

* 一次“转变”便是一次曲线过程

激发Transition的条件
* 只要为元素指定任意一个以上的transition属性,元素在改变属性值的时候便可执行transition效果,并设其他属性值为初始值,详见上述属性列表。看这个demo:

鼠标移动到元素上方可观察变化效果
<div style="-webkit-transition-duration:2s; width:300px; padding:10px;
border: 2px solid #ccc; background:#a01000;color:#fff;"
onmouseover="this.style.width='500px';"
onmouseout="this.style.width='300px';">鼠标移动到元素上方可观察变化效果</div>

* 值得注意的是,本文不止一次提到,是当“属性值”改变时才会激发transition效果,而不是所有“元素外观”的改变都会激发的,比如设定元素的宽度为百分比,然后改变浏览器大小,元素大小在改变的同时并未发现由transition的效果呈现。请看这两个demo
————————————–邪恶的补充线——————————————

实践中还发现,当元素Layout不可见即display为none时,操作元素为block的同时操作其他可transition属性时,无法激发transition效果。解决办法为,先将元素设为block(或其他可见值),再setTimeout(function(){ /**属性改变代码**/ }, 0),将transition操作提到js操作队列最后执行。//2010-06-01

收尾

嗯,transition就研究到这里吧,文章中有些只是个人臆测的结论,请不要盲目相信,随后我将继续扫一遍webkit中关于transition的源码再给出结论。

发现写一篇文章真累,废寝忘食,腰酸背疼,更加葱白大牛们写blog的毅力了,所以要懂得珍惜人家的劳动成果。

将Layout和inline、inline-block放在一起研究

先分别介绍这几个的大概含义:
*Layout,是一个 IE/Win 的私有概念,它决定了一个元素如何显示以及约束其包含的内容、如何与其他元素交互和建立联系、如何响应和传递应用程序事件/用户事件等。(参看http://www.orsoon.com/Article/Article_8433.html
*inline,是CSS中display属性的一个值,书面解释为“内联”,字面上的意思就是可以在同一行的元素,所有的html元素都有默认的display属性值,有些默认是inline(span, em, a, etc.),有些则是block(div, p, h1, etc.)。所有设置为inline属性的元素,不能人为设定其高度、宽度、行高,而且与其他inline元素同在文档流的同一行排列(超出一行继续在下一行排列)。
*block,块元素,与inline相反,block元素总是在新的一行上显示,而他的宽、高、行高都是可以控制的。
*inline-block,这是inline和block的结合体,既有inline元素的特性,也能表现block的特性,他与其他inline或inline-block元素在同一行显示,但是可以通过人为控制他的宽度和高度。

inline的例子:http://imethan.com/demo/inline.html
block的例子:http://imethan.com/demo/block.html
inline-block的例子:http://imethan.com/demo/inline-block.html

呃~~ 后面我要说什么?忘了!!!几天前存的草稿….囧….

5个简单但是有用的CSS属性

转载翻译至http://www.webdesignerwall.com/tutorials/5-simple-but-useful-css-properties/  [5 Simple, But Useful CSS Properties]

这篇文章将介绍5个你非常熟悉但很少使用的CSS属性。我并不是讲最新的CSS3,而是这些大多数浏览器都支持的老的CSS2的属性:clip, min-height, white-space, cursor, display。因此,不要错过这篇文章,它可能让你感到这些属性多有用。

1.CSS Clip
“Clip”属性就像是一个遮罩,他可以让你用一个矩形区域遮住一个元素,要剪切这个元素,你必须将元素的position属性设置为absolute,然后指定其相对于这个元素的top right bottom left值。
css-clip
图片剪切例子:http://www.webdesignerwall.com/wp-content/uploads/2009/11/css-clip.html
img-clip
2009-11-16 11 49 35

图片改变大小以及剪切,例子:http://www.webdesignerwall.com/wp-content/uploads/2009/11/css-clip.html
这个例子,你将学到如何改变图片大小并对其进行剪切。如下图所示,原图是一个矩形图片,我想将他缩小到50%,并剪切成一个正方形的缩略图。可以使用了width和height属性去改变图片大小,然后使用clip属性去剪切图片,再然后,设定其left属性为剪掉的长度一半负值。
thumb-gallery
2009-11-16 11 51 01
4. Cursor (demo)
当按钮状态改变时,我们最好可以相应的改变下鼠标图标,如:正常、等待、手型等。
2009-11-16 13 41 00
2009-11-16 13 43 16

2.Min-height [示例:http://www.webdesignerwall.com/wp-content/uploads/2009/11/min-height.html]
min-height允许你给一个元素指定一个最小高度,当你想平衡元素位置的时候很有用,比如:
job-board
2009-11-16 11 57 33
但是IE6并不支持,这里要hack一下:
2009-11-16 11 59 25

3.White-space [示例:http://www.webdesignerwall.com/wp-content/uploads/2009/11/white-space.html]
nowrap
2009-11-16 12 02 39

 5.Display Block/Inline  [示例:http://www.webdesignerwall.com/wp-content/uploads/2009/11/display.html]
也许你还不知道,display为block的元素会在新的一行显示,但display设置为inline的元素会在与前一元素同一行显示,DIV、H1、P等标签默认都是block元素。EM、SPAN、STRONG等默认收拾inline元素。你可以随意重新指定他们的display属性为inline或者block。
2009-11-16 13 46 39
2009-11-16 13 49 10