天天看點

從零開始學_JavaScript_系列(五)——dojo(基礎,動畫移動,重力模拟,動畫合并,添加标簽)

關于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)關于各種圖像的各種:

如圖

從零開始學_JavaScript_系列(五)——dojo(基礎,動畫移動,重力模拟,動畫合并,添加标簽)

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 ( 回調函數);

繼續閱讀