【JS】DatePicker組件開發(fā)

課程前言:

慕課網(wǎng) -- DatePicker組件開發(fā)


課程準備:

HTML筷转、CSS、JavaScript基礎(chǔ)岭妖、瀏覽器事件

靜態(tài)結(jié)構(gòu)的編寫、日歷數(shù)據(jù)反璃、數(shù)據(jù)渲染昵慌、事件處理


靜態(tài)結(jié)構(gòu)的編寫:

日期組件的結(jié)構(gòu)和樣式

header分為三部分,向上翻頁的button淮蜈,向下翻頁的button斋攀,還有就是中間的當前月份顯示。

body部分是一個表格的呈現(xiàn)梧田,分為兩個部分淳蔼,表頭是周一到周日的呈現(xiàn),表格內(nèi)容是每一個單元格就是一個日期裁眯。


組件的樣式命名鹉梨,會比較長(復(fù)雜),開發(fā)的是一個組件穿稳,那這個組件就會被應(yīng)用到各個頁面上俯画,如果過于簡單,就會跟頁面上的元素class命名沖突司草,帶來不必要的麻煩艰垂。因此,組件的樣式命名就比較獨特埋虹,可以長一點心软。

a元素實現(xiàn)按鈕秩冈,是因a自帶手形圖標潜腻。一般來說遂铡,可點擊的按鈕都需要一個提示。


靜態(tài)樣式的編寫:

box-shadow:給盒子一個懸浮于頁面的效果,box-shadow:2px2px8px2pxrgba(128,128,128,.3);

級聯(lián)選擇器:避免與外界發(fā)生沖突柬讨。background-color:#f0f0f0; 它是區(qū)別于白色的背景色崩瓤。為了使字體符號更像圖標,會設(shè)置字體的樣式踩官,font-family:Serif; a標簽有href屬性時却桶,就會有下劃線。

border-collapse:collapse;是說蔗牡,table中颖系,相鄰的兩個表格線會折疊一條。選中狀態(tài)下 shift+cmd+上下箭頭即上下移動辩越;


日期對象:

new Date (year,month-1,date) 其中嘁扼,月份需要-1.越界自動 進退位,還有 getFullYear() ,getMonth() , getDate() .

getYear() ?是說黔攒,距離 1900 年多少年趁啸,比如2017 getYear() 后就是 117年;但getFullYear() 就是 2017年了督惰。

getDay() 當前日期在一周中是周幾不傅。

當月第一天 new Date(year, month-1, 1) 日期指定1,月份是從0開始的姑丑,所以要-1,year也都是正常的 2017 呀等辞友。

當月最后一天 new Date(year, month, 0) 日期指定 0栅哀,月份是month,沒有減1称龙,其實就是下個月咯留拾,下個月的第0天,表示上一個月的最后一天鲫尊。(因月份的最后一天痴柔,不一定都是31,因此疫向,我們用 下一個月的 0 來表示 這個月的最后一天咳蔚。這是利用了日期的自動進退位。)

神奇的最后一天

星期一 到 星期天搔驼,[1,2,3,4,5,6,0] 谈火,這個數(shù)組是 getDay() ?的返回值。一個星期的開始舌涨,是從周天開始的糯耍,也就是0開始的,你知道為什么嗎???


獲取日歷數(shù)據(jù):

利用JS獲取日歷的核心數(shù)據(jù)

這個return和window很不錯哦

日期數(shù)據(jù)的渲染:

有時聊渲染温技,其實就是一個html革为。

渲染日期數(shù)據(jù)

整個過程細心就好了,其實就是比較繁瑣舵鳞。 < 小于號震檩,>大于號系任,因普通的跟看起來有點不同恳蹲,那就調(diào)整一下字體就好了。span中間是當前月份的顯示俩滥,都是從 monthData中拿到嘉蕾,前期數(shù)據(jù)的準備非常重要。


輸入框的展開與收起:

優(yōu)化著手點有兩方面:

1.當用戶點擊輸入框的時候霜旧,日期組件才可以顯示错忱,不能一打開頁面,它就在挂据,太不友好了以清;

2.目前的日期組件的主題結(jié)構(gòu) wrapper header body是占據(jù)文檔流的,如果頁面里還有其他的內(nèi)容崎逃,會因日期的出行掷倔,下移的,因此將其樣式改為絕對定位个绍。

元素的顯示與隱藏:方式很多樣勒葱;最通用是通過class來控制,默認是隱藏巴柿,除非多了一個 block 的樣式凛虽,后者覆蓋前者,wrapper就才顯示出來广恢。 ?.classList.remove 與 .classList.add 的 使用凯旋。 ?isOpen 布爾值 來記錄當前是關(guān)閉狀態(tài)還是展開狀態(tài)。

日期組件的絕對定位:目標是希望它出現(xiàn)在輸入框的下方钉迷,所以就要先找到輸入框目前在頁面的哪個位置呢: var left = $input.offsetLeft; ?var top = $input.offsetTop; ? var height = $input.offsetHeight; ? $wrapper.style.top = top + height + 9 +'px'; ? $wrapper.style.left = left + 'px';(切記至非,這里用style給寬高的時候,加上 px 呢糠聪。)

