A collection of patterns and modules for responsive designs.
DEAR READER

祝日 / Permanent Vacation

oozey mess
wallacepolsom
Sade Olutola
h
One Nice Bug Per Day
Today's Document

JVL
Sweet Seals For You, Always
trying on a metaphor
NASA
we're not kids anymore.
No title available
d e v o n
Three Goblin Art

titsay
TVSTRANGERTHINGS

No title available
Jules of Nature

seen from United States
seen from United States

seen from Bangladesh
seen from United States

seen from Russia

seen from Singapore
seen from Ireland

seen from Netherlands
seen from United States
seen from United States
seen from United States
seen from United States

seen from United States
seen from United States

seen from United States
seen from United States
seen from United States
seen from United States

seen from United States
seen from United States
@allenchy-blog
A collection of patterns and modules for responsive designs.
小顧聊射雞#1 截稿期
轉貼微博
日記
今天的心情真是傷感呢,一個在公司裡位置重要的員工在月底將會離職,他的離開令我感到有一點空虛,少了他那張嘴,我會掛住有人和我熱烈理論的那些日子的。 以後都不復再了,是可惜,也是感嘆!
Sass / Compass 之初體驗
這些日子一直都在搞CSS3的transiton和animation,通常我地為左可以cross browser,我地會搞到個CSS file又亂又多code =[。
為左吾再響lee d 重複又重複的code裡面打轉,我終於的起心肝去裝Sass / Compass玩玩。
過程非常簡單 :
先要確定你有裝Ruby,win安裝,linux安裝,mac自帶Ruby,Ok !
打開Terminal.app寫入sudo gem install compass(mac/linux) / gem install compass(win)
再打sudo gem update(mac/linux) / gem update(win)
基本上就Ok,如果你係用mac,又同我一樣比較懶打commend,我推薦你用scout-app作為你的GUI ~
Closures
之前寫了 Scope ,現在可以寫寫下一個環節,說是 Closures 。
Closures 是一把雙刃劍,用得好可以增進功力,寫出簡潔實用的代碼;但用得不好就只好落得失敗收場。
先看看簡單的代碼 :
function add (x) { return function (y) { return x + y; }; } var add5 = add(5); var no8 = add5(3); alert(no8); // Returns 8
這就係一個最基本的 Closures 結構,外面 function 指向其內部function 的 variable 形成 Closures。
當 add(5) 被 call 時,佢會帶有一個 parameter(5) 和 return 一個 function,如下 :
function add5 (y) { return 5 + y; }
如此,這個數值 (5) 和代碼 (function) 就會一起被記載在 call 佢的 var add5 裡面,然後add5(3) 就會載入數值 (3) 到上述的 function 裡,如下 :
function add5 (3) { return 5 + 3; }
最終得出 5+3 = 8
The infamous loop problem
下面有一堆代碼,最終目標係想做出能對應返相對數值黎叫出 alert 的 link。如link1 - alert 1,但代碼好像有點問題,如下 :
function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function () { alert(i); }; document.body.appendChild(link); } } window.onload = addLinks;
如果大家試下 run 段代碼,會發現所有alert都顯示了5,原因係我地用的 click function,根本無記住所需要的 i 數值,我地每次按 link 都只會得出 :
alert(i);
每一個 alert 裡面其實只引用返 global 的 i ,數量係完成 looping 後的數值5。
要解決 lee 個問題,我地要在 for loop 裡面,將當前的 i 值如link1的(1) 記載到click funcion 入面,做成各個 local variables ,如下 :
link.onclick = function (num) { return function () { alert(num); }; }(i);
這個做法和文章的首段代碼相似,一樣是把數值和 function 記入一個地方,形成獨立的處理環境。這樣就可以把要用的數值拿到 local variables 和global variables分開。
function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function (num) { return function () { alert(num); }; }(i); document.body.appendChild(link); } } window.onload = addLinks;
修正後的代碼可順利得出正確return。
Self-invoking functions
另一個能做出的Closures代碼如下 :
(function () { var dog = "German Shepherd"; alert(dog); })(); alert(dog); // Returns undefined
這個代碼又是一個 Closures,dog 只能在內部 function 存取,其他呀豬呀象都不能動它一毛!
利害嗎?還不夠利害,yahoo 團隊利用了這個特性,做出了一組模式,優化左 Closures 的實用性。
Yahoo JavaScript Module Pattern
這堆代碼就利用了 Self-invoking functions 造出 Closures,然後加上一些 method,把裡頭的variable加以利用,如下 :
var person = function () { // Private var name = "Robert"; return { getName : function () { return name; }, setName : function (newName) { name = newName; } }; }(); alert(person.name); // Undefined alert(person.getName()); // "Robert" person.setName("Robert Nyman"); alert(person.getName()); // "Robert Nyman"
有左 lee 個模型,我地可以用 getName() 去拿裡面的 Name 值;或者用 setName() 去改變裡面的 Name 值。
看,方便多了!
Windows Phone 8 Start Screen 背後的故事
Win 8 似乎是這個月來最hot的科技話題,大家都對這一顆在行動數位裝置上的新星有著多少的好奇吧!現在,在微軟的blog上面,高級項目經理 Josh Phillips 就著他們的全新 Start Screen ,為大家介紹 Win 8 的靈感來源由何已來。 佢地 Lee 個新入口的 UI 的靈感來源,所有野都黎自他們第一次開會的一句 「How can we make Start even more personal?」,之後,設計者和工程師們經過幾許努力後,終於找到了一個創新,做出了一個和其他競爭者的靜態的主屏幕不同的動態入口,稱為 Tiles 。 在 Win 8 上,入口不僅僅是一個啟動應apps的地方。你可以找到你最好的朋友那天那裡的狀態,每天更新最新的頭條新聞,CNN的apps,或ebay網拍上的貨。 只要是你喜歡的一切都可以成為入口的一部份。 不僅如此, 微軟的團隊還加入了眾多的原素,令本來平凡的入口不再平凡。有興趣可到 window blogs 看 The story behind the Windows Phone 8 Start screen 。
CSS3 Flex Box Model
現在我們可以利用CSS3的Flexible Box Layout module 製造出富彈性又簡單的排版 !
基本設定 :
<!DOCTYPE html> <html> <head> <style> div { display:-moz-box; /* Firefox */ display:-webkit-box; /* Safari and Chrome */ display:box; width:300px; border:1px solid black; } #p1 { -moz-box-flex:1.0; /* Firefox */ -webkit-box-flex:1.0; /* Safari and Chrome */ box-flex:1.0; border:1px solid red; } #p2 { -moz-box-flex:2.0; /* Firefox */ -webkit-box-flex:2.0; /* Safari and Chrome */ box-flex:2.0; border:1px solid blue; } </style> </head> <body> <div> <p id="p1">Hello</p> <p id="p2">World</p> </div> <p><b>Note:</b> The box-flex property is not supported in IE or Opera.</p> </body> </html>
顯示如下 :
簡單幾句就可以做好排版效果,不需再用float、position:absolute、margin、clear一堆堆...而且這種排版基礎下的結構是極富有彈性的,我們可以利用一系列的Flexible Box屬性去設點排版的效果。
但暫時只支援ff和chome 。之後有機會再同大家詳談
Shadow DOM
而家的網站通常有好多plugin同程序化左的原素加插嚮入面。 例如,一 d YouTube 視頻,Facebook 按鈕,Twitter 按鈕 etc 。 事實上,lee d 代碼的實現手法吾係咁理想,例如他們需要用iframe加載 Facebook 按鈕,目前都未有更簡潔的方法去提供lee d代碼的封裝。
封裝(Encapsulation)是 object-oriented 編程語言的一部份,它允許物件管理自己的數據,並限制訪問。 這條件下,物件可以限制外來者對自身數據的提存。 或者阻止第三方代碼的入侵。 可惜的是,對於開發者而言,HTML未有提供lee d接口。 現在我們不斷開發新的CSS和JS library 和 widget ,非常需要封裝使開發者能夠編寫自己的代碼,知道它會正常運作。 W3C為解決這些問題,就開始著力開發Shadow DOM ,目前正在開發中。
Shadow DOM Subtrees
首先要了解,DOM tree 是由眾多的 functional subtree 組成 - 由一個或多個的 DOM node 去實現。 例如,“Like”按鈕的功能就係通過一組節點實現。
而這Shadow DOM subtree 的目標就係提供封裝。希望將 Shadow DOM subtree 由原 DOM tree 分離,從而提供封裝。這種分離被稱為 shadow boundary 。
DOM tree 中的任何元素都能夠承載 Shadow DOM 。 儲存著 Shadow DOM 的那個 node 被稱作shadow host 。需要留意的是 Shadow DOM subtree 的存在係吾會影響正常文本中的 subtree,二者可以同時存在。
如下圖所示,從W3C規範說明了這個概念。 在左側的綠色節點代表了典型的文檔樹。 首個DOM node是作為一個shadow host的標記。 這個 node 的虛線箭頭指向 Shadow DOM subtree 。
渲染 Shadow DOM
當呈現在頁面時,文檔的 DOM 和 Shadow DOM subtree 都呈現為一個單一的樹。然而,瀏覽器會忽略它原本的subtree。 下圖說明了這概念。
啟用 Shadow DOM
目前只有在Chrome瀏覽器能夠啟用這個功能。 首先在URL打入“chrome://flags”。 接下來,找到“Enable Shadow DOM",然後“Enable”。
Shadow DOM 示例
我們研究一個例子,該例子的HTML源代碼如下。 body裡有一個<div>將被用作一個Shadow host。 <div>裡面的child是<span>,<span>裡寫著this is not part of the shadow DOM""。 當頁面加載完畢,js 就會為 Shadow host 附加一層 Shadow DOM subtree。
過程中,WebKitShadowRoot會把Shadow DOM製造出來,然後加上一個<span>,裡面寫著"This is part of the shadow DOM"。
<!DOCTYPE html> <html lang="en"> <head> <title>Shadow DOM Example</title> <meta charset="UTF-8" /> <style> span { color: red; } #shadowHost { border: 1px solid black; } </style> <script> window.addEventListener("load", function() { var shadowHost = document.getElementById("shadowHost"); var shadowRoot = new WebKitShadowRoot(shadowHost); var shadowChild = document.createElement("span"); shadowChild.textContent = "This is part of the shadow DOM"; shadowRoot.appendChild(shadowChild); }, false); </script> </head> <body> <div id="shadowHost"> <span id="child">This is not part of the shadow DOM</span> </div> </body> </html>
接下來我們會用這段HTML源代碼在Chrome 20行走,如下圖顯示。 有幾件野值得一提的。首先,Shadow DOM的<span>不是原文本裡的<span>,這點由DOM tree是看不出來的。第二,Shadow DOM的<span>,吾係根據CSS顯示紅色,証明shadow tree實際上已經封裝在DOM tree裡。
下圖顯示了Chrome的element inspector。在DOM tree查看找不到任何Shadow DOM的腳印。
ShadowRoot DOM方法
因為Shadow DOM tree中的DOM node 被封裝了,正常DOM的getElementById()方法已經不能再訪問到它們。 然而,ShadowRoot 物件提供了許多相同的功能,用於訪問它們的 Shadow DOM subtree。 例下 :
getElementById()
getElementsByClassName()
getElementsByTagName()
getElementsByTagNameNS()
querySelector()
querySelectorAll()
ShadowRoot 物件還支持“innerHTML”。
shadowRoot.innerHTML = "<span>innerHTML generated content</span>";
CSS 跨 Shadow Boundary
默認的情況下,CSS並不適用於 Shadow DOM node。 然而,ShadowRoot 物件可以允許CSS通過 "applyAuthorStyles” Boolean 屬性來跨界。 以下這個例子,會導致 Shadow DOM <span>通過CSS顯示為紅色。
shadowRoot.applyAuthorStyles = true;
要緊記的事
Shadow DOM為開發者提供了封裝。
Shadow host 係 Shadow DOM subtree 的首個node。
Shadow root 係首個 Shadow DOM node。
渲染過程中 Shadow DOM subtree 代替了原本的DOM subtree。
ShadowRoot 物件提供了許多常見的DOM相關功能。
HTML5 Mobile Game
http://www.html5gamedevelopment.org/StateofHTML5GameDevelopment/
Using : http://html5quintus.com/
call, apply, caller, callee
這幾日返複研究scopes,closures和this的關系,發覺有二個平時較少用的method,在一些特殊的情況下起了關鍵的作用。
其實不是甚麼新發現,只是在看幾年前別人的文章看到。現在先賣個關子,因為我想先記錄call和apply的作用,還有caller和callee這二個在arguments裡面的屬性的用法。
call, apply
基本上,call, apply就係去跑一個function。當用上他們時,就可以用某被指定的物件在function裡面成為this。call指定的物件係一個參數。apply指定的物件係陣列。
function obj() { this.text = "I"; } function applyMe(arg1, arg2) { alert(this.text + arg1 + arg2); } applyMe.call(new obj(), ' love', ' javascript');
結果出現 " I love javascript "
caller, callee
要說明這二個東西有甚麼用,沒甚麼想比跑一次這function好,看看 :
按下button後出現result :
repaint和reflow
我們做UI開發的,除了要注意設計的效果之外,效能都係重要的一環。首先,我地要有了解,DOM是頁面結構的稱呼,而頁面有任何變化都會經由render進行。
repaint : 可理解為改變DOM某一元素的屬性(如color)時,讓render再描繪此元素的情況
reflow : 可理解為是次改變會影響整個布局(如height)時,render需要再描繪涉及改變的全局元素的情況
所以幾乎所有涉及DOM操作的改變都會引發repaint/reflow。我們都知道這二個情況都會大量消耗效能(很耗..),但我們可以如何避免呢?
具體上看來,我們只需要避免改動元素style上的屬性,然後將需要修改的屬性包裝成一個CSS由CSS style sheet管理,之後我們只需要改變對應的class,這樣就可以大量地減少repaint/reflow的次數。
還有一點,如果真的有必要進行大量repaint/reflow,如制造動畫的時候,我們可以把該元素的position設置為absolute/fixed,這樣就可以把他和原本的DOM脫離出來,滅少對其他元素的影響。
ZOOM是IE的靈丹妙藥
CSS裡面的zoom:1;的作用在於設定目標物件的屬性「hasLayout」為ture。而當一個物件有設置長闊的話,都視為「hasLayout」true。
除左zoom,我地重可以利用其他css屬性去設置「hasLayout」,如下:
display : inline-block, height : any value, float : left or right, position : absolute, width : any value, writing-mode : tb-rl, zoom : any value
利用設置「hasLayout」我地可以解決ie上的大部份排版問題如 : filter失效和float等問題。
Scope
要了解JS的Scope原理,先要知道他的全名叫Lexical Scope。簡單地說,變數可使用範圍是依照程式定義時的層次決定。
再簡單d講,JS 用function來當作一個scope。在function裡面再宣告一個 function 就會產生一個新的scope。
function scope1(){
var a = 'a in scope1',
b = 'b in scope1';
function scope2(){
a = 'rewrite a in scope1';
}
function scope3(){
var b = 'b in scope3';
}
}
上面想表示的係,scope2沒有用var宣告的a會複寫外層scope1的a,在scope3裡用var宣告的b會變成local變數並只存在這一個scope3裡面。而在scope3裡面的b都可以叫做closure。
然後我們要再了解一下,一個全域函式scope1()實際上係點樣運作。
當我地定義一個全域函式的時候,電腦會生成一個屬性指到scope chain,這個table裡面存放一個table指到global。
然後,當一個函式被執行的時候,佢的execution context會被生成,而這個execution context會生成屬於自己的scope chain,然後開始複制函式且指向儲蓄local variable的activation object。
所以,當function裡面任何變數做存取的時候,先會取用local的,之後再往上一層,global的變數永遠都會在最上那一層,最後找不到就會產生error。
所以我地寫script的時候應該盡可能多用local的變數,因為這總是比global的變數快。
重有千奇要記得宣告變數時要加上var,不然會不小心宣告太多全域變數。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - -
想要清楚明白這東西搞甚麼鬼的話,可以和我一起看看以下2個範例
範例來自 http://ichi1234567.github.com/blog/2012/09/02/js-scope/
範例3, 4
如果我地用 console.log(a); 就會發現,下面foreach所執行的是儲存在a陣列的三個function。
範例3所引用的i係範例最上面for loop的i,而且係for loop完結後才引用,所以得出結果是完成for loop後的i,數值3。
範例4的分別在於lee次程式將i產生成一個 Closure,個別儲存在a陣列裡。由於此時這3個獨立的i之值不同,故每次函數的執行結果都不同。
Javascript 我究竟懂幾多?
今日我一直在看一些圍繞於優化js寫法的文章,方法五花百門,不在此分享了。我想說的是起源於一篇文章 You Don't Know JavaScript 。讀後令我反思,這個我平時日夜接觸的東西,我研究對他有多了解呢。我跟另一篇翻譯文章中取出部分內容,如下。
為了展現 JS 的各種組成原理,我把這些概念區分為基本,中等,進階三個等級:
基礎等級包含:
知道基本的 JS 語法,例如迴圈,if 判斷式,try/catch 等。
了解各式函式定義的方法以及指派的方法,包含了解匿名函式的使用。
了解基本的 scope 原則,包含全域 scope (window) 以及物件 scope (不包含 closures)
了解執行 context scope 以及 this 的使用
了解各種生成物件以及宣告物件的方法,包含函式本身也是物件的概念。
了解 JavaScript 的比較運算子的意義,例如 ‘>’,‘<', '==', '==='
物件與陣列生成方式的不同
中階等級包含:
了解 timer 的使用,以及使用的時機以及使用的方式,比如用來當做非同步執行的方法。
深度了解 callback 以及 function 的使用,例如透過 call 以及 apply 兩個 function 函式來改變 context 以及 function 參數傳遞。
了解 JSON 表示法以及eval函式。
了解 closures,包含對於效率的影響,以及如何透過 (function(){}()) 達成 private變數。
了解 AJAX 以及 物件字串化。
進階等級包含:
了 解 ‘arguments’ 以及如何利用 ‘arguments’ 以及 ‘arguments.length’ 達成function overloading。以及利用 arguments.callee 產生遞迴呼叫。特別要注意的是 arguments.callee 可能會有點問題因為 ECMAScript 5 Strict Mode 並沒有支援 callee。不過 jQuery以 及 Dojo 都有用到就是了。
進階的 closures 應用,例如 self-memorizing functions,currying,以及 partially applied functions。
Function 與 html prototyping(prototype chain),並且知道如何 reuse 既有的 JS Objects 與函式 (例如array)
物件型別,以 及 instanceof 與 typeof 的使用
Regular expression
with 敘述式,以及為什麼不應該用 with
最難的在於把所有這些串接在一起組成乾淨的強大的快速的好維護並且跨瀏覽器的程式碼
好了,講到lee度,我其實係想以此概念為基本,由三等級再溫習一次JS的各種基礎原理而且將消化後的想法一篇篇貼在這裡,好讓自已可以隨時修正重溫。
睇黎會係一個好開始~
自製豹紋蕉蕉
一反到屋企,女友就吵著要我幫佢修改佢公司黎緊冬季時裝的圖。其中用左一個幾得意的小技巧,可以做隻豹紋蕉蕉。
簡單幾步就能做出豹紋蕉蕉,事前請先準備:蕉蕉 , 豹紋。
1. 用選取工具切好蕉型
2. 將豹紋設置剪裁遮色片和覆蓋
3. 利用 [影像] -> [調整] -> [陰影/亮部] 加強蕉蕉的陰影
再加點改正就OK了