關于dojo的下載下傳,請檢視:
https://dojotoolkit.org/download/
建議下載下傳full source版
如果需要讨論,請評論、或者站内信,我會盡快回複。
(1)加載
①首先,先設定
<script>
//替代使用data-dojo-config,我們建立一個dojoconfig對象(是個設定)在我們調用dojo.js之前,他們功能相同
//這比通過一大堆設定來說,更易閱讀
var dojoconfig = {
async: true,
//這個代碼注冊了demo包的正确位置,于是我們可以調用dojo從cdn,并且同時還能加載本地子產品
packages: [{
name: "demo",
location: location.pathname.replace(/\/[^/]*$/,'') +'/demo'
}]
};
</script>
②要加載dojo.js檔案:
<script src="dojo/dojo.js"></script>
③最後,另開一個script,加載自己需要的插件,加載方式為使用:
require ( [插件],回調函數);
插件的值用單引号包括,用逗号分隔不同插件,都放在方括号裡;
回調函數可以直接輸入函數function(參數),參數填寫插件名,如果多個插件,用逗号分隔。
如例:
<script>
require([ //這行表示要加載東西了,用哪個加載哪個||這些直接映射到檔案名,如果你下載下傳的dojo源分布 ,并期待在dojo目錄,你會看到dom.js和dom-construct.js檔案,這些檔案定義這些子產品。
'dojo/dom',
//加載dojo檔案夾下的dom插件(應該)
'dojo/fx',
//加載fx插件,這個插件包括一個滑動動畫(slideto),還有其他
'dojo/domready!'
//這個插件大概作用是,保證加載完畢後才執行,以免執行一個沒加載好的。
], //這行已經加載結束了
function (dom,fx) {
//這是一個回調函數(即加載完才執行的),參數有dom和fx(這個應該指的是插件)
var greeting = dom.byid('greeting');//得到id為greeting的元素,指派給greeting這個變量
greeting.innerhtml += ' from dojo!';//這個元素加入文本(+=)
//動畫部分,
fx.slideto({
node: greeting, //不懂
top: 100,
left: 500,
}).play();
} //這行是函數完
); //到這部分是require完
</script>
關于插件的加載:
回調函數中的順序,是按照插件的順序填寫的。否則就很可能會插件加載出錯!!而且這個bug莫名其妙!!!!!!!
(2)移動動畫
第一個參數是移動後的情況。但node:greeting指對id為greeting的元素進行操縱
這是一個動畫部分,他是回調函數内容的一部分,但顯然,單獨拿出來也是可以用的。
如:
st(dom,fx);} //調用st函數,st函數在下面定義
function st(dom,fx){
var greeting = dom.byid("greeting");//得到id為greeting的元素,指派給greeting這個變量
greeting.innerhtml += " from dojo!";//這個元素加入文本(+=)
fx.slideto({
node: greeting, //不懂
top: 100,
left: 500,
}).play();
} //這行是st函數完
(3)變寬變窄動畫
原型:(但需要在之前使用animateproperty=dom.byid("animateproperty");
basefx.animateproperty({
node: dom.byid("anim8target"),
properties: { borderwidth: 100 }
});
效果是獲得id為anim8target的東西為目标(node應該是操作目标的意思),
然後properties是把他變成什麼樣子(borderwidth應該是外邊框),
.play() 應該是動畫的意思。
代碼:
require([ //第一個參數,加載插件
"dojo/_base/fx",
"dojo/on",
"dojo/dom",
"dojo/domready!"
],
function(basefx,on,dom) {
//第二個參數,回調函數
var startbutton1=dom.byid("startbutton"),//得到id為startbutton的元素
reversebutton1=dom.byid("reversebutton"),//得到reversebutton的元素
animateproperty=dom.byid("animateproperty");//得到animaterproperty的元素(應該是動畫函數吧?),實測證明,這行如果被删除(并且上一行改成冒号),依然可以被運作 //這行如果前面的變量名被修改(下面不被修改),依然可以正常運作(不明白為什麼)
on(startbutton1,"click",function(){//on應該是當...的時候,比如放這裡,應該是某元素(上面指派的變量)當被按下的時候,調用函數後面的,但evt參數不知道有什麼用(不加也沒影響效果)
basefx.animateproperty({ //這行應該是說basefx插件的animateproperty函數(動畫函數),然後{}内應該是變化後的狀态,其中node指操縱的對象,properties指變成什麼樣子
node:anim8target, //這裡的是操縱對象
properties:{borderwidth:100} //properties操縱的是css屬性
}).play(); //操縱速度不在play
});
on(reversebutton1,"click",function(){
basefx.animateproperty({
node:anim8target,
properties:{borderwidth:1}
}).play();
注:
①borderwidth是外邊框;如果是width則是寬度,height是高度(不會導緻内部字型變形)
②操縱的目标是:
<button id="startbutton">變大</button>
<button id="reversebutton">變小</button>
<div id="anim8target" class="box" style="border-style:outset">
<div class="innerbox">a box</div>
</div>
③修飾這個目标有css屬性(不然外形會是預設外形,很大),可以認為是初始屬性
<style type="text/css"> /*設定盒子的樣式*/
.innerbox {
margin: 5%;
padding: 5px;
background-color: white;
}
.box {
position: absolute;
height: 200px; /*這裡必須加px*/
width: 200px; /*這兩個是外框的高和寬*/
background-color: #ddd;
border: 1px #eee;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: rgb(238, 238, 238);
border-right-color: rgb(238, 238, 238);
border-bottom-color: rgb(238, 238, 238);
border-left-color: rgb(238, 238, 238);
-moz-border-top-colors: none;
-moz-border-right-colors: none;
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
border-image-source: none;
border-image-slice: 100% 100% 100% 100%;
border-image-width: 1 1 1 1;
border-image-outset: 0 0 0 0;
border-image-repeat: stretch stretch;
padding: 5px;
padding-top: 5px; /*這裡的邊距指外框到内框的,上邊距*/
padding-right: 5px; /*右邊距*/
padding-bottom: 5px;/*下邊距*/
padding-left: 5px;/*左邊距*/
</style>
事實上應該不用這麼多
④效果是外框左上是淡灰色,右下是深灰色。
(4)設定動畫的開始和結束情況:
如代碼:
<script>
on(startbutton1, "click",
function () { //on應該是當...的時候,比如放這裡,應該是某元素(上面指派的變量)當被按下的時候,調用函數後面的,但evt參數不知道有什麼用(不加也沒影響效果)
basefx.animateproperty({ //這行應該是說basefx插件的animateproperty函數(動畫函數),然後{}内應該是變化後的狀态,其中node指操縱的對象,properties指變成什麼樣子
node: anim8target, //這裡的是操縱對象
properties: {
height: { end: 400, start: 100 },
//高度變化,初始是100(不受之前情況影響),結束是400
width: { end: 400, start: 100 }
}
//width:{end:400,start:100}//properties操縱的是css屬性
}).play(); //感覺play應該能操縱速率,但不知道怎麼用
});
①這個還可以用該對顔色進行變化。
(5)透明度與動畫速度
width: { end: 400, start: 100 },
opacity: { start: 1, end: 0.3 }
//opacity是透明度,最大1(不透明),最小0(透明)
},
duration: 3000 //這個是動畫速度
透明度是opacity,
速度(變化所用時間)是properties函數的第二個參數(第一個參數是設定動畫變換後的屬性)
(6)動畫過程的更多種形式
簡單來說,除了點到點的動畫之外,還有更多的可能。
而這些更多的可能,其位于插件dojo/fx/easing之中
插件需要:
dojo/fx/easing
dojo/_base/fx
例如模拟球體掉落,需要使用插件dojo/fx/easing,類型為(在animateproperty的第一個參數中放置):easing:
easing.bounceout ,
require(["dojo/_base/fx",
"dojo/dom",
"dojo/fx/easing",
//這個插件用于加載更多的動畫過程
"dojo/window",
//一個新的插件,應該是跟視窗相關的
"dojo/domready!"],
function (basefx, dom, easing, win, on) {
//5個參數(5個插件)
var startbutton = dom.byid("startbutton"),//開始按鈕
reversebutton = dom.byid("reversebutton"),//另一個按鈕
anim8target = dom.byid("anim8target");//操作對象
// 設定一對按鈕用于處理事件
on(startbutton, "click",
function (evt) { //開始按鈕在點選後觸發
// 得到我們視窗的尺寸
var viewport = win.getbox(win.doc);//變量被用于存儲視窗的資訊
basefx.animateproperty({
easing: easing.bounceout, //動畫,向下加速,會觸底4次後停止(類似球體從空中掉落的動畫形式)
duration: 3500,
node: anim8target,
// calculate the 'floor'計算地闆
// 然後減去東西的高度
top: { start: 0, end: viewport.h - anim8target.offsetheight }
//top(距離上面的距離為0,
//結束時,距離上面的距離是視窗高度(viewport.h)減去目前塊的高度( .offsetheight)
}).play();
on(reversebutton, "click",
function (evt) {
easing: easing.bounceout,
properties: { top: 0 }, //飛到最高
duration: 2000
效果是:
①按鈕1:摔下去,彈3次,第4次碰到地面(通過top設定)時停止。
②按鈕2:飛上去,彈3才,第4次碰到時停止;
①也可以斜着移動然後彈(彈往來的方向)
②也可以對字型大小(fontsize)之類的有效(例如從小變大,會反彈幾下再變成指定大小)
③對顔色有效:backgroundcolor:{start:"#0f0",end:"#f0f"}
④對透明度有效opacity
⑤注意:需要使用basefx.animateproperty({
easing:easing.bounceout,
node:目标,
其他修飾(比如要抵達的狀态),
})
使用插件basefx和插件easing
(7)關于各種圖像的各種:
如圖
offsetwidth的父為body
<a target="_blank" href="http://emn178.pixnet.net/blog/post/95297028-%e5%9c%96%e8%a7%a3offsetleft%e3%80%81offsettop%e3%80%81offsetwidth%e5%92%8coffsetheight">http://emn178.pixnet.net/blog/post/95297028-%e5%9c%96%e8%a7%a3offsetleft%e3%80%81offsettop%e3%80%81offsetwidth%e5%92%8coffsetheight</a>
基本來說,最裡面是text(文本區);
文本區有底紋,稱為填充區(padding);
填充區外面有邊框(border),邊框比填充區大;
邊框是元素的最外圍了(應該),再外圍是body标簽範圍。
(8)如何在style裡設定初始的top、left等
辦法是,例如:style=”position:absolute;left:100px”
即,必須先有:position:absolute或者是fixed或者是其他(但我不知道這有什麼用)
後面的設定才是有用的,否則是無用的。
(9)讀取目前的屬性
需要插件:dojo/dom-style,
函數需要傳遞參數:domstyle
使用指令:no_one_top = parseint(domstyle.get(no_one,
"top"));
①第一個no_one_top表示存儲這個值的變量;
②parseint() 函數應該是要将值轉換為數字;
③domstyle.get(no_one,”top”)這個函數,表示讀取no_one這個的top屬性;
關于第一個參數的解釋:
①假如有:no_one1 = dom.byid("no_one"); //對象1在之前
②no_one為id,加不加引号都能讀取這個id(無論有沒有①的存在);
③不加引号,可以變更為no_one1(有①的情況下),但加了引号的情況下,則不能讀取;
④疑問:假如有兩個id,分别為no_one和no_two;
然後,變量no_two= dom.byid("no_one"); no_one= dom.byid("no_two")
那麼調用no_one作為domstyle.get的第一個參數時,調用的是id為no_one還是no_two的?
(10)将兩個動畫合在一起
需要插件:dojo/fx
var mm=fx.chain([動畫1,動畫2]);
①裡面需要明确是調用哪個參數(對哪個機關進行操作);
②可以直接把動畫函數寫裡面;
③mm為自定義變量名,調用時,使用mm.play()即可。
(11)設定初始顔色
需要插件:dojo/dom-style
格式:
domstyle.set(目标對象,修改的屬性,目标值);
domstyle.set(container, "backgroundcolor", "#eee");
效果是:設定id為container,将其背景顔色(backgroundcolor)設定為顔色(#eee)
(12)在動畫開始之前
需要使用插件:dojo/aspect;
①假設有動畫mm是正常執行的,假設有動畫nn是預計要執行的。
②動畫調用之前,使用aspect.before(mm, “beforebegin”, nn);
③效果是,在mm動畫調用前,将執行nn動畫/函數,此時,相當于mm和nn一起執行(隻不過其執行所需的時間可能不同);
④但并非先執行完nn,才會執行mm
(13)在動畫結束之後
需要插件:dojo/on
格式為:
on(對象,
“end”, 回調函數);
例如:
on(anim, "end", function(n1, n2){
var mm =
duration:7000,
properties:{
backgroundcolor:{start:"#fff",end:"#000"},
},
node:container,
}); //mm定義完
mm.play();
}); // {是回調函數完,)是on完
(14)分拆動畫和執行動作
分拆前:
}).play();
分拆後:
精簡後;
執行的動作,比如達到的狀态等
在分拆後得到:
var mm = basefx.animateproperty({
即可。
理論上,對其他的也可行。實際上,也是可行的。
(15)常見錯誤:
①在basefx.animateproperty({})函數的“}”結束處加分号;
②在properties:()的後面沒有加逗号;
③在properties:()内部的屬性,例如top:100後面加了px(正常是不能加的);
④樣式表名在不同地方不一樣。例如:
背景顔色在css裡是background-color,但在dojo裡面是backgroundcolor
⑤檢視有沒有多一個括号,少一個逗号、分号之類的錯誤
(16)dojo/dom插件
①首先需要加載插件:dojo/dom
②其次需要在回調函數中使用:dom作為參數
③功能有:var mm=dom.byid(“某id”)
其效果類似document.getelementbyid(“某id”)
将其指派給mm(自定義變量名),于是mm就可以替代這一長串的文字了。
功能有(假如聲明了上面的):
①mm.innnerhtml,效果相當于document.getelementbyid(“某id”).innerhtml
替換文字
如函數:
function settext(node,text)//效果是給第一個參數的位置,用第二個參數的文字替代
{
node = dom.byid(node);
node.innerhtml = text;
settext(no1,"aaaaaa");
在id為no1的地方,将文字更改為text
(17)添加新标簽
①使用插件:dojo/dom-construct
《————之前這裡寫錯了
②參數:domconstruct
③格式為:
domconsrtuct.create (“标簽名”, 樣式,父标簽);
box = dom.byid("box");
no2 = dom.byid("no2");
domconstruct.create("div", //domconstruct.create開頭,第一個div為标簽
{ //第二個參數規定插入的各種東西
innerhtml:"six" //插入的文本内容
,box); //第三個參數為插入在哪個父标簽下
domconstruct.create("div",
innerhtml:"seven",
classname:"seven", //規定了插入的類型為seven,也可以是現有類型
style:{fontweight:"bold"} //規定了style,這裡字型寬度為bold
},box);
innerhtml:"three and a half",
classname:"smallerbox2",
style:{backgroundcolor:"#fff"}
},no1,"after"); //在no1标簽之後,最好用after,不太明白這個機制,特别是使用了偏移後的坐标時。
(18)常用功能(dojo用,與其他的文法可能不一樣):
功能
格式
字型寬度
fontweight
字型大小
fontsize
背景顔色
backgroundcolor
類名
classname
(19)移動标簽
标紅,搞定grid後回來補充
(20)發送請求
插件:dojo/request
參數:request
文法:
request.get (“連結”, { handleas: “json” }).then ( 回調函數);