Famous框架系列一:famous/core/Surface
famous/core/Surface
既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us Famous12年的作品,点击右下角Fun things to do可以看到操作说明。
我认为Famous框架中最重要的部分莫过于Surface了。
Surface是所有能够被展现的元素的根本,它负责将可见的元素生成DOM输出(目前仅支持DOM,WEBGL版本正在他们的实验室里,并已有华丽视频放出,移步:https://famo.us/blog/)。心血来潮想写一点关于Famous的文章,又害怕自己坚持不下去,就挑重要的最先说吧。
Surface是个虚拟的DIV,真正的DIV是Surface._currentTarget--他的一个属性。Surface会创建一个DIV用以显示内容,并保持这个DIV的引用用于更新。
创建一个Surface:
var surface = new Surface({
size: [100, 100],
classes: ['surface'],
content: '我是Surface!Hello Famous!',
properties: {
backgroundColor: '#fff'
},
attributes: {
name: 'surfaceA'
}
});
说一下参数吧:这几个参数不加上也没关系,famous会按默认的来。
size:尺寸(尺寸很关键很关键,由于Famous是一个基于绝对定位的库,尺寸的设置对程序的影响巨大,将来会与Modifier一并说,如果写到这一篇的话。。)
classes:css类,是一个数组的形式
content:内容。这里的内容不仅仅是放几个字或者一两句话,而是一段HTML代码。就我个人的经验,大部分时候还是几个字。。在复制粘贴网络上类似10个酷炫的css效果的时候,插入HTML代码很有用(大牛轻喷,因为我会喷回去的:-D)。
properties:用于控制样式。所有Object.style下的属性都可以写在这里。好吧,就是控制css的地方。
attributes:控制属性的地方。
这些参数初始化的时候忘记写了也没关系,都有方法可以赋值的。比如setContent,setProperties等等,通通都有。
基础就是这些了,平时经常会用的也就是以上这部分。接下来进入意识流阶段,我想到啥就说啥了(意识模糊:-D)。
Surface默认生成的tag是DIV,但也可以生成别的,如<article>,<span>通通都可以。只要给初始化的实例设置这么一个属性:elementType。看源代码我们可以看到,Surface的elementType属性是'div',所以如果我们需要修改tag名,只需要
surface.elementType = 'span';
这样,之前代码创建的surface的tag就成了span。
Surface除了显示可见内容外还有一个重要的作用是接收和处理事件。Famous是一个挺高层的UI框架,作为框架的使用者,几乎完全不考虑操纵DOM,它唯一与DOM建立联系的就是Surface了,所以DOM的事件如鼠标点击,触摸等等都需要靠Surface来获得(Engine也会获取并处理一部分事件,仅限于body上的事件)。
Surface控制的dom(_currentTarget)在被部署(deploy)到页面时,会触发一个deploy事件。这个事件在你想要直接操作dom(_currentTarget)又纠结这个dom在不在的时候(Surface是虚拟DOM,不会在初始化的第一时间生成DOM部署进页面,而是在初始化后的第一个Engine Tick被部署),非常有用。
好吧,刚刚提到了Engine Tick,就简单解释一下吧:Famous跟游戏框架很像,差不多每秒刷新60次,游戏中一般称为帧,而Famous中我不知道这样称呼合不合适,就按英文的说法叫Engine Tick好了。
Surface有一个家族。目前的成员有(除了Surface):
CanvasSurface:用于生成<canvas>,干嘛的不用多说吧。恩,下面就随便全举出来好了。
ImageSurface:<img>
InputSurface:<input>
SubmitInputSurface:<input type="submit">
TextareaSurface:<textarea>
VideoSurface:<video>
ContainerSurface:这个既值得一说也不值得一说(好烦:-D),也是个<div>,所不同的是,可以向其中加入其它需要显示的元素,比如往里面加一个Surface和两个ImageSurface,看名字就知道起到一个容器的作用。这个容器本身是个<div>可以直接写内容的。
FormContainerSurface:上面容器的<form>版
每个Surface初始化的时候都可以方便地码出这个Surface的全部css参数,虽然Famous也是支持给Surface配置css类的,但很多时候,一两个属性直接写比较方便。特别是移动端的情况下,少用css,样式参数全写进代码里,能减少服务器请求。把参数写进代码还有一个好处就是方便程序动态调整,比如适配屏幕的时候,fontSize可以根据屏幕的尺寸做像素级的调整。
Surface默认是自带一个css类的:famous-surface。
这个css类首当其冲的就是position: absolute。整个Famous框架都是建立在绝对定位的基础上,个人感觉Famous很多地方更像一个游戏框架。通过绝对定位,有效的降低了dom树的复杂度,并建立自己的渲染树,藉此提升性能,华丽的动画从这里开始。(物理引擎,缓动函数)
构造函数中各种改动标识符,_sizeDirty,_contentDirty,对Surface进行更新的时候,尽量使用提供的各种set方法。。也算是常识吧。。没啥好说的。每一个Tick,都会检查当前的size,content之类的是否dirty,有就更新。
Surface.prototype.setup = function setup(allocator) {
var target = allocator.allocate(this.elementType);
Famous自带一个DOM对象池,每次生成新的对象都会从池子里找找有没有能用的不在树里的DOM节点。
对应的,这个surface不用了,会被回收。
this.detach(target);
this._currentTarget = null;
allocator.deallocate(target);
内置一个EventHandler。
this._eventOutput = new EventHandler();
this._eventOutput.bindThis(this);
可以监听浏览器事件(on),抛出自定义事件(emit),还可以向其他的事件接收者推送自身的事件(pipe)。
surface.on('click', function(event){ //监听浏览器的点击事件
console.log(event);
surface.emit('onClick'); //抛出一个onClick事件
});
好啦,关于Surface没啥能说的了。
Famous框架系列一:famous/core/Surface的更多相关文章
- SpringMVC 框架系列之初识与入门实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...
- 2019 年起如何开始学习 ABP 框架系列文章-开篇有益
2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...
- java日志框架系列(4):logback框架xml配置文件语法
1.xml配置文件语法 由于logback配置文件语法特别灵活,因此无法用DTD或schema进行定义. 1.配置文件基本结构 配置文件基本结构:以<configuration>标签开头, ...
- C# 数据操作系列 - 8. EF Core的增删改查
0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...
- Spring框架系列(2) - Spring简单例子引入Spring要点
上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...
- Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例
前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web 应用),这便是SpringMVC:Spring MVC是Spri ...
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
随机推荐
- LintCode,hihoCoder,LeetCode有什么区别?
https://www.zhihu.com/question/31218682 知乎用户 9 人赞同了该回答 LintCode 和LeetCode的题差不太多LintCode 有中文,不过没有用户讨论 ...
- 基于springMVC的RESTful服务实现
一,什么是RESTful RESTful(RESTful Web Services)一种架构风格,表述性状态转移,它不是一个软件,也不是一个标准,而是一种思想,不依赖于任何通信协议,但是开发时要成功映 ...
- ZT 互联网——降级论
互联网——降级论 投递人 Astar 发布于 2012-07-06 09:54 评论(110) 有30531人阅读 原文链接 [收藏] « » 文/meditic 几乎一年没有写博客了,说没时间 ...
- 基于UML的毕业设计管理系统的分析与设计
基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...
- 学习日期时间控件 daterangepicker
aterangepicker 是一款日期时间控件,可选择“年,月,日,时,分,秒”,可选择单面板,也可选择双面板(起止时间). 单面板示例:daterangepicker 单面板 codepen 在线 ...
- Paxos算法简单陈述
上文二段式和三段式提交协议是相对比较容易理解的.1990年Leslie Lamport 提出的Paxos算法是一种基于消息传递且具有高度容错特性的一致性算法.但是Paxos算法比较复杂,对于不能沉心学 ...
- PHP MemCached高级缓存配置图文教程
memcache是一个高性能的分布式的内存对象缓存系统,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. 1.Memcache相关介绍 memcache是一个高性能的 ...
- openssl生成证书
数字证书: 第三方机构使用一种安全的方式把公钥分发出去 证书格式:x509,pkcs家族 x509格式: 公钥和有效期限: 持有者的个人合法身份信息:(主机名,域名) 证书的使用方式 CA的信息 CA ...
- Jenkins+github的一次定时构建示例
首先说明,我的电脑环境是windows,所以以下的示例是基于windows10 X64. 一.新建任务,填写名称,选择类型,点击左下角的[确定] 二.配置 1.General 2.源码管理 之前在gi ...
- HBase的简单java操作
官方文档:http://hbase.apache.org/book.html java简单操作hbase的表 import org.apache.hadoop.conf.Configuration; ...