简介
c3.js
是一个轻量快速的CSS 3D库,项目源码可在 GitHub 或 Coding 获取。c3.js是我使用CSS实现的一套简单3D引擎,受到 css3d-engine 和 voxel.css 这两个库的启发。
特点:体积小巧,仅20KB,gzip压缩后只有6.4KB!
演示示例
以下是几个实际应用场景的演示链接:
使用指南
安装
引入方式
CommonJS (Node.js)
AMD (RequireJS)
ES6 模块
HTML结构
JavaScript基础用法
API文档
HashObject
c3.js
的顶级对象。框架内所有对象的基类,为对象实例提供唯一的hashCode
值。
公共属性
hashCode: string
[只读] 返回此对象唯一的哈希值,用于唯一确定一个对象
Display 类 (extends HashObject)
Display 类是可放在显示列表中的所有对象的基类。该显示列表管理运行时中显示的所有对象。
公共属性
visible: boolean
显示对象是否可见backface: boolean
显示对象背面是否可见className: string
显示对象class类名opacity: number
显示对象的透明度
公共方法
大部分方法支持链式调用,其中position
、rotate
、translate
、scale
参数其中一个为字符串时表示变化值,如rotate('+0.5',0,0)
=> rotate.x += 0.5
css(param: Object): Display
- 为当前显示对象设置样式,例如css({color:'red'})
on(type: string, cb: Function[, capture: boolean]): Display
- 为显示对象添加事件once(type: string, cb: Function[, capture: boolean]): Display
- 为显示对象添加事件,只触发一次off(type: string, cb: Function[, capture: boolean]): Display
- 删除对象中的侦听器position(x: number|string, y?: number|string, z?: number|string): Display
- 设置显示对象的位置getPosition(): Point
- 获取显示对象的位置size(x: number|string, y?: number|string, z?: number|string): Display
- 设置显示对象的尺寸和显示优先级getSize(): Point
- 获取显示对象的尺寸rotate(x: number|string, y?: number|string, z?: number|string): Display
- 设置显示对象的旋转getRotate(): Quaternion
- 获取显示对象的旋转四元数scale(x: number|string, y?: number|string, z?: number|string): Display
- 设置显示对象缩放getScale(): Vector3D
- 获取显示对象的缩放translate(x: number|string, y?: number|string, z?: number|string): Display
- 设置显示对象位移getTranslate(): Vector3D
- 获取显示对象的位移update(): void
- 更新场景中的(position,translate,rotate,scale)的设置
Sprite 类 (extends Display)
Sprite 是基本显示列表构造块:一个可包含子项的显示列表节点。
公共属性
children: Display[]
[只读] 当前Sprite下的所有子显示对象numChildren: number
[只读] 当前Sprite下子项的数量material: Material[]
设置或获取显示对象组的材质
公共方法
addChild(...displays: Display[]): void
- 添加显示对象到组内removeChild(...displays: Display[]): void
- 从组内移除对象
Stage 类 (extends Sprite)
Stage 为所有显示元件的顶级父对象,一个场景只能有一个Stage。
构造方法
参数:
stageWidth
: 舞台宽度stageHeight
: 舞台高度
公共属性
camera: c3.Camera
- 获取当前场景的camera
对象
公共方法
attach(selector: string)
- 将舞台挂载到指定DOM元素
Camera 类 (extends Sprite)
Camera 为 Stage 的直接子元素,可以通过 stage.camera
引用。
属性
fov: number
- 相机视锥体垂直视角
Plane 类 (extends Display)
一个二维平面,具有width、height、zIndex和material属性。
构造方法
参数:
width: number
- 平面宽度height: number
- 平面高度zIndex: number
- 平面的z-index (默认值为0)
属性
material: Material
- 设置或获取平面的材质
Cube 类 (extends Sprite)
一个三维立方体空间。
构造方法
参数:
x: number
- 立方体x轴宽度y: number
- 立方体y轴宽度z: number
- 立方体z轴宽度
Cylinder 类 (extends Sprite)
多面圆柱,所有面的长宽是相等的。
构造方法
参数:
width: number
- 面宽height: number
- 面高num: number
- 面的个数
Material 类 (extends HashObject)
一个材质可以被多个显示对象使用,每个显示对象只能有一个材质。这里的材质实质上是对显示对象的CSS属性操作。
构造方法
Itexture 接口包括:
color?: string
- CSS: background-colorposition?: string
- CSS: background-positionsize?: string
- CSS: background-sizerepeat?: string
- CSS: background-repeatorigin?: string
- CSS: background-originclip?: string
- CSS: background-clipattachment?: string
- CSS: background-attachmentimage?: string
- CSS: background-imagefilter?: string
- CSS: filterhidden?: boolean
- CSS: background:nonevisible?: boolean
- CSS: visiblebackface?: boolean
- CSS: backface-visibilityopacity?: number
- CSS: opacity
方法
clone()
- 克隆当前材质update(param: Itexture = {})
- 更新材质属性getAttr(attr: string)
- 获取材质属性值render(target?: Display)
- 将材质渲染到指定显示对象上
实现原理
c3.js 利用CSS3的3D变换能力实现各种3D效果,主要包括:
- 使用CSS Transform属性进行3D变换
- 使用四元数计算旋转角度
- 通过DOM层级结构模拟3D场景树
- 使用事件代理优化交互性能
辅助函数
c3.js提供了一些实用的辅助函数:
c.style(el, param)
- 为元素添加CSS,API可参考style.jsc.rnd(min, max)
- 生成指定区间的随机数c.rndInt(min, max)
- 生成指定区间的随机整数c.rndColor()
- 生成随机色值