日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

快速上手RaphaelJS--RaphaelJS_Starter翻译(二)

發布時間:2025/4/16 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速上手RaphaelJS--RaphaelJS_Starter翻译(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上篇博文我們講述了使用RaphaelJS去繪制一些靜態矢量圖的知識,從現在開始我們來講述如何去操作這些畫好的矢量圖。本篇內容對應原書的33頁及以后內容。已經拿到英文原版書的同學們也可以對應著去試讀這篇博文。我也是邊學邊寫,所以如果發生一些錯誤翻譯和理解偏差,還得請大家及時指出以便修改。

? ? ??操作Raphael元素的樣式

? ? ? 在上篇的內容中,我們已經提到了一個方法是attr()方法,是給一個Raphael圖形添加樣式及屬性定義的方法。我們要修改一個元素的樣式和屬性也可以使用attr方法來進行。上篇中我們聲明了一個rect對象,這里我們可以來修改它的樣式:

rect.attr('fill','#ddd');?

這行代碼將會把我們繪制好的矩形修改成為內部填充褐色。也就是說,attr()其實相當于mysql里面的insert into語句中的on duplicate key update,沒有我就添加有我就更新這樣子執行方式。

? ? ? Raphael元素的變換

? ? ??Raphael其實提供了好幾個方法供大家調用來變換元素,但是其中幾個的方法都是不推薦的。唯一推薦的元素變換方法是transform()方法。transform方法的參數與上篇最后的path命令串很相似,只不過這是transform命令串。它有4個命令:

T ? ? 平移

S ? ? 縮放?

R ? ? 按角度旋轉

M ? ? 變換矩陣

比如:"t100,100r30,100,100s2,2,100,100r45s1.5"

每個字母是一個命令。t是平移,r是旋轉,s是縮放,m是矩陣。

也有另類的“絕對”平移、旋轉和縮放:T、R和S。他們不會考慮到以前的變換。例如:...T100,0總會橫向移動元素100px,而...t100,0會移動垂直移動如果之前有r90,則發生了垂直移動,這個后面會有強調。上面的例子可以讀作“平移100,100;圍繞100,100旋轉30°;圍繞100,100縮放兩倍;圍繞中心旋轉45°;相對中心縮放1.5倍“。正如你可以看到旋轉和縮放命令的原點坐標為可選參數,默認的是該元素的中心點。

有一點需要注意,transform方法并不改變元素本身的任何狀態!無論你平移多少,transform執行后你獲得坐標信息仍舊創建元素時的坐標,但是transform的參數在變化。也就是transform的內容是你可以獲得的。無論你執行多少次transform,它保存著現在狀態和創建狀態之間的轉換內容,其實transform就是元素本身的一個屬性,而不是去改變元素的其它屬性。

原書中不介紹m矩陣的內容,這里我們暫時也不說這個命令,有時間補上。

這里的命令也有大小寫之分,也就是大小寫的執行結果可能會不同。比如我們執行r90t100 和r90T100結果是不同的,我們在代碼里面執行一下就一目了然了:

?

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Raphael Test</title> </head> <body> <div id="my-canvas" style="width:140px;padding:0px;margin:0px;"> </div> <!--some html doms--> <!--some scripts--> <script type="text/javascript" src="../js/lib/raphael.js"> </script> <script type="text/javascript"> var paper = Raphael("my-canvas", 650, 400); var rect = paper.rect(20, 20, 60, 40).attr({ "stroke": "red"// border color of the rectangle }); var rect1 = paper.rect(20, 70, 60, 40, 20).attr({ "stroke": "yellow"// border color of the rectangle }); var rect2 = paper.rect(20, 20, 60, 40).attr({ "stroke": "red"// border color of the rectangle }).transform("r90t100,0"); var rect3 = paper.rect(20, 70, 60, 40, 20).attr({ "stroke": "yellow"// border color of the rectangle }).transform("r90T100,0"); console.log("第一個矩形坐標是:(" + rect.attr('x') + "," + rect.attr('y') + ")"); console.log("第三個矩形坐標是:(" + rect2.attr('x') + "," + rect2.attr('y') + ")"); console.log("第三個矩形的轉換屬性是:"+rect2.transform()); console.log("第四個矩形的轉換屬性是:"+rect3.transform()); </script> </body> </html>

效果圖如下:

?代碼里面我們一共畫了4個矩形,2個直角矩形,2個圓角矩形。我們發下代碼里面創建矩形的時候,2個直角矩形的坐標是相同的,2個圓角矩形也是相同的。但是我們在創建的時候,其中一個直角和圓角矩形都執行了transform方法。直角執行了

transform("r90t100,0");圓角執行了: transform("r90T100,0"); 但是我們發現兩個參數出了大小寫不一致其余相同的,但是執行結果卻大相徑庭。是因為T執行了絕對平移而t是相對平移。什么意思?我想可能很多人會比較疑惑。絕對,就是無論其它什么變換我都不管不顧只會去執行我后面緊跟的參數,所以T執行的是不管你前面轉了90度還是沒轉,我都x軸平移100px。而相對,則是我轉了90度,我的頭部(假設元素都有一個頭部)本來朝右變成了朝下,x軸平移100px,好吧我向著x平移100px,但是實際是去y軸平移了100px,因為我本來指向x軸的頭部變成了y軸方向。我在瀏覽器控制臺打印了4句話,分別是2個直角矩形的坐標和2個矩形轉換后的transform的值。我們發現不論是不是發生了變換,并不改變元素的本身其它屬性。那么轉換屬性是怎么在dom里面體現的?我們通過firebug的dom查看機制來查看一下:

我們的svg標簽里面建立了4個rect節點,后面2個有transfrom屬性,里面的值存儲在一個矩陣里面。但是其它的屬性你比較一下就會發現沒發生改變,got it?

下面貼個動畫變動的代碼,有興趣的同學可以執行一下,因為我截圖無法體現動畫效果,就不截圖了。

?

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Raphael Test</title> </head> <body> <div id="my-canvas" style="width:140px;padding:0px;margin:0px;"> </div> <!--some html doms--> <!--some scripts--> <script type="text/javascript" src="../js/lib/raphael.js"> </script> <script type="text/javascript"> var paper = Raphael("my-canvas", 650, 400); var rect = paper.rect(20, 20, 60, 40).attr({ "stroke": "red"// border color of the rectangle }); rect.animate({ transform: "r90t100,0s1.5" }, 1000); // rect.animate({ // transform:"r90T100,0s1.5" // },1000); </script> </body> </html>

?上面的動畫能夠很清晰的看到變換的過程。講到這里,我們引出了Raphael的動畫方法animate。下面我們就開始講Raphael圖形的動畫效果。

Raphael圖形的動畫效果

Raphael的圖形動畫效果可以達到非常平滑的程度,并且任何屬性都可以,不論是顏色、透明度、寬度、高度還是其它細節。如果運行了上面那段小程序的,你就能感覺到了。簡單的方法,簡單的參數,卻收獲了很好的效果。Raphael的動畫效果方法是animate(),語法如下:

Element.animate({動畫屬性的鍵值對},動畫時間,緩動類型,回調函數);

緩動類型其實就是動畫過渡公式,是哪種類型的。主要有以下這些類型:

  • “linear”(線性)
  • “<”或“easeIn”或“ease-in” (由慢到快)
  • “>”或“easeOut”或“ease-out”(又快到慢)
  • “<>”或“easeInOut”或“ease-in-out”(由慢到快再到慢)
  • “backIn”或“back-in”(開始時回彈)
  • “backOut”或“back-out”(結束時回彈)
  • “elastic”(橡皮筋)
  • “bounce”(彈跳)

具體類型大家其實根據上面那個代碼就可以試驗一下。動畫時間是動畫的持續時間,毫秒為單位。回調函數是動畫執行完成后調用的函數。

rect.animate({transform: "r90t100,0s1.5"}, 1000,"bounce",function(){console.log("finish");});

? ? ? ?大家可以將上面我那段代碼的動畫效果改成上面這句話來看一下效果,發現矩形在變換過去之后會像小球落地一樣跳幾下才停下來。并且動畫完成后會執行回調函數,在firebug控制臺打印finish。其它的幾個效果,大家復制上面類型的內容到bounce位置替換它就可以了。

? ? ? 這里需要注意的是,開始那個動畫效果的鍵值對,里面除了transform還是可以其它屬性,高度、寬度、填充顏色、透明度等等都可以。里面的值是動畫完成后的最終屬性,比如我們在鍵值對里面有個"width":200,其意思就是動畫執行完時矩形的寬度變成200px。這個地方不要以為只有transform屬性才可以,其實所有屬性都可以的。不過最后還是要強調一下,盡管動畫效果看上去很好玩,但是這個方法是使用代價還是很高的,它相比其它方法要消耗更多的瀏覽器等資源。所以要有選擇地去使用這個方法,不要濫用。

? ? ?小結一下,本篇到現在位置已經講了attr()方法修改元素屬性,transform()方法執行元素變化,animate()方法制造動畫效果。重要的是,如果你親自去執行了那么動畫和變換,你會發現Raphael在這個方面做的非常好,動畫以及變換都非常平滑,沒有任何突兀的感覺。那么動畫和元素變換到此為止,我們接下來就要講到元素的事件綁定了,也就是業務開發中的核心部分,與用戶的交互才是任何程序最迷人同時也是最為難開發者的地方。但是這本書,坦白地說,這個地方做的比較差。它就講了一個click()和鼠標懸停mouseover()方法,而且都是一個例子就帶過了。本書其實比較短就短在這個地方了。攤開了講,這里講個百八十頁都沒問題,但是本書就講了一頁多點。我先照著書上面的代碼寫個我們的測試代碼貼出來:

<script type="text/javascript"> var paper = Raphael("my-canvas", 650, 400); var rect = paper.rect(20, 20, 60, 40).attr({ "fill": "green", "stroke": "red" // border color of the rectangle }); rect.click(function(){ alert("hahah!"); });

? ? ? ? ? ? ?// rect.mouseover(function(){
? ? ? ? ? ? ?// alert("wow");
? ? ? ? ? ? ?// });

</script>

? ? ? 大家把上面任意貼出來的代碼的Script內的內容換成這個即可,我們點擊矩形會發生alert事件,跳出提示框:"hahah!"。其實后面那個mouseover()和mouseout()等一樣處理方式。代碼是不是看上去很簡單?哪里有我說的那么復雜,還得百八十頁才能講明白?我這么說,是因為我從開始學習Raphael開始就一直在鼓搗事件問題并且還沒搞定。我們想象一下,我可以對面前的圖形做什么操作:點擊、雙擊、左鍵單擊、右鍵單擊、鼠標懸停、鼠標移出、鼠標按下、鼠標摁住拖動、鼠標按下的鍵抬起······你也許會說這都是日常js開發中會碰到的鼠標事件,花點時間總是能搞定的?這是實話,只要你仔細去研究一下,這些都不是什么大問題。但是,如果我還要用鼠標拉長圖形怎么辦?我拖動圖形的同時,如果覆蓋或者說碰撞了別的圖形怎么辦?我怎么確定我的點是不是點到一個復雜圖形里面了?我要點擊選擇一個元素然后鍵盤修改圖形的屬性能不能做到?當一個圖形被另外一個圖形包裹,我點擊操作怎么確定是哪個元素?這里究竟有多少個坑,我想想都頭大。最令人頭疼的是,我剛才問的所有問題,都是我現在的工作需要解決的問題。這段話,如果你只是用Raphael去繪制圖形,并不對它做什么復雜操作,那么你可以無視它了。我們還是要先把書翻譯完成。為了不打斷本書的翻譯流程,我們的元素事件的話題將會另起一篇博文來進行講解和探討。

總結

以上是生活随笔為你收集整理的快速上手RaphaelJS--RaphaelJS_Starter翻译(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av私库在线观看 | 高h在线观看 | 91黄色看片 | 新亚洲天堂 | 性生活视频播放 | 国产91一区二区三区 | 日韩不卡一二三区 | 久久久久99精品成人片直播 | 草草影院国产 | 亚洲av无码不卡 | 国产日产精品一区二区 | 欧美激情综合网 | 国产aⅴ无码片毛片一级一区2 | 亚洲aaaaaa| 老司机深夜网站 | 99久| 午夜va | 国产精品欧美激情在线 | 欧美大片免费观看 | 国产专区欧美专区 | 丰满人妻一区二区三区53 | 天天干天天干 | 伊人网视频在线 | 国产精品无码影院 | 99色在线视频 | 黑人极品ⅴideos精品欧美棵 | 亚洲成人天堂 | 性欧美大战久久久久久久免费观看 | 黄网在线观看视频 | 午夜天堂影院 | 成人图片小说 | 337p粉嫩日本欧洲亚洲大胆 | 日韩精品二区在线观看 | 日韩在线一卡二卡 | 蜜桃视频一区二区在线观看 | 国产成年人网站 | 五月综合激情日本mⅴ | 最新国产拍偷乱偷精品 | 亚洲 小说区 图片区 都市 | 久久久无码一区二区三区 | 日韩av中文在线 | 欧美成人三级在线播放 | 欧美日韩在线播放三区四区 | 久久久77| 欧美精品 在线观看 | 欧美毛片免费看 | 亚洲最大的网站 | 亚洲综合少妇 | 日日骚av一区二区 | 亚洲在线精品视频 | 一级伦理农村妇女愉情 | 久久久精品人妻一区二区三区色秀 | 日本亚洲欧美 | 干美女少妇 | 国产一区二区三区免费观看视频 | 久久国产电影 | 精品三级视频 | 国产日韩在线一区 | 黄色片网站免费观看 | 青青成人网 | 国产精品一区久久 | 亚洲婷婷在线视频 | 亚洲av综合色区无码一区爱av | 成人国产av一区二区三区 | 毛片入口| 欧美日韩一区电影 | 成人亚洲欧美 | 成人网页在线观看 | 五月婷婷激情小说 | aaa在线播放 | 在线观看的黄色网址 | 成人在线中文字幕 | 日本中文字幕视频在线 | 久久99久久久久久 | 亚洲精品第三页 | www.夜夜| 77777av| 国产欧美一区二区三区精华液好吗 | 精品人妻一区二区三区日产乱码 | 欧美日韩1区2区 | 国产又粗又黄又爽视频 | 巨乳动漫美女 | 日本老小玩hd老少配 | 啪啪亚洲 | 日本午夜在线 | 亚洲高清视频在线 | 69视频一区二区 | 337p亚洲欧洲色噜噜噜 | 国产免费高清视频 | 国产精品无码成人片 | 国产任你操 | 永久免费av无码网站性色av | 国产a免费视频 | 国产三级做爰高清在线 | 高清免费av | 久久国产激情视频 | 污污软件在线观看 | 亚洲免费高清 | av第一页 |