效果如圖所示,儘管看上去並非很美觀,可是,基本上的功能仍是已經完成了,碼了一天多的時間,權當作複習一下js吧。javascript
整個作下來差很少碼了500多行代碼~其實只是不少的樣式也包括了在其中了,雖然代碼有點多,可是不少地方仍是能夠優化的。html
做爲新手,優化什麼的先滾一邊了,如今主要的是本身要懂對吧~若是感受能對你有所幫助,不嫌棄的話就看看吧。java
①找好一張樣式圖片;閉包
②分析樣式佈局……app
③涉及到的相關事件:click(單擊事件)、mouseover(鼠標覆蓋)、mouseout(鼠標離開)……編輯器
④閉包:做爲一個插件,須要避免和其餘插件產生衝突,如變量、方法啥啥啥的,因此就須要使用到閉包,就先階段我對閉包的理解,實際上是很簡單的,若是不清楚的話,看百度,上面有不少各類各樣的寫法……函數
⑤碼代碼……佈局
很簡單,一個輸入框、入口js還有就是寫的js插件……學習
<!DOCTYPE html> <html> <head> <title>原生的日曆插件</title> </head> <body> <input type="text" name="time" id="container" class="calender-plugin"> <script type="text/javascript" src="./calender.js"></script> //須要注意引用順序 <script type="text/javascript" src="./main.js"></script> //這個就是所謂的「入口」函數,我取的名 </body> </html>
就是對js插件的調用,一句代碼……優化
window.onload = function(){ CalenderPlugin('container',{ width:298, height:192 }); }
CalenderPlugin:插件的方法名稱
container:input輸入框的id
{ width:298, height:192
}:自定義的相關參數(有好幾個,這裏我只定義了兩個,它可以覆蓋默認的相關參數)
由於所有都是採用js來完成的,代碼有點多,若是須要能夠直接複製粘貼到本身編輯器中。
;(function(window,document){ var date = new Date(); //默認參數 var params = { width:300, height:400, borderRadius:3, backgroundColor:'#B4B4B2', weekendTitleBg:'#989896',//星期的背景顏色 year:date.getFullYear(), month:date.getMonth()+1, day:date.getDate(), scope:'1946-2118',//年 查詢範圍 } var CalenderPlugin = function(element_id,options){ //判斷當前對象是否已經建立 instanceof:判斷對象類型 //若是當前對象爲空,則不能調用其自身所定義的標準相關屬性 if(!(this instanceof CalenderPlugin)) return new CalenderPlugin(element_id,options); if (element_id==null || element_id==undefined || element_id=='') { console.error("You haven't binding Element to showing Calender !!!!!!"); return; } this.params = this.extend(params,options); this.init(element_id,this.params) } //爲這個函數規定本身的標準 CalenderPlugin.prototype = { //調用入口 init:function(element_id,options){ this.bind(element_id, options,this); }, //擴展函數 用來規定用戶指定參數 - 默認參數之間的擴展 //當用戶有規定相關的參數,則以用戶爲主,不然以默認參數爲主 extend:function(opt1,opt2){ if (opt2!=undefined || opt2!=null) { if(typeof(opt2)!="object") return console.error("This "+typeof(opt2)+" is Belong object"); } for(var i in opt2){ for(var j in opt1){ //相同屬性,則覆蓋 if (i === j) { opt1[j] = opt2[i]; } // 不一樣屬性,則添加 else{ opt1[i] = opt2[i]; } } } return opt1; }, //建立日曆樣式 create:function(element_id,e,opt,cp){ //日曆容器 var share = document.createElement('div'); share.style.position = 'absolute'; share.id = 'calender-container-share'; share.style.width = '100vw'; share.style.height = '100vh'; share.style.top = 0; share.style.left = 0; share.style.zIndex = '998'; var div = document.createElement('div'); if (e.target.id === element_id) { div.className = 'calender-container-class-name' div.id = 'calender-container-id'; div.style.position = 'absolute'; div.style.width = opt.width +'px'; div.style.height = opt.height +'px'; //div.style.border = '1px solid '; div.style.top = e.clientY + 4 + 'px'; div.style.left = e.clientX + 'px'; div.style.zIndex = '999'; div.style.display = 'block'; div.style.borderRadius = opt.borderRadius + 'px'; div.style.background = opt.backgroundColor; div.style.opacity = '0.8'; share.appendChild(div); document.getElementsByTagName("body")[0].appendChild(share); } //生成日曆單元格 //表單 var form = document.createElement('form'); form.style.width = 100+"%"; form.style.height = 100+"%"; //頭部的選擇項 var header = document.createElement('div'); header.style.width = 100+"%"; header.style.height = opt.height/8+"px"; header.style.lineHeight = '1.5' // 年選擇 var year_select_container = document.createElement('div'); year_select_container.style.display = 'inline-block'; year_select_container.style.height = '100%'; year_select_container.style.width = '40%'; //左箭頭 var year_left_btn = document.createElement('div'); year_left_btn.id = 'calender-year-left-btn'; year_left_btn.style.width = '8px'; year_left_btn.style.height = '8px'; year_left_btn.style.display = 'inline-block'; year_left_btn.style.border = '2px solid white'; year_left_btn.style.borderTop = 'none'; year_left_btn.style.borderRight = 'none'; year_left_btn.style.transform = 'rotate(45deg)'; year_left_btn.style.position = 'relative'; year_left_btn.style.cursor = 'pointer'; year_left_btn.style.marginLeft = '10%'; year_select_container.appendChild(year_left_btn); //年 var year_label = document.createElement('div'); year_label.id = 'calender-year-label'; year_label.innerText = opt.year+'年'; year_label.style.color = 'white'; year_label.style.display = 'inline-block'; year_label.style.padding = '0 7%'; year_label.style.cursor = 'pointer'; year_select_container.appendChild(year_label); //右箭頭 var year_right_btn = document.createElement('div'); year_right_btn.id = 'calender-year-right-btn'; year_right_btn.style.width = '8px'; year_right_btn.style.height = '8px'; year_right_btn.style.display = 'inline-block'; year_right_btn.style.border = '2px solid white'; year_right_btn.style.borderTop = 'none'; year_right_btn.style.borderRight = 'none'; year_right_btn.style.transform = 'rotate(-135deg)'; year_right_btn.style.cursor = 'pointer'; year_select_container.appendChild(year_right_btn); header.appendChild(year_select_container); //月 var month_select_container = document.createElement('div'); month_select_container.style.display = 'inline-block'; month_select_container.style.height = '100%'; month_select_container.style.width = '28%'; month_select_container.style.float = 'right'; //左箭頭 var month_left_btn = document.createElement('div'); month_left_btn.id = 'calender-month-left-btn-id'; month_left_btn.style.width = '8px'; month_left_btn.style.height = '8px'; month_left_btn.style.display = 'inline-block'; month_left_btn.style.border = '2px solid white'; month_left_btn.style.borderTop = 'none'; month_left_btn.style.borderRight = 'none'; month_left_btn.style.transform = 'rotate(45deg)'; month_left_btn.style.position = 'relative'; month_left_btn.style.marginLeft = '10%'; month_left_btn.style.cursor = 'pointer'; month_select_container.appendChild(month_left_btn); //月標籤 var month_label = document.createElement('div'); month_label.innerText = opt.month+'月'; month_label.id = 'calender-month-label-id'; month_label.style.color = 'white'; month_label.style.display = 'inline-block'; month_label.style.padding = '0 7%'; month_label.style.cursor = 'pointer'; month_select_container.appendChild(month_label); //右箭頭 var month_right_btn = document.createElement('div'); month_right_btn.id = 'calender-month-right-btn-id'; month_right_btn.style.width = '8px'; month_right_btn.style.height = '8px'; month_right_btn.style.display = 'inline-block'; month_right_btn.style.border = '2px solid white'; month_right_btn.style.borderTop = 'none'; month_right_btn.style.borderRight = 'none'; month_right_btn.style.transform = 'rotate(-135deg)'; month_right_btn.style.cursor = 'pointer'; month_select_container.appendChild(month_right_btn); header.appendChild(month_select_container); form.appendChild(header); //星期標題 var weekendTitle = document.createElement('div'); weekendTitle.style.width = 100+"%"; weekendTitle.style.height = opt.height/9+"px"; weekendTitle.style.background = opt.weekendTitleBg; var weekends = ['日','一','二','三','四','五','六']; var w_table = document.createElement('table'); w_table.style.width = 100+"%"; w_table.style.height = 100+"%"; w_table.style.color = "white"; w_table.style.textAlign = 'center'; w_table.style.fontSize = '7px'; var w_row = document.createElement('tr'); for(var i in weekends){ var w_column = document.createElement('td'); w_column.innerText = weekends[i]; w_row.appendChild(w_column); } w_table.appendChild(w_row); weekendTitle.appendChild(w_table); form.appendChild(weekendTitle); //日期表格 var table = document.createElement('table'); table.style.width = 100+"%"; table.id = 'calender-days-table'; table.style.height = opt.height - (header.style.height.substring(0, header.style.height.indexOf('p'))) - (weekendTitle.style.height.substring(0, weekendTitle.style.height.indexOf('p'))) +"px"; table.style.textAlign = 'center'; table.style.fontSize = '7px'; table.style.color = 'white'; form.appendChild(table); div.appendChild(form); this.bind(element_id, opt,cp); }, //事件綁定 //change()和getDate()原本也屬於事件綁定 //可是因爲,有些方法須要進行重複的調用,因此避免引發事件的循環調用,因此分開寫 bind:function(element_id,opt,cp){ document.addEventListener("click", function(e){ //判斷是否已經存在日曆容器,則先清除,再建立 排除自身 if (document.getElementsByClassName('calender-container-class-name').length >0 && e.target.id === 'calender-container-share') { var el = document.getElementById('calender-container-share'); document.getElementById('calender-container-share') .parentNode.removeChild(el); } if(document.getElementsByClassName('calender-container-class-name').length >0){ return; } if(e.target.id !== element_id){ return; } cp.create(element_id,e,opt,cp); cp.build(element_id,opt,cp); cp.change(element_id,opt,cp); }, false); }, // 當年、月發生改變時觸發 change:function(element_id,opt,cp){ // 減小一個月 if(document.getElementById('calender-month-left-btn-id') != null) document.getElementById('calender-month-left-btn-id') .addEventListener('click', function(e){ if(opt.month>1 && opt.month <=12) opt.month = opt.month - 1; cp.build(element_id,opt,cp); }, false); // 加一個月 if(document.getElementById('calender-month-right-btn-id') != null) document.getElementById('calender-month-right-btn-id') .addEventListener('click', function(e){ if(opt.month>=1 && opt.month <12) opt.month = opt.month + 1; cp.build(element_id,opt,cp); }, false); // 減一年 if(document.getElementById('calender-year-left-btn') != null) document.getElementById('calender-year-left-btn') .addEventListener('click', function(e){ opt.year = opt.year - 1; cp.build(element_id,opt,cp); }, false); // 加一年 if(document.getElementById('calender-year-right-btn') != null) document.getElementById('calender-year-right-btn') .addEventListener('click', function(e){ opt.year = opt.year + 1; cp.build(element_id,opt,cp); }, false); //選擇年 if(document.getElementById('calender-year-label') != null) document.getElementById('calender-year-label') .addEventListener('click', function(e){ var year_list = document.createElement('div'); year_list.id = 'year-list-id'; year_list.style.width = opt.width/5 +'px'; year_list.style.height = opt.height/2 +'px'; year_list.style.zIndex = '999'; year_list.style.position = 'fixed'; year_list.style.top = e.y + 'px'; year_list.style.left = e.x + 'px'; year_list.style.background = 'white'; year_list.style.border = '1px solid white'; year_list.style.opacity = '0.8'; year_list.style.overflow = 'scroll'; year_list.style.overflowX = 'hidden'; var ul = document.createElement('ul'); ul.style.listStyleType = 'none'; ul.style.padding = '0'; var years = opt.scope.split('-'); for(var i=years[0];i<=years[1];i++){ var li = document.createElement('li'); li.innerText = i; li.style.fontSize = '7px'; li.style.color = '#ff4747'; li.style.cursor = 'pointer'; ul.appendChild(li); } year_list.appendChild(ul); if(document.getElementById('year-list-id')==null){ document.getElementById('calender-container-id').appendChild(year_list); }; cp.getDate(element_id,opt); }, false); }, // 獲取時間 getDate:function(element_id,opt){ _this = this; //選擇日期是的點擊事件、hover if(document.getElementById('calender-days-table') != null){ var trs = document.getElementById('calender-days-table').childNodes; for(var i=0;i< trs.length;i++){ var tds = trs[i].childNodes; for(var j=0;j<tds.length;j++){ trs[i].childNodes[j].addEventListener('click', function(e){ document.getElementById(element_id).value = e.target.className; var el = document.getElementById('calender-container-share'); document.getElementById('calender-container-share') .parentNode.removeChild(el); }, false); trs[i].childNodes[j].addEventListener('mouseover', function(e){ e.target.style.border = '1px solid white'; e.target.style.opacity = '0.5'; }, false); trs[i].childNodes[j].addEventListener('mouseout', function(e){ e.target.style.border = 'none'; e.target.style.opacity = ''; }, false); } } } //下拉選擇年份 if(document.getElementById('year-list-id') !=null){ var lis = document.getElementById('year-list-id').childNodes[0].childNodes; lis.forEach(function(item,index){ item.addEventListener('click', function(e){ opt.year = new Number(e.target.innerText); _this.build(element_id,opt,_this); document.getElementById('year-list-id').parentNode.removeChild(document.getElementById('year-list-id')); }, false); item.addEventListener('mouseover', function(e){ e.target.style.background = 'rgb(195, 195, 193)'; e.target.style.color = 'white'; }, false); item.addEventListener('mouseout', function(e){ e.target.style.background = ''; e.target.style.color = '#ff4747'; }, false); }) } }, //構建數據表格 build:function(element_id,opt,cp){ //年份顯示 document.getElementById('calender-year-label').innerText = opt.year +'年'; // 月份顯示 document.getElementById('calender-month-label-id').innerText = opt.month +'月'; // 日期表格 var table = document.getElementById('calender-days-table'); if (table!=null) { var trs = table.childNodes; while(trs.length>0){ table.removeChild(trs[0]); } var year, month, day, days, last_month_days,//上個月天數 next_month_days;//下個月天數 year = opt.year; month = opt.month; day = opt.day; //生成一個時間對象 //爲了獲取到每一年每個月其中的一號是星期幾 var date = new Date(year,month-1,1); //日期行、列 switch(month){ case 1: days = 31; last_month_days = 31; if (year%4 == 0 && year%100 != 0){ next_month_days = 29; } else{ next_month_days = 28; } break; case 2: last_month_days = 31; next_month_days = 30; if (year%4 == 0 && year%100 != 0){ days = 29; } else{ days = 28; } break; case 3: if (year%4 == 0 && year%100 != 0){ last_month_days = 29; } else{ last_month_days = 28; } days = 31; next_month_days = 30; break; case 4: days = 30; last_month_days = 31; next_month_days = 31; break; case 5: days = 31; last_month_days = 30; next_month_days = 30; break; case 6: days = 30; last_month_days = 31; next_month_days = 31; break; case 7: days = 31; last_month_days = 30; next_month_days = 31; break; case 8: days = 31; last_month_days = 31; next_month_days = 30; break; case 9: days = 30; last_month_days = 31; next_month_days = 31; break; case 10: days = 31; last_month_days = 30; next_month_days = 30; break; case 11: days = 30; last_month_days = 31; next_month_days = 31; break; case 12: days = 31; last_month_days = 31; next_month_days = 31; break; default: return console.log("the month have "+ month+" ???"); } var o = 1; var l = last_month_days - date.getDay() + 1;//上個月開始時間 var n = 1;//下個月開始時間 for(var i=0;i<Math.ceil((days+date.getDay()+1)/7);i++){//計算表格多少行 var row = document.createElement('tr'); for(var j=0;j<7;j++){ var column = document.createElement('td'); column.style.cursor = 'pointer'; if (i==0 && o<= days) {//處理「每月1號」這個特殊日期 if(j>=date.getDay()){ column.innerText = o; column.className = year+"-"+month+"-"+o; o++; } else{//上個月時間 column.innerText = l; column.className = year+"-"+(month-1)+"-"+l; l ++; } } else{ if (o<=days) { column.innerText = o; column.className = year+"-"+month+"-"+o; o ++; } else{//下一個月 column.innerText = n; column.className = year+"-"+(month+1)+"-"+n; n ++; } } if (j==6 || j==0) { column.style.color = '#ffb714'; } row.appendChild(column); } table.appendChild(row); } } this.getDate(element_id,opt); } }; window.CalenderPlugin = CalenderPlugin; }(window,document));
~這個東西不清楚怎麼摺疊代碼塊,將就的看看吧~
只有不斷學習纔會進步,工資纔會高,老闆才能看你順眼,你才能選擇公司,選擇老闆!