在YUI 3畫廊:馬特·泰勒的RaphaelJS模塊
9月27日,由馬修·泰勒2010年在1:05時,在發展中, YUI 3畫廊 | 9評論RaphaelJS是一個功能強大的JavaScript庫,管理SVG的圖紙和動畫。 它允許您輕鬆地創建SVG的畫布,繪製基本形狀和路徑很容易,甚至他們組合成集和轉換應用到一個或多個載體。 您可以繪製形狀,處理圖像,動畫一切。 RaphaelJS提供了一個很好的API輕鬆創建和修改的SVG元素。
雖然圖書館是令人印象深刻的,但我發現,我可以添加一些重要的功能與YUI3元素的RaphaelJS庫。 我已經開始了與新的這些努力RaphaelJS庫模塊 。
延遲加載RaphaelJS和插件
的第一個特點是,不僅RaphaelJS庫的延遲加載,但任何RaphaelJS 插件 ,您可能需要。 RaphaelJS庫模塊將只加載這些文件,當你聲明你將使用他們在YUI的沙箱。 例如:
銳({畫廊:畫廊2010.09.22-20-15'})。使用('畫廊拉斐爾,功能(Y){ Y.Raphael()。使用(功能(拉斐爾){ / /使用拉斐爾在這裡,就像你會在外面銳 紙=拉斐爾(myPaper',500,500); }); });
如果您使用RaphaelJS的插件,在數組中指定的路徑和發送,作為第一個參數在Y.Raphael的()()函數。
銳({畫廊:畫廊2010.09.22-20-15'})。使用('畫廊拉斐爾,功能(Y){ VAR myPlugins = ['插件/ raphael.awesomePlugin.js的','插件/ raphael.wickedPlugin.js']; Y.Raphael()。使用(myPlugins,功能(拉斐爾){ / /使用拉斐爾在這裡,就像你會在外面銳 紙=拉斐爾(myPaper',500,500); / /“紙”,將有你的插件現在增加任何新功能 }); });
首先加載RaphaelJS庫,然後任意指定的插件加載前拉斐爾作為唯一的參數對象執行回調函數。
自定義事件
一旦你創建一個繪圖空間與拉斐爾對象的,那麼你可以立即得到的繪圖。 當你調用方法,如rect , circle ,和圖紙空間的path上,你會收到代表SVG的矢量對象。 通常情況下,你必須通過其相應的DOM元素node屬性的訪問。 例如:
紙=拉斐爾(myPaper',500,500); 平方米= paper.rect(0,0,100,100);
這將創建一個矩形矢量對象在坐標[0,0]的寬度和高度為100像素。 你有機會到底層的DOM元素(這是一個SVG的rect ,像這樣的元素):
rectNode = square.node; rectNode.onclick =函數(){ 警報(“恭喜你,你點擊一個正方形!”); };
如果你是一個狂熱的YUI的用戶,你可能會比這更喜歡的事。 如何建立以及在Y.Node ? 就像node屬性是指背後的SVG對象的HTML元素, $node屬性是指在Y.Node該元素的包裝。 所以,你可以做這樣的事情:
平方米。node.on('懸停',函數(){ 警報(“恭喜你,你可以移動鼠標!'); });
讓我們嘗試更複雜的東西。 一個載體的相互作用,應該能夠引起其他繪製向量更新自己的風格,對不對? 有關我們如何創造一些酒吧,所有使他們的顏色取決於在鼠標位於頁面上的一個圈:
紙=拉斐爾('rcanvas',600,800); 中國保監會= paper.circle(350,200,100)的attr({填寫:“粉紅”,行程:'黑'}); / /推入一個數組矩形一堆 I = 0;矩形= []; (我<10; I + +){ rectangles.push(paper.rect(0,40 *我,200,20)的attr({填寫:“紅”,行程:'黃'})); } / /遍歷矩形,為每個特定的圈子加入的MouseMove處理程序 Y.Array.each(矩形,功能(矩形,索引){ I =指數+ 1; 中國保監會。node.on(MouseMove事件',函數(EVT){ / /填充顏色是動態的,依賴於這個矩形的位置 / /數組中以及鼠標的位置 VAR LF = circ.attrs.cx - circ.attrs.r RT = 2 * circ.attrs.r + LF, X = evt.clientX - LF = circ.attrs.cy - circ.attrs.r BTM = 2 * circ.attrs.r +頂部 Y = evt.clientY - 頂部; 紅色=(((128 * X)/(2 * circ.attrs.r))-1)* I / 6, 綠色= 256 - ((((128 * X)/(2 * circ.attrs.r))-1)* I / 6), 藍色=(((128 * Y)/(2 * circ.attrs.r))-1)* I / 6; rect.attr(“填寫”,“RGB(”+紅+','+綠色+“,”+藍色+')'); }); });
這個例子是運行在這裡 ,但你可以看到在下面的快照,每個欄的顏色是依賴鼠標位置以及在圈欄的順序。
所以你可以看到$node是一個有用的快捷鍵,但沒有壯觀。 這真的是美妙的,如果你創建與RaphaelJS的每一個SVG的對象可以觸發自定義事件 。 這將使您的個人繪圖元素觸發自定義事件,並在頁面上什麼都可以聽和回應。 在許多方面,這可能是有用的。 對於初學者來說,它提供了豐富您的圖紙之間的相互作用。 一個向量的用戶交互,現在可以通知任何其他媒介的互動需求。 這意味著你可以編程火某些條件得到滿足時,從您的圖紙事件。 這不僅讓你的圖紙,以通知其他載體,但頁面上的任何東西都可以聽英寸
紙=拉斐爾('rcanvas',600,800); 中國保監會= paper.circle(350,200,100)的attr({填寫:“粉紅”,行程:'黑'}); / /矩形和圓形陣列 VAR I = 0,矩形= [],圓= []; (我<10; I + +){ rectangles.push(paper.rect(0,40 *,40 *,20)的attr({填充:'紅',中風:'黃'})); circles.push(paper.circle(0,0,20),隱藏()); } Y.Array.each(矩形,功能(矩形,索引){ I =指數+ 1; 中國保監會。node.on(MouseMove事件',函數(EVT){ VAR LF = circ.attrs.cx - circ.attrs.r RT = 2 * circ.attrs.r + LF, X = evt.clientX - LF = circ.attrs.cy - circ.attrs.r BTM = 2 * circ.attrs.r +頂部 Y = evt.clientY - 頂部; newWidth =(((256)/(2 * circ.attrs.r))-1)* I / 6, 紅色=(((128 * X)/(2 * circ.attrs.r))-1)* I / 6, 綠色= 256 - ((((128 * X)/(2 * circ.attrs.r))-1)* I / 6), 藍色=(((128 * Y)/(2 * circ.attrs.r))-1)* I / 6; / /這個時間,不僅改變顏色,但也矩形的寬度 rect.attr({ 寬度:newWidth, 填寫:“RGB(”+紅+','+綠色+“,”+藍色+')' }); / /觸發自定義事件通知,這個矩形的寬度改變 rect.fire(寬度改變',{寬度:newWidth,來源:矩形,順序為:指數}); }); / /每個矩形得到一個監聽器寬度改變觸發 rect.on(寬度改變,功能(EVT){ VAR ATTRS = evt.source.attrs; / /獲得相應的圓圈,將它移動到矩形的右端 界[evt.order]。ATTR({ CX:attrs.x + attrs.width, CY:attrs.y, 填寫:“矢菊花” 。})秀(); }); });
以在這裡看看這個運行的例子。 你還可以看到從快照低於各界正在繪製矩形的右端。 這的現象發生反應,被捕獲的圓圈移動到當前矩形的屬性的相對位置的一個處理程序,每一個人的矩形的自定義事件觸發。
這開闢了一些有趣的possiblities YUI3 RaphaelJS內。 例如,如果我們可以創建一組矢量形狀,同組的觸發事件向外部世界的實體本身? 內部,每一個矢量繪圖可以溝通通過自定義事件與它的容器,容器將作出決定哪些數據觸發到外面的世界。 這開闢了完全封裝的,互動的SVG控制的想法。
總結
與HTML5和其衛星技術的優勢地位,有這麼多的更多的選擇,豐富的互動閃光以外。 理想的情況下,頁面上的任何向量元素應該完全訪問和標準化。 這開闢了為我們的精彩possiblities而不訴諸到Flash中創建的訪問,標準的網絡控制。 SVG是一種吸引人的選擇,因為矢量繪製在頁面上的每一個DOM節點的支持,我們可以與YUI的修改,就像任何其他的DOM節點。 這是什麼允許的RaphaelJS庫模塊 ,以增加被由RaphaelJS創建所有的SVG對象,這是一個豐富的互動與頁面上的這些別處elments的關鍵。
共享和擴展: 書籤del.icio.us Digg它! | reddit!
9評論
很抱歉,評論已被封閉,在這個時候。





如果你看一下內部拉斐爾,有點超過三分之一與SVG的大致相同數量的VML代碼。 是否有機會得到YUI的條件加載在這裡工作或有牌/努力屏障金額在拉斐爾本身的分裂,並主持? (方組合的好處加載實際工作)
評論由卡爾·G - 2010年9月27日, #
兩件事情:
1)拉斐爾是一個SVG的包裝*和* VML和包含的東西,在這兩種工作。 當你鼓勵的擴展,你不警告,多次將無法在IE瀏覽器的民俗。 如果他們不關心,罰款,但你應該提醒他們。
2)你邀請人們到一個痛苦的世界,在推薦節點的訪問。 數的操作導致節點重新建立,所以你的事件處理程序和您的Y.Node將丟失或刪除對象(其中每個版本之間SVG / VML的變化)。 最後節點的內容不同平台上,不僅是一個單一的節點 - 尤其是當你考慮到的文字,你至少有一個對象,每個字符 - 多次,鼠標事件處理程序引發墨水,當用戶所期望的細胞被激活。
克利福德希思 - 9月27日,2010 #
偉大的書面記錄和演示,
既然你是一個Y!“呃黑客拉斐爾離開,也許你知道一些細節上的圖形/圖表YUI的努力的最新?
或許是建立在拉斐爾的頂部?
我是拉斐爾的粉絲,但他們的圖表資料庫離開有點不理想,以及一些例子的原始圖表創建與-O-盒拉斐爾方式更多的功能/互動
很想看到某個y! JS魔術灑在這方面
內特- 9月27日,2010 #
感謝您的反饋。
卡爾:如果我正確理解你的想法工作,我將不得不打破raphael.js文件到SVG和VML部分。 我不打算上觸摸RaphaelJS庫,所以它的負荷可能會留是。
@克利福德:(1)這是一個好點的人帶來上的Raphaeljs的郵件列表,以及。 我不是特別關心這個畫廊工作模塊在IE瀏覽器,但認為是一種奢侈。 它仍然需要在IE瀏覽器測試(雖然我認為它會正常工作)。 我要在IE中運行此模塊測試下週,所以我就知道肯定。 在此期間,我將提出警告了模塊的頁面上。 (2)感謝的抬頭。 它讓我知道如果我能找出導致節點被重新操作,並確保新節點屬性在Y.Node包裹。 我是潛水在RaphaelJS深刻得多很快,所以我會保持這條軌道,並希望能夠重新YUI節點屬性,每個節點會破壞操作。
內特:我知道的一些細節,但我讓YUI團隊處理他們的業務。 ;)。 不過,我很有趣的一些JS魔術銳灑在新的HTML5圖形操場。
由馬修·泰勒- 9月27日,2010 #
你知道,如果這種技術或類似的技術將與HTML 5 canvas元素。 如果我把網頁上的HTML 5的畫布,在矩形是有可能在畫布上的矩形鼠標事件。
如果我的HTML5頁面包含以下。
此文字顯示,如果您的瀏覽器不支持HTML5畫布。
例如= document.getElementById('例如');
VAR上下文= example.getContext('2 D');
context.fillStyle =“RGB(255,0,0)”;
context.fillRect(30,30,50,50);
我從這個網站:
http://en.wikipedia.org/wiki/Canvas_element
這是可能的不同形狀的畫布上使用YUI拿起鼠標事件。 是有可能像在畫布上到你元素在RaphaelJS做類似的矩形Y.Node包裝的東西。
謝謝
約翰- 9月28日,2010 #
您的評論:
“
如果你創建與RaphaelJS的每一個SVG的對象,可能會觸發自定義事件。
“
盡快檢討一套完整的事件與拉斐爾輕鬆準備...
http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
您可以指定這些到拉斐爾對象...
查爾斯 - 9月28日,2010 #
約翰:繪製在畫布上標記,拉斐爾和SVG(VML)的比是一個非常不同的運動。 向量的狀態,可以移動,動畫,互動與。 在畫布上的畫是更象位圖圖形。 一旦你畫的東西,它被卡住有畫布背景的一部分,我不知道究竟是如何的用戶交互工作。
由馬修·泰勒- 9月28日,2010 #
查爾斯:是的! 能夠訪問SVG的節點,是這些類型的用戶交互好,我演示使用這些頗有幾分。 我談論的自定義事件的類型是正常的DOM事件的範圍之外的事件。
在我上面
width-changed最後一個例子 ,你可以看到,每個矩形發射width-changed事件時,他們的大小。 這些事件可以捕獲該事件的註冊頁面上的任何。 這是每圈如何被移動到適當的位置,為矩形的大小。當然,這一切的催化劑是大圈,這是他們的事件,我想你指的是類型的
mousemove事件的發生。 請糾正我,如果我錯過了一些東西。由馬修·泰勒- 9月28日,2010 #
@約翰,
這是可能的,但凌亂。 你必須保持一個興趣點的記錄(即散列),然後連接到canvas元素的聽眾。 當你得到一個事件,你需要採取的XY坐標和您的興趣點的哈希比較,然後可能觸發一個自定義事件。
我已經做了與YUI2此,創建一個雷達圖,讓你點擊的數據點在圖表上獲取信息,並添加數據,由點擊軸tickmarks,。 與excanvas工程和IE瀏覽器,也有對我來說是一個形象(雖然IE瀏覽器是慢)的優勢。
然而,這是所有點,和一個在該點的數量相當有限,所以檢查如果鼠標是有趣的地方沒有太多的工作。 但與地區,我懷疑這會變得過於昂貴,你可能要想想,只是聽“mousein”(即交叉線),而不是鼠標懸停的一種方式。 即使點,你必須做一些掃描,點像素,並期待用戶點擊精確的像素不為方便用戶交互!
你可以做的“動畫”,有點過,但涉及的畫布每次重繪,所以他們比動畫更過渡。 我創建了一個簡單的事情,我知道不會改變太多(如軸)我用帆布繪圖調用填補RenderStack,然後觸發棧,所以我不會做數學每次。 但我不知道多大的差別,真正使,它仍然是緩慢的一切IE瀏覽器和快速!
馬特
馬特·帕克 - 9月29日,2010 #