成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

原生js練習(xí)題---第六課

tinyq / 2666人閱讀

摘要:自定義多級(jí)右鍵菜單實(shí)現(xiàn)效果自定義多級(jí)右鍵菜單第五課第六題中已經(jīng)通過(guò)事件實(shí)現(xiàn)了一級(jí)右鍵菜單,所以這題只要在上面再添加事件喚出子菜單即可。

0x1完美拖拽

實(shí)現(xiàn)效果:
6-01完美拖動(dòng)

這里沒(méi)有使用h5的拖動(dòng),畢竟原題也是考察借助鼠標(biāo)事件實(shí)現(xiàn)自定義的拖動(dòng),所以就借鑒了《js高級(jí)程序設(shè)計(jì)》里的自定義拖動(dòng)自己封裝了個(gè)拖動(dòng)api,當(dāng)然由于做這個(gè)系列題目使用的都是es5的語(yǔ)法,所以IE8往下就兼容不到了(有興趣的可以自己一試)。

首先有一個(gè)自定義的事件對(duì)象構(gòu)造函數(shù)EventTarget,內(nèi)部封裝了事件的監(jiān)聽、觸發(fā)、移除監(jiān)聽三個(gè)基本操作。再由EventTarget拓展一個(gè)和拖動(dòng)操作有關(guān)的單例對(duì)象,這個(gè)對(duì)象是的主要任務(wù)就是把指定元素上的觸發(fā)的鼠標(biāo)事件轉(zhuǎn)換為觸發(fā)我們自定義的拖動(dòng)事件,該對(duì)象接口方法介紹如下:

enable():開啟整個(gè)文檔上拖動(dòng)事件與鼠標(biāo)事件的關(guān)聯(lián)

disable():關(guān)閉拖動(dòng)事件與鼠標(biāo)事件的關(guān)聯(lián),也就是點(diǎn)擊時(shí)不再觸發(fā)自定義的拖動(dòng)操作

addHandler(eventName, handler):給相應(yīng)拖動(dòng)事件添加處理函數(shù)。注意由于拖動(dòng)事件是全局關(guān)聯(lián),所以若處理函數(shù)是針對(duì)指定元素的操作,不僅要先在該元素上添加class="draggable",而且在處理函數(shù)里還要判斷觸發(fā)事件的就是該元素才行

removeHandler(eventName, handler):移除指定的拖動(dòng)事件上的某個(gè)處理函數(shù)

再介紹下三個(gè)自定義的拖動(dòng)事件:

dragstart:由mousedown轉(zhuǎn)換而來(lái),事件對(duì)象的屬性有:

type: "dragstart"

target: 鼠標(biāo)點(diǎn)擊的draggable元素

clientX, clientY: 同mousedown

drag:由mousemove轉(zhuǎn)換而來(lái),事件對(duì)象的屬性有:

type: "drag"

target: 鼠標(biāo)點(diǎn)擊的draggable元素

clientX, clientY: 同mousemove

diffX, diffY: 用于校正clientX, clientY與實(shí)際要達(dá)到的拖動(dòng)位置的偏差。需在dragstart做指定,否則默認(rèn)值為0

dragend:由mouseup轉(zhuǎn)換而來(lái),事件對(duì)象的屬性有:

type: "dragend"

target: 鼠標(biāo)點(diǎn)擊的draggable元素

clientX, clientY: 同mouseup

api有了,我們就可以調(diào)用enable開啟拖動(dòng),再和原生的事件一樣給題目中的拖動(dòng)塊添加三個(gè)事件處理函數(shù)即可。只是要注意由于addHandler方法不能指定元素,所以還得在拖動(dòng)塊上添加class="draggable"、并在處理函數(shù)里做個(gè)判斷才行。利器在手,接下來(lái)要做的限制移動(dòng)范圍、展示坐標(biāo)、回放拖動(dòng)等都是小case啦,這題的代碼就當(dāng)是這套api的示例了。

0x2仿騰訊微博效果

實(shí)現(xiàn)效果:
6-02仿騰訊微博效果

這次來(lái)個(gè)大制作,只要再搭個(gè)后臺(tái)弄點(diǎn)數(shù)據(jù)交互,幾乎就是一個(gè)完整的webApp了。就頁(yè)面而言,主要就是實(shí)現(xiàn)表單獲取數(shù)據(jù)和數(shù)據(jù)列表的展現(xiàn),所以這里分別封裝了兩個(gè)單例MsgFormMsgList對(duì)應(yīng)表單和展示列表,來(lái)實(shí)現(xiàn)相關(guān)的功能。

MsgForm只提供了init方法來(lái)添加各個(gè)表單組件的事件監(jiān)聽。該部件最重要的就是對(duì)表單的驗(yàn)證了,既要有提交時(shí)的驗(yàn)證,也要保證能在輸入時(shí)即時(shí)給出字?jǐn)?shù)提醒。正則用的溜的話其實(shí)也不難。

至于MsgList則主要實(shí)現(xiàn)增刪DOM的操作,難點(diǎn)就是呈現(xiàn)和隱藏兩個(gè)動(dòng)畫的實(shí)現(xiàn)。這里利用setTimeout手動(dòng)調(diào)節(jié)出了效果,寫得還是比較ugly的,拓展性還不強(qiáng)。