日期組件的展開與收起


月份切換:

本節(jié)課的出發(fā)點:左右按鈕切換時睡蟋,進入上一月,或者下一月枷颊。初始化的時候戳杀,給按鈕綁定事件该面。但這種情況,是在組件初始化的時候才有效信卡,事件只綁定了一次隔缀;但頁面渲染之后,內(nèi)容里是根據(jù)按鈕再重新渲染的傍菇,我們的按鈕也是感覺HTML字符串再重新渲染的猾瘸,因此就會有按鈕不斷的銷毀與重建。

月份切換的button

datepicker.render('prev')? datepicker.render('next') 是誰:

這個方法丢习,需要一個direction參數(shù)哦

日期點擊選中:

data-*是一個比較新的API牵触,老的瀏覽器不能使用。*是要替換成自己命名的字符咐低。為一個標簽添加一個此屬性后揽思,js取值的時候是: target.dataset.d; ? ? target:添加此屬性的標簽對象 ? ?dataset:固定寫法 ? ?d:添加的屬性名的后半部分,即data-*中“-”后自己命名的字符见擦。

日期小元素的選中
日期巧妙格式化

日期組件的使用:

JS的調(diào)用方法由繁入簡

調(diào)用方法由繁入簡钉汗,最后只有 .init 里,傳一個樣式鲤屡。

最后的頁面损痰,只有一個輸入框

而一個日期組件的出現(xiàn),就依靠這個輸入框了酒来。而這個輸入框的樣式卢未,因為不屬于組件,因此就寫在頁面里咯~


課程總結(jié)(組件開發(fā)流程):

使用HTML合理規(guī)劃組件結(jié)構(gòu)堰汉;

為組件編寫美觀的樣式辽社;

如何使用JavaScript獲取組件所需數(shù)據(jù);

將數(shù)據(jù)與HTML結(jié)構(gòu)結(jié)合衡奥;

用戶事件處理爹袁;

頁面的JS框架

整個日期組件的出現(xiàn)远荠,就是從 init 開始矮固,然后 init 在綁定相關(guān)的點擊操作之前,首先調(diào)用 render 來渲染這個的日期組件譬淳;然后档址,render里,寫的是 日期組件中的數(shù)據(jù)邻梆,還有左右兩邊的上下按鈕守伸;render里的數(shù)據(jù),則是從 buildUi 里來的浦妄,包括樣式尼摹,都是一致的见芹。


小技能:

var$input =document.querySelector('input');

$wrapper.classList.add('ui-datepicker-wrapper-show');

$wrapper.classList.remove('ui-datepicker-wrapper-show');

if(!$target.classList.contains('ui-datepicker-btn'))return;

if($target.tagName.toLowerCase() !='td')return;

不寫備注了,試試看蠢涝,能否想起來啦玄呛。



后續(xù)可完善的功能:

如何在移動端使用日期組件;

當頁面比較復(fù)雜的時候和二,如何處理徘铝,彈出框的位子;

如何標記上一個月與下一個月的日期惯吕,使它們擁有不同的樣式惕它;

某一些日期可點,某一些日期不可點废登。


寫在最后淹魄,寫給自己:

整個組件開發(fā)的核心,是日期數(shù)據(jù)的獲取钳宪,那老師都已經(jīng)給出思路了揭北,我是否愿意寫一寫可完善的功能;如果我覺得JS不那么的熟悉吏颖,是否可以使用React重新開發(fā)該框架呢搔体?如果想要重寫,大概要多久呢半醉?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疚俱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缩多,更是在濱河造成了極大的恐慌呆奕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衬吆,死亡現(xiàn)場離奇詭異梁钾,居然都是意外死亡,警方通過查閱死者的電腦和手機逊抡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門姆泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冒嫡,你說我怎么就攤上這事拇勃。” “怎么了孝凌?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵方咆,是天一觀的道長。 經(jīng)常有香客問我蟀架,道長瓣赂,這世上最難降的妖魔是什么榆骚? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮煌集,結(jié)果婚禮上寨躁,老公的妹妹穿的比我還像新娘。我一直安慰自己牙勘,他們只是感情好职恳,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著方面,像睡著了一般放钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恭金,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天操禀,我揣著相機與錄音,去河邊找鬼横腿。 笑死颓屑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的耿焊。 我是一名探鬼主播揪惦,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罗侯!你這毒婦竟也來了器腋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钩杰,失蹤者是張志新(化名)和其女友劉穎纫塌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讲弄,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡措左,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了避除。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎披。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驹饺,靈堂內(nèi)的尸體忽然破棺而出钳枕,到底是詐尸還是另有隱情缴渊,我是刑警寧澤赏壹,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站衔沼,受9級特大地震影響蝌借,放射性物質(zhì)發(fā)生泄漏昔瞧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一菩佑、第九天 我趴在偏房一處隱蔽的房頂上張望自晰。 院中可真熱鬧,春花似錦稍坯、人聲如沸酬荞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽混巧。三九已至,卻和暖如春勤揩,著一層夾襖步出監(jiān)牢的瞬間咧党,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工陨亡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傍衡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓负蠕,卻偏偏與公主長得像蛙埂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遮糖,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容