非常教程

CSS参考手册

动画和转换 | Animations & Transitions

检测CSS动画的支持 | CSS Animations: Detecting CSS animation support

CSS 动画 使仅用CSS属性来使内容呈现动画效果成为一种可能,然而,某些时候CSS动画属性并不能生效,此时,我们希望能够通过javascript代码来实现相似的动画效果。针对此种情况,本文基于Chris Heilmann的 this blog post 对该技术进行了示范。

CSS动画支持检测

下面的代码将检测CSS动画的支持性是否是有效的。

var animation = false,
    animationstring = 'animation',
    keyframeprefix = '',
    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
    pfx  = '',
    elm = document.createElement('div');

if( elm.style.animationName !== undefined ) { animation = true; }    

if( animation === false ) {
  for( var i = 0; i < domPrefixes.length; i++ ) {
    if( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {
      pfx = domPrefixes[ i ];
      animationstring = pfx + 'Animation';
      keyframeprefix = '-' + pfx.toLowerCase() + '-';
      animation = true;
      break;
    }
  }
}

首先先定义几个变量,并通过初始化animation 为false来假设不支持CSS动画属性,先设置animationstring变量为animation并在稍后进行修改。创建一个浏览器前缀的数组用来循环遍历并设置pfx前缀为空字符串。

然后,检测创建的elm元素的style属性集合中animation-name属性是否被设置,如果被设置,则意味着着浏览器支持CSS animation属性,而不需要加任何前缀,然而到目前,还没有任何浏览器实现(译者:chrome中试验了一下是可以的);

如果浏览器不支持无前缀的animation,那么animation变量值仍为false,遍历所有可能的浏览器前缀,由于所有的主流浏览器现在都在该属性前加了前缀,因此在AnimationName 前加上前缀即可。

当代码执行完,如果浏览器不支持CSS animation属性,则返回animation 为false,否则为true。如果animation为true,则所有animation 相关属性名称以及keyframes属性前缀都是检测到的正确的,因此,如果使用firefox,属性名称就是MozAnimation,keyframes前缀就是-moz-,如果使用chrome,属性为WebkitAnimation ,keyframes前缀为 -webkit-。注意,浏览器是不方便在驼峰法和连字符法之间进行切换的。

针对不同浏览器使用正确语法实现动画效果

现在可以知道,无论浏览器是否支持CSS animation,均可以实现动画效果。

if( animation === false ) {

  // animate in JavaScript fallback

} else {
  elm.style[ animationstring ] = 'rotate 1s linear infinite';

  var keyframes = '@' + keyframeprefix + 'keyframes rotate { '+
                    'from {' + keyframeprefix + 'transform:rotate( 0deg ) }'+
                    'to {' + keyframeprefix + 'transform:rotate( 360deg ) }'+
                  '}';

  if( document.styleSheets && document.styleSheets.length ) {

      document.styleSheets[0].insertRule( keyframes, 0 );

  } else {

    var s = document.createElement( 'style' );
    s.innerHTML = keyframes;
    document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );

  }
  
}

以上代码主要根据animation的值来进行不同的操作,如果为false,则需要执行javascript脚本来实现动画效果,否则,就用javascript来创建所需要的CSS animation 效果。

设置animation属性是很简单的,可以在style属性集合中简单的更新它的值。然而,增加keyframes是有难度的,由于它们不能够通过传统的css语法来定义。(虽然这样使得它们更加灵活,但是通过脚本来定义更加不易)

使用javascript来定义keyframes,需要将其具体语法写为字符串。为了创建keyframes变量,在构建keyframes时要在其所有属性前加前缀,该变量包含完整的所有动画序列所需要的keyframes描述。

下一个任务是将创建的keyframes添加到实际的CSS中。首先要检查是否在document中存在CSStylesheet,如果存在,则能够简单的将keyframes值插入到CSSstylesheet中。

如果不存在CSSstylesheet,创建一个新的 <style>元素,并将keyframes设置为其内容。然后将新的<style>元素插入到document 的head中,从而将新的style sheet添加到了html文档中。

在JSFiddle中查看

另见

  • CSS动画(CSS animation)
CSS

层叠样式表( Cascading Style Sheets )是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

CSS目录

1.动画和转换 | Animations & Transitions
2.背景和边框 | Backgrounds & Borders
3.基本框模型 | Basic Box Model
4.基本用户界面 | Basic User Interface
5.框对齐 | Box Alignment
6. 级联和继承 | Cascading & Inheritance
7.颜色 | Color
8. 合成与混合 | Compositing & Blending
9.条件和规则 | Conditional Rules
10.计数器样式 | Counter Styles
11.设备适配 | Device Adaptation
12.扩展 | Extensions
13.滤镜效果 | Filter Effects
14.灵活的框布局 | Flexible Box Layout
15.字体 | Fonts
16.片段模块 | Fragmentation
17.全屏 API | Fullscreen API
18. 生成内容 | Generated Content
19.网格布局 | Grid Layout
20.图像值 | Image Values
21.初始线格局 | Inline Layout
22.列表和计数器 | Lists & Counters
23.逻辑属性 | Logical Properties
24.面具 | Masking
25.媒体查询 | Media Queries
26.杂项 | Miscellaneous
27.Miscellaneous Level 1
28.Miscellaneous Level 2
29.运动路径 | Motion Path
30. 多列布局 | Multi-column Layout
31.命名空间 | Namespaces
32.项目模型 | Object Model View
33.网页媒体 | Paged Media
34.定位布局 | Positioned Layout
35.伪元素 | Pseudo-
36.节奏大小 | Rhythmic Sizing
37. Ruby布局 | Ruby Layout
38.可缩放矢量图形 | Scalable Vector Graphics
39.滚动快照 | Scroll Snap
40.选择 | Selectors
41.形状 | Shapes
42.文本 | Text
43.文字装饰 | Text Decoration
44.变换 | Transforms
45.值和单位 | Values & Units
46.变量 | Variables
47.写入模型 | Writing Modes
48.CSS 教程
49.CSS 创建
50.CSS Id 和 Class选择器
51.CSS 简介
52.CSS 盒子模型
53.CSS Table(表格)
54.CSS 列表样式(ul)
55.CSS 链接(link)
56.CSS Fonts(字体)
57.CSS Text(文本)
58.CSS Backgrounds(背景)
59.CSS Display(显示) 与 Visibility(可见性)
60.CSS 尺寸 (Dimension)
61.CSS 分组和嵌套
62.CSS 轮廓(outline)属性
63.CSS Border(边框)
64.CSS 图像透明/不透明
65.CSS 导航栏
66.CSS 伪元素
67.CSS 伪类
68.CSS Float(浮动)
69.CSS Position(定位)
70.CSS 总结
71.CSS 属性选择器
72.CSS 媒体类型
73.CSS 图像拼合技术
74.CSS 实例
75.CSS 组合选择符
76.响应式 Web 设计 – 框架
77.响应式 Web 设计 – 视频(Video)
78.CSS 提示工具(Tooltip)
79.CSS 布局 Overflow
80.CSS 计数器
81.CSS 表单