最后注意幾個(gè)語(yǔ)法上的問(wèn)題,一是鍵盤事件也是可以使用輔助按鍵屬性:ctrlKey, altKey, shiftKey, metaKey,而不用像第五課做過(guò)的一題那樣去緩存按鍵了。第二就是用js獲取的css屬性值,不論是通過(guò)element.style還是window.getComputedStyle(),返回的都是字符串,所以要進(jìn)行運(yùn)算只能手動(dòng)轉(zhuǎn)為數(shù)字;這一點(diǎn)和js中獲取寬高、位置的屬性如offsetWidth等直接返回?cái)?shù)字不同。

0x3自定義多級(jí)右鍵菜單

實(shí)現(xiàn)效果:
6-03自定義多級(jí)右鍵菜單

第五課第六題中已經(jīng)通過(guò)contextmenu事件實(shí)現(xiàn)了一級(jí)右鍵菜單,所以這題只要在上面再添加事件喚出子菜單即可。

首先解決第五課第六題題在實(shí)現(xiàn)時(shí)留下的一個(gè)bug:菜單有時(shí)會(huì)顯示到容器外。原因很簡(jiǎn)單,由于是先定位菜單再顯示菜單,導(dǎo)致要依靠寬高的定位并不能起作用;所以這里保證菜單先顯現(xiàn)出來(lái)?yè)碛袑捀呒纯伞?/p>

然后就是實(shí)現(xiàn)多級(jí)子菜單了,這里直接使用css的hover偽類控制顯隱,只把定位交給mouseover事件來(lái)做即可。因?yàn)槿绻褂?b>mouseover和mouseout控制顯隱,由于冒泡的特性會(huì)導(dǎo)致移到子菜單前父菜單就已經(jīng)消失的問(wèn)題,雖然前面做過(guò)的題目有用過(guò)setTimeout延遲消失來(lái)解決這一問(wèn)題的,但這樣寫起來(lái)實(shí)在太丑陋了,不考慮兼容老舊瀏覽器情況下還是用css做更清晰高效。

至于如何定位,也是沿用第五課的思路:設(shè)置各級(jí)子菜單絕對(duì)定位;顯示菜單時(shí)先計(jì)算容器右側(cè)和底部的剩余空間;再分別判斷能否容得下子菜單的寬高,若容得下則子菜單出現(xiàn)在父元素右下角,否則就做出相應(yīng)的變化。

最后再總結(jié)遇到的幾個(gè)問(wèn)題:

子菜單定位時(shí)遇到的問(wèn)題:js的offsetTop, offsetLeft屬性獲得的都是相對(duì)父容器的位置而不是絕對(duì)位置,要獲取絕對(duì)位置必須進(jìn)行向上遍歷。

子菜單li元素的寬度不能容得下其文本內(nèi)容,導(dǎo)致文本折疊:不設(shè)置寬度的絕對(duì)定位元素,其寬度是由最長(zhǎng)的文本內(nèi)容決定的。若文本自動(dòng)換行那最長(zhǎng)文本就是最長(zhǎng)單詞而已,所以得設(shè)置white-space: nowrap;使文本不換行,才能保證li元素的寬度能夠容得下其所有文本內(nèi)容。而具體關(guān)于元素寬高為auto時(shí)其寬高在不同情況會(huì)受到什么影響,我會(huì)專門寫一篇文章來(lái)分析分析~

---第六課完---

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79424.html

相關(guān)文章

  • Vue.js六課 計(jì)算屬性

    摘要:計(jì)算屬性計(jì)算屬性關(guān)鍵詞。計(jì)算屬性在處理一些復(fù)雜邏輯時(shí)是很有用的。接下來(lái)我們看看使用了計(jì)算屬性的實(shí)例實(shí)例原始字符串計(jì)算后反轉(zhuǎn)字符串計(jì)算屬性的指向?qū)嵗龂L試一下實(shí)例中聲明了一個(gè)計(jì)算屬性。提供的函數(shù)將用作屬性的。依賴于,在發(fā)生改變時(shí),也會(huì)更新。 Vue.js 計(jì)算屬性 計(jì)算屬性關(guān)鍵詞: computed。 計(jì)算屬性在處理一些復(fù)雜邏輯時(shí)是很有用的。 可以看下以下反轉(zhuǎn)字符串的例子:實(shí)例 1 {{...

    only_do 評(píng)論0 收藏0
  • 六課 Html5常用標(biāo)簽 html5學(xué)習(xí)1

    摘要:標(biāo)簽的認(rèn)識(shí)一標(biāo)簽的分類雙標(biāo)簽如單標(biāo)簽如換行標(biāo)簽二標(biāo)簽的關(guān)系嵌套關(guān)系如與父子關(guān)系并列關(guān)系如與兄弟關(guān)系三排版標(biāo)簽標(biāo)題標(biāo)簽比較重要,一般用作網(wǎng)站的段落標(biāo)簽水平線標(biāo)簽單標(biāo)簽換行標(biāo)簽標(biāo)簽網(wǎng)頁(yè)布局標(biāo)親盒子四文本格式化標(biāo)簽文本加粗標(biāo)簽不推薦使用的加粗標(biāo)HTML標(biāo)簽的認(rèn)識(shí)一、標(biāo)簽的分類1、雙標(biāo)簽 如 2、單標(biāo)簽 如 換行標(biāo)簽 二、標(biāo)簽的關(guān)系1、嵌套關(guān)系 如 與title 父子關(guān)系2、并列關(guān)系如與 兄弟關(guān)系...

    siberiawolf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<