整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          CCS小技巧,如何使用CSS Grid制作簡單的日歷,簡單有趣


          歷是人類文明的重要工具之一。然后可以記住許多重要事件,并從事件的確切日期追溯到真相。

          在本文中,我們將學習如何利用CSS Grid系統(最近在前端開發人員中流行的一種布局技術)來使用HTML和CSS設計日歷。以下是日歷的最終設計效果:

          制作HTML

          從圖片中我們可以看出日歷包含三個部分:月指標;工作日/周末指標;日期本身。

          編寫HTML的最佳方法是遵循正確的感覺。現在,我們將根據以下三個部分創建HTML:

          我們還應該能夠看到日歷上網格的七個列的需求。

          我們將重點放在上面的代碼.day-of-week和.date-grid上面的代碼上,因為現在我們只在談論網格。

          網格排列

          有兩種創建CSS Box的方法。第一種方法是在內部組合元素.day-of-week并.date-grid 成為一個選擇器。如果要這樣做,我們可以安排display: grid。如果執行此操作,HTML將是什么樣的:

          我們應該避免這種方法,因為HTML失去了它的結構意義,因為它結合起來,讓我們嘗試保存.day-of-week并date-grid 作為一個獨立的元素,如果可能的。因為這使得我們更容易閱讀/理解已經寫入的代碼。這是最好的HTML結構:

          創建具有簡單結構的CSS網格的最佳方法是使用子網格。但是,大多數瀏覽器尚不支持子網格。同時,最好的辦法就是讓兩個獨立的電網,一個是.day-of-week和一個.date-grid。因此,它可以解釋.day-of-week并.date-grid可以使用相同的七個柱網。

          實際日期調整

          2019年2月從星期五開始。如果我們希望日歷正確無誤,則需要確保:2019年2月1日為星期五;2019年2月2日為星期六;2019年2月3日是星期日等等...

          使用CSS Grid,可以簡化這一部分。

          CSS Grid的放置算法在某種程度上遵循以下規則(如果我們未將其設置grid-auto-flow為dense):放置具有顯式grid-column或grid-row第一位的項目;根據最后放置的項目填寫其余部分

          這表示:如果第一項屬于第6列;第二項將放置在第7列中。;第三項將放置在第一行的下一行中(因為只有七列);第四項將放置在第2列中等等...

          因此,如果我們將2月1日放置在第六列(星期五),則其余日期將正確放置。像這樣的簡單邏輯...

          以下是整個使用的代碼:源代碼HTML

          avaScript實現的日歷效果,如下圖所示:

          JavaScript實現的日歷效果圖

          可以嘗試在多個瀏覽器中,測試運行網頁的效果,我這里在如下幾個瀏覽器運行,如下圖所示:

          實現代碼如下:

          <!doctype html>

          <html lang="en">

          <head>

          <meta charset="UTF-8">

          <meta name="Generator" content="EditPlus?">

          <meta name="Author" content="">

          <meta name="Keywords" content="">

          <meta name="Description" content="">

          <title>Document</title>

          <style type="text/css">

          /*日歷標題樣式 */

          #divTitle

          {

          width:400px;

          height:30px;

          font-size:20px;

          color:#0000ff;

          text-align:center;

          }

          /*日歷表格布局樣式 */

          #divDate

          {

          width:400px;

          height:320px;

          border:4px solid gray;

          background-color:#ddd;

          padding-top:4px;

          font-size:20px;

          }

          /*日歷文字樣式 */

          .tableStyle

          {

          width:400px;

          height:300px;

          text-align:center;

          color:blue;

          }

          </style>

          <script type="text/javascript">

          var weekDays = new Array("日","一","二","三","四","五","六");//星期

          var days = new Array("31","28","31","30","31","30","31","31","30","31","30","31");//天

          var months = new Array("1","2","3","4","5","6","7","8","9","10","11","12");//月

          document.write("<div id='divTitle'>我的日歷</div>");

          var now = new Date();

          var month = now.getMonth();//獲得月份

          var day = now.getDate();//獲得日期

          var f = 1;

          now.setDate(1);

          var first = now.getDay();

          var str = new String();

          //在<div>中創建<table>標簽顯示日歷

          document.write("<div id='divDate'>");

          document.write("<table class='tableStyle'>");

          document.write("<tr>");

          //輸出周日到周六

          for(var t in weekDays)

          {

          document.write("<th style='height:25px'>"+weekDays[t] + "</th>");

          }

          document.write("</tr>");

          var rows = (parseInt(days[month]) + parseInt(first) + 7 ) / 7;

          //輸出日歷表格的行和列

          for (var i= 0 ; i < parseInt(rows) ; i++ )//日歷表格的行

          {

          document.write("<tr>");

          for (var j= 0 ; j < 7 ; j++ )//日歷表格的列

          {

          document.write("<td id="+f+">");

          if (i == 0 && j < first)

          {

          document.write("");

          }

          else

          {

          if (f == day)

          {

          document.getElementById(f).style.background = "red";//以紅色背景顯示"今天"

          }

          if (f > days[month])

          f = days[month];

          else

          document.write(f);

          f++;

          }

          document.write("</td>");

          }

          document.write("</tr>");

          }

          document.write("</table></div>");

          </script>

          </head>

          <body>

          </body>

          </html>

          這就是用JavaScript實現的日歷效果,請大家動起手來試試吧,展示你的實現效果。

          作為一名前端開發人員,設計師給的UI要實現日歷,找了找開源的項目,發現不是樣式不符合就是交互不符合,改源碼看不懂?頭都大,今天就教教大家用200行不到的代碼實現精美日歷(h5+微信小程序都適用)

          效果

          效果

          思路

          以window10系統的日歷為例,我們可以看出,一個月份的日歷組成總共為7列6行,日期有三個部分組成,1為上月由于該月第一天的周幾產生的空白部分,2為本月的所有天數,3,為6x7-(上月空白部分 + 本月天數)

          win10日歷

          開始寫代碼

          • 計算本月天數
           getDates (d, t = 0) {
           var curDate = new Date(d.replace(/-/g, '/'))
           var curMonth = curDate.getMonth()
           curDate.setMonth(curMonth + t + 1)
           curDate.setDate(0)
           var curDates = new Array(curDate.getDate()).fill(0).map((item, key) => {
           return key + 1
           })
           return curDates
           }
          

          getDates(d)中的參數d為該月的任意一天,方法放回該月有效的所有天數

          • 計算該月第一天是星期幾
           getWeek (d) {
           var curDate = new Date(d.replace(/-/g, '/'))
           curDate.setDate(1)
           return curDate.getDay()
           }
          
          • 計算該月+前后留白天數
           getFullChunkDates (d) {
           var curDates = this.getDates(d)
           var preDates = this.getDates(d, -1)
           var nexDates = this.getDates(d, 1)
           var curWeek = this.getWeek(d)
           curDates = curDates.map((i, k) => {
           return {
           num: i,
           fullDate: /(^\d{4})-(\d{1,2})-/.exec(d)[0] + i,
           show: 1
           }
           })
           preDates = preDates.map(i => {
           return {
           num: i,
           show: 0
           }
           })
           nexDates = nexDates.map(i => {
           return {
           num: i,
           show: 0
           }
           })
           var preCurDates = preDates.slice(preDates.length - (curWeek === 0 ? 6 : curWeek - 1), preDates.length).concat(curDates)
           return preCurDates.concat(nexDates.slice(0, 42 - preCurDates.length))
           }
          
          • 獲取天數用于圖層渲染(計算2019-10-16所在月份的日歷)
          #js--------------------
          data () {
           return {
           days: []
           }
          }
          created () {
           this.days = this.getFullChunkDates('2019-10-16')
          }
          #html--------------------
          <view class="c-day">
           <view class="d-item"
           :key="key" v-for="(item, key) in days">
           <text>{{item.num}}</text>
           </view>
          </view>
          

          為了保證渲染不出現胡亂,必須保證.c-day節點下的.d-item為7x6的分布狀態

          結語

          今天教大家如何自己實現日歷就完成了,覺得不錯就點幾下關注和分享唄

          《原文發表于本人博客kyeteo.cn》


          主站蜘蛛池模板: 在线精品动漫一区二区无广告| 国产精品免费一区二区三区| 久久久久人妻一区精品| 免费一本色道久久一区| 日韩免费无码视频一区二区三区| 国产日韩高清一区二区三区 | 国产精品丝袜一区二区三区| 无码丰满熟妇浪潮一区二区AV| 色偷偷久久一区二区三区| 久久国产精品一区免费下载| 日产精品久久久一区二区| 日韩亚洲AV无码一区二区不卡| 精品视频午夜一区二区| 精品一区二区三区电影| AV天堂午夜精品一区二区三区| 福利一区二区视频| 亚洲一区二区影视| 日韩在线一区高清在线| 久久一本一区二区三区| 精品国产一区二区三区| 精品一区二区三区四区电影 | 亚洲V无码一区二区三区四区观看| 日韩亚洲AV无码一区二区不卡| 日韩色视频一区二区三区亚洲| 激情内射日本一区二区三区| 亚洲一本一道一区二区三区| 男人的天堂精品国产一区| 免费无码VA一区二区三区| 国产成人一区二区精品非洲| 国产成人无码一区二区三区| 波多野结衣在线观看一区二区三区| 免费一区二区三区| 日韩精品一区二区三区在线观看| 久久国产一区二区| 国产一区三区三区| 一区二区三区日本视频| 国产乱人伦精品一区二区在线观看 | 国产在线精品一区免费香蕉| 99偷拍视频精品一区二区| 国产伦理一区二区| 国模大尺度视频一区二区|