前提:
介于现在很多活动都使用了 类似全屏滚动效果 尤其在微信里面 我自己开发了一个快速构建 此类项目的控件 与市面上大部分控件不同的是此控件还支持元素的动画效果 并提供多种元素效果 基于 zepto.js
功能清单:
1 快速实现页面全屏滚动效果。并提供多种翻页效果,兼容大部分 ios 和 android 系统。
2 支持在页面中添加多种动画元素效果 来实现淡入,滑入等效果。
3 支持配置音乐功能。
4 支持摇一摇接口功能。
前提:
介于现在很多活动都使用了 类似全屏滚动效果 尤其在微信里面 我自己开发了一个快速构建 此类项目的控件 与市面上大部分控件不同的是此控件还支持元素的动画效果 并提供多种元素效果 基于 zepto.js
功能清单:
1 快速实现页面全屏滚动效果。并提供多种翻页效果,兼容大部分 ios 和 android 系统。
2 支持在页面中添加多种动画元素效果 来实现淡入,滑入等效果。
3 支持配置音乐功能。
4 支持摇一摇接口功能。
他们是真的亲戚,可不像 Java 和 Javascript 一样。
其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法,你不能让我写我就写。
但当我发现 React Native 横空出世后,它学习一次到处运行的理念非常诱人。React Native 可以写出原生体验的 iOS/Android 应用?那不就多了一门装逼技能?所以我们调研小组试了一下,感觉 "Duang" 一下,很爽很舒服。写 React Native 需要两门基础技能:React 语法 和 iOS 基础知识。
很爽很舒服,索性就研究一下,算是入门。 了解之后发现,React 真是有另一番天地,值得学习。
接下来总结以下我对 React 的理解,分享给大家。
在 2008 年的时候,John Resig 写了一 Class.js,使用的方式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var Person = Class.extend({ init: function(isDancing){ this.dancing = isDancing; }, dance: function(){ return this.dancing; } }); var Ninja = Person.extend({ init: function(){ this._super( false ); }, dance: function(){ // Call the inherited version of dance() return this._super(); }, swingSword: function(){ return true; } }); |
1 |
<span style="font-family: sans-serif, Arial, Verdana, 'Trebuchet MS'; line-height: 1.6;">init为构造函数,通过this._super()访问</span><strong style="font-family: sans-serif, Arial, Verdana, 'Trebuchet MS'; line-height: 1.6;">父类同名方法</strong><span style="font-family: sans-serif, Arial, Verdana, 'Trebuchet MS'; line-height: 1.6;">。</span> |
这种看上去很酷很方便的继承方式,居然有一个致命的缺陷。那就是:
在敲下这个标题的时候,心里好虚。话说我一直不太喜欢发表这些看上去很假大空的文字,每个人的职业规划都是独有的,不具有太大的可复制性,把自己的经历放出去,容易误人子弟。只是最近很多师弟们(别问我为什么都是师弟,我想静静…… 也不要问我静静是谁!)问起这个,也就根据自己的经历发表一下对前端工程师的看法吧,“ 我说的都是错的”,仅供参考。另:本篇是纯文字,密集恐惧症换成勿入!
从我接收第一份前端需求开始,到现在也有五个年头了。自己也从一个愣头青变成一个快到而立之年的大叔,时间真的是哗啦哗啦的快。这五年里,其实可以分成三部分:1~2, 3~4, 5。
AlloyRenderingEngine 是一款非常快速的渲染引擎,目前该项目已经合并至 https://github.com/AlloyTeam/AlloyGameEngine/ ,
属于 AlloyGameEngine 下的一个子项目,负责渲染。
因为游戏===复杂的 App,所有 AlloyGameEngine 不仅可以做游戏,也可以制作 App,比如: http://kmdjs.github.io/ppt-editor/
用 AlloyGameEngine 制作 App,如大炮轰蚊子。
目前非常流行自适应设计与响应式设计,而且经常让人混淆,自适应设计不应与自适应布局混为一谈,它们是完全不一样的概念。
自从移动终端飞速发展以来,各种各样的机型突飞猛进,很多网站的解决方法,是为不同的设备提供不同的网页,比如专门提供一个 mobile 版本,或者 iPhone/iPad 版本。这样做固然保证了效果,但是比较麻烦,同时要维护好几个版本,而且如果一个网站有多个 portal(入口),会大大增加架构设计的复杂度。
于是,很早就有人设想,能不能" 一次设计,普遍适用",让同一张网页自动适应不同大小的屏幕,根据屏幕宽度,自动调整布局(layout)?
2010 年,Ethan Marcotte 提出了" 自适应网页设计"(Responsive Web Design)这个名词,指可以自动识别屏幕宽度、并做出相应调整的网页设计。
最近在 Angular 项目中遇到关于 controller 内使用 $scope&this 暴露数据的问题,下面来分析一下:
“controller as” 是 Angular 在 1.2 版本后新增的语法,我将从引用方式,作用范围,对象对比三个方面做两者的比较:
引用方式:
1) $scope 只需要在注入中声明,后面就可以直接在附加数据对象:
controller:
1 2 3 |
function ACtrl($scope) { $scope.test = "一个例子"; //在$scope对象中加入test } |
html:
1 2 3 |
<div ng-controller="ACtrl"> {{test}} </div> |
2) this 则采用了 controller as(需要版本为 ng 1.2+) 写法:
作为
React
的核心技术之一Virtual DOM
,一直披着神秘的面纱。
实际上,Virtual DOM 包含:
- Javascript DOM 模型树(VTree),类似文档节点树(DOM)
- DOM 模型树转节点树方法(VTree -> DOM)
- 两个 DOM 模型树的差异算法(diff(VTree, VTree) -> PatchObject)
- 根据差异操作节点方法(patch(DOMNode, PatchObject) -> DOMNode)
接下来我们分别探讨这几个部分:
VTree 模型非常简单,基本结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ <span class="comment">// tag的名字</span> tagName: <span class="string">'p'</span>, <span class="comment">// 节点包含属性</span> properties: { style: { color: <span class="string">'#fff'</span> } }, <span class="comment">// 子节点</span> children: [], <span class="comment">// 该节点的唯一表示,后面会讲有啥用</span> key: <span class="number">1</span> } |
所以我们很容易写一个方法来创建这种树状结构,例如 React 是这么创建的:
1 2 3 4 5 6 7 8 |
<span class="comment">// 创建一个div</span> react.createElement(<span class="string">'div'</span>, <span class="keyword">null</span>, [ <span class="comment">// 子节点img</span> react.createElement(<span class="string">'img'</span>, { src: <span class="string">"avatar.png"</span>, <span class="keyword">class</span>: <span class="string">"profile"</span> }), <span class="comment">// 子节点h3</span> react.createElement(<span class="string">'h3'</span>, <span class="keyword">null</span>, [[user.firstName, user.lastName].join(<span class="string">' '</span>)]) ]); |
这方法也不太难,我们实现一个简单的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<span class="keyword">function</span> create(vds, <span class="keyword">parent</span>) { <span class="comment">// 首先看看是不是数组,如果不是数组统一成数组</span> !<span class="keyword">Array</span>.isArray(vds) && (vds = [vds]); <span class="comment">// 如果没有父元素则创建个fragment来当父元素</span> <span class="keyword">parent</span> = <span class="keyword">parent</span> || document.createDocumentFragment(); <span class="keyword">var</span> node; <span class="comment">// 遍历所有VNode</span> vds.<span class="keyword">forEach</span>(<span class="keyword">function</span> (vd) { <span class="comment">// 如果VNode是文字节点</span> <span class="keyword">if</span> (isText(vd)) { <span class="comment">// 创建文字节点</span> node = document.createTextNode(vd.text); <span class="comment">// 否则是元素</span> } <span class="keyword">else</span> { <span class="comment">// 创建元素</span> node = document.createElement(vd.tag); } <span class="comment">// 将元素塞入父容器</span> <span class="keyword">parent</span>.appendChild(node); <span class="comment">// 看看有没有子VNode,有孩子则处理孩子VNode</span> vd.children && vd.children.length && create(vd.children, node); <span class="comment">// 看看有没有属性,有则处理属性</span> vd.properties && setProps({ style: {} }, vd.properties, node); }); <span class="keyword">return</span> <span class="keyword">parent</span>; } |
差异算法是 Virtual DOM 的核心,实际上该差异算法是个取巧算法(当然你不能指望用 O(n^3) 的复杂度来解决两个树的差异问题吧),不过能解决 Web 的大部分问题。
那么 React 是如何取巧的呢?
如图,React 仅仅对同一层的节点尝试匹配,因为实际上,Web 中不太可能把一个 Component 在不同层中移动。
还记得之前在 VTree 中的属性有一个叫 key 的东东么?这个是一个 VNode 的唯一识别,用于对两个不同的 VTree 中的 VNode 做匹配的。
这也很好理解,因为我们经常会在 Web 遇到拥有唯一识别的 Component(例如课程卡片、用户卡片等等)的不同排列问题。
React 提供自定义元素,所以匹配更加简单。
由于 diff 操作已经找出两个 VTree 不同的地方,只要根据计算出来的结果,我们就可以对 DOM 的进行差异渲染。
具体可参考下面两份代码实现:
Facebook’s challenges are applicable to any very complex websites with many developers. Or any situation where CSS is bundled into multiple files and loaded asynchronously, and often loaded lazily.
——@vjeux
将 Facebook 换成 Tencent 同样适用。
Shadow DOM 的样式是完全隔离的,这就意味着即使你在主文档中有一个针对全部 <h3>
标签的样式选择器,这个样式也不会不经你的允许便影响到 shadow DOM 的元素。
举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<body> <style> button { font-size: <span class="number">18</span>px; font-family: <span class="string">'华文行楷'</span>; } </style> <button>我是一个普通的按钮</button> <div></div> <script> <span class="keyword">var</span> host = document.querySelector(<span class="string">'div'</span>); <span class="keyword">var</span> root = host.createShadowRoot(); root.innerHTML = <span class="string">'<style>button { font-size: 24px; color: blue; } </style>'</span> + <span class="string">'<button>我是一个影子按钮</button>'</span> </script> </body> |
这就很好地为 Web Component
建立了 CSS Namespace 机制。
http://blog.vjeux.com/2014/javascript/react-css-in-js-nationjs.html
比较变态的想法,干脆直接不要用 classname,直接用 style,然后利用 js 来写每个元素的 style……
例如,如果要写一个类似 button:hover
的样式,需要写成这样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<span class="keyword">var</span> Button = React.createClass({ styles: { container: { fontSize: <span class="string">'13px'</span>, backgroundColor: <span class="string">'rgb(233, 234, 237)'</span>, border: <span class="string">'1px solid #cdced0'</span>, borderRadius: <span class="number">2</span>, boxShadow: <span class="string">'0 1px 1px rgba(0, 0, 0, 0.05)'</span>, padding: <span class="string">'0 8px'</span>, margin: <span class="number">2</span>, lineHeight: <span class="string">'23px'</span> }, depressed: { backgroundColor: <span class="string">'#4e69a2'</span>, borderColor: <span class="string">'#1A356E'</span>, color: <span class="string">'#FFF'</span> }, }, propTypes: { isDepressed: React.PropTypes.bool, style: React.PropTypes.object, }, render: <span class="keyword">function</span>() { <span class="keyword">return</span> ( <button style={m( <span class="keyword">this</span>.styles.container, <span class="comment">// 如果压下按钮,mixin压下的style</span> <span class="keyword">this</span>.props.isDepressed && <span class="keyword">this</span>.styles.depressed, <span class="keyword">this</span>.props.style )}>{<span class="keyword">this</span>.props.children}</button> ); } }); |
几乎等同于脱离了 css,直接利用 javascript 来实现样式依赖、继承、混入、变量等问题……当然如果我们去看看 React-native 和 css-layout,就可以发现,如果想通过 React 打通客户端开发,style 几乎成了必选方案。
我们期望用类似
Web Component
的方式去写 Component 的样式,但在低端浏览器根本就不支持Shadow DOM
,所以,我们基于 BEM 来搭建了一种 CSS Namespace 的方案。
我们的 Component 由下面 3 个文件组成:
可参考:https://github.com/miniflycn/Ques/tree/master/src/components/qtree
可以发现我们的 css 是这么写的:
1 2 3 4 5 6 7 8 9 |
.<span class="variable">$__title</span> { margin: <span class="number">0</span> auto; font-size: <span class="number">14</span>px; cursor: <span class="keyword">default</span>; padding-left: <span class="number">10</span>px; -webkit-user-select: none; } <span class="comment">/** 太长忽略 **/</span> |
这里面有长得很奇怪的.$__
前缀,该前缀是我们的占位符,构建系统会自动将其替换成 Component 名,例如,该 Component 为 qtree,所以生成结果是:
1 2 3 4 5 6 7 8 9 |
.qtree__title { margin: <span class="number">0</span> auto; font-size: <span class="number">14</span>px; cursor: <span class="keyword">default</span>; padding-left: <span class="number">10</span>px; -webkit-user-select: none; } <span class="comment">/** 太长忽略 **/</span> |
同样道理,在 main.html
和 main.js
中的对应选择器,在构建中也会自动替换成 Component 名。
这有什么好处呢?
xmlhttprequest2.0 可以支持文件上传. 这东东很方便, 但是在实际使用中碰到了一些问题. 这里记录下.
Copyright © 2011-2021 AlloyTeam. All Rights Reserved. Powered By WordPress
粤ICP备15071938号-2