Part 6-2 JavaScript – 月曆表格框線處理
目前月曆表格日期第一列出現的白線來自於於calendar.css中下面對於月曆表格標題列(weekday)的css設定,我們設置了元素的border-bottom(框線-底部)格式 ( border-bottom: 1px solid white;),底線為白實線(solid white),當日期表格元素設為color時,就會出現上圖中的白色分隔線。
#calendar .weekday { font-size: 1.7vw; font-weight: 300; padding: 8px 0 5px; border-bottom: 1px solid white !important; }註:這邊出現!important的使用(終極指定格式宣告),相關說明請參考:CSS 的 !important 意義 CSS權重範例說明 在整個月曆表格中,我們有幾個設計必須維持 (以藍色為例):
- 藍色色塊與藍色色塊間的框線色彩為白色。
- 藍色色塊與白色色塊間的框線色彩為灰色。
- 藍色色塊跟邊界間的框線色彩為藍色。
<style media="screen"> #calendar tbody tr td[class*="color"] { border-right: 1px solid white; } #calendar tbody tr td[class*="color"]:first-child { border-left-color: inherit; } #calendar tbody tr td[class*="color"]:last-child { border-right-color: inherit; } #calendar tbody tr:last-child td[class*="color"] { border-bottom-color: inherit; } #calendar tbody tr:nth-child(5) td[class*="color"] { border-bottom-color: white; } #calendar tbody tr td[class*="prev-month-last-day"] { border-right: 1px solid #9C9C9C; !important; } </style>首先,我們要知道如何利用css語函定位出表格的每一個元素,表格元素的指定語法說明如下:
- class*="str" : 含有"str"
- class^="str": 以str寫開頭
- class$="str": 以str為結尾
var data = { current_day : { year : 1900, month : 0, date : 1, day : 0 }, calendar : { year : 1900, month : 0, date : 1 } }; function fillInMonth(){ document.getElementById("backYear").innerHTML = data.calendar.year; // 更新背景的年份 document.getElementById("cal-year").innerHTML = data.calendar.year; document.getElementById("cal-month").innerHTML = month2MonthName( data.calendar.month ); // 去掉原本表格中那個灰底id屬性 if (document.getElementById("current-day")) { document.getElementById("current-day").removeAttribute("id"); } let days = document.getElementsByTagName("td"); //將td標籤放入days物件集合中 var thisYear = data.calendar.year; var thisMonth = data.calendar.month; var thisDate = data.calendar.date; //取得今天的數字 var firstDateOfThisMonth = new Date(thisYear, thisMonth, 1);//建立今年今月1日的 Date日期物件 var firstDateDayOfThisMonth = firstDateOfThisMonth.getDay(); //取得今年今月1日是禮拜幾 if(data.current_day.year == data.calendar.year && data.current_day.month == data.calendar.month) { days[firstDateDayOfThisMonth + thisDate - 1].setAttribute("id", "current-day"); } // console.log(firstDateDayOfThisMonth); var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; //儲存每月的天數,其中2月為28或29 if ((thisYear % 4 == 0 && thisYear % 100 !=0) || (thisYear % 400 ==0)) monthDays[1]= 29; //若是閏年,2月設為29日 // 填當月的日期並清除格子的color類別設定 for (var i = 1; i <= monthDays[thisMonth]; i++){ //填今月日期在TD格子上,從今年今月1日是禮拜幾開始填1~今月天數 days[firstDateDayOfThisMonth + i - 1].innerHTML = i; days[firstDateDayOfThisMonth + i - 1].classList.remove("color"); days[firstDateDayOfThisMonth + i - 1].classList.remove("prev-month-last-day"); } //填上個月日期 // var prevMonth = thisMonth - 1; // if (prevMonth == -1) prevMonth = 11; prevMonth = (thisMonth - 1 + 12) % 12; for(var i = firstDateDayOfThisMonth - 1, d = monthDays[prevMonth]; i >= 0; i--, d--) { // console.log(i + " ,,, " + d); days[i].innerHTML = d; days[i].classList.add("color"); days[i].classList.remove("prev-month-last-day"); } if (firstDateDayOfThisMonth > 0) days[firstDateDayOfThisMonth - 1].classList.add("prev-month-last-day"); //填下個月日期 for(var i = firstDateDayOfThisMonth + monthDays[thisMonth], d = 1; i <= 41; i++, d++) { // console.log(i + " ,,, " + d); days[i].innerHTML = d; days[i].classList.add("color"); } }目前的程式連結:http://a02.fgchen.com/myCalendar/Part-6-2/ 註:我們要觀察程式對網頁內容的變更,可透過下面程式把網頁元素印出來:
console.log(document.getElementsByTagName('table')[0].innerHTML);最後, 我們把這個步驟的格式碼整理至css/calendar_border.css: 並在index.html中<head>... </head>加入:
<link rel="stylesheet" href="css/calendar_border.css">表格元素格式設定有關的學習資源: