[jQuery] 適合RWD網頁、手機瀏覽的日期時間選擇器 - Bootstrap-material-datetimepicker

前言

通常在網頁中使用日曆選擇器,很多開發人員都會使用jQuery UI datepicker,簡單速成好上手

但jQuery UI datepicker如果換成手機瀏覽,當使用者一點選文字框,手機彈出的輸入法就會和日曆覆蓋

是一項不利於手機瀏覽的缺點。雖然可以改用HTML5的<input type='date' />解決此問題,但IE不支援HTML5的<input type='date' />

最近發現一款日曆選擇器Bootstrap-material-datetimepicker,改善手機瀏覽的缺點也支援IE,執行結果和原生Android的日期選擇器很相似

它也有時間選擇器

不過選取時間在工作上較少碰到,本文著重在日曆部份如何實現

實作

1.必須引用bootstrap.css

2.留意此plugin基於Google Material Design所設計,有引用前端另一framework Material Design for Bootstrap的CSS檔 bootstrap-material-design.css

它的CDN檔案下載處:https://cdnjs.com/libraries/bootstrap-material-design

如果自己的Web專案原本就有引用bootstrap-material-design.css那就繼續沿用,但我想應該很多人沒什麼使用此框架XD

如果沒有引用bootstrap-material-design.css,「CLEAR、CANCEL、OK」這幾個按鈕就會黏在一起,樣式變得和官網長得不太一樣

所以我另外抽出成inline-style

3.下載此份CSS檔:https://fonts.googleapis.com/icon?family=Material+Icons 

還有裡頭的2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2檔案也要額外下載

它控制Pre、Next、右上角叉叉的樣式

4.記得引用moment-with-locales.js,而不是moment.js

剩下的請見完整範例程式碼

<!DOCTYPE html>
<html>
<head>
    <!--引用bootstrap.css-->   
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> 
     <!--已另抽出inline-style,所以不引用--> 
    <!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-design/0.5.10/css/bootstrap-material-design.css" />-->  
    <style type="text/css"> 
         .dtp-buttons > button.btn {
             border: none;
             border-radius: 2px;
             position: relative;
             box-shadow: none;
             color: rgba(0,0,0, 0.87);
             
             padding: 5px 16px;

             font-size: 12px;
             margin: 10px 1px;
             font-weight: 500;
             text-transform: uppercase;
             letter-spacing: 0;
             will-change: box-shadow, transform;
             transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
             outline: 0;
             cursor: pointer;
             text-decoration: none;
             background: transparent;
         }
        .dtp-buttons > button.btn:hover,
        .dtp-buttons > button.btn:focus {
            background-color: rgba(153, 153, 153, 0.2);
        }
    </style> 

    <!--影響 X < >的icon-->
    <!--<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">--> 
    <link href="css/Material-Icons.css" rel="stylesheet" />



    <!--引用plugin的css-->
    <link rel="stylesheet" href="css/bootstrap-material-datetimepicker.css" /> 
</head>
<body>
    <!--文字框,type不可填date,自訂一個class加上去-->
    <input type="text" placeholder="請選擇日期" class="myDatePicker" />


    <!--引用jQuery-->
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.js"></script> 
    <!--此plugin會影響語系-->
    <script type="text/javascript" src="http://momentjs.com/downloads/moment-with-locales.js"></script> 
     
  
    <!--引用plugin的js-->
    <script src="js/bootstrap-material-datetimepicker.js"></script>
    <script type="text/javascript">
        //當做全域參數使用
        let bootstrapMaterialDatePickerOption = { time: false, nowButton: true, clearButton: true, lang: 'zh-tw', format: 'YYYY/MM/DD' }; 
        $(function () {
            $('.myDatePicker').bootstrapMaterialDatePicker(bootstrapMaterialDatePickerOption);
        }); 
    </script> 
</body>
</html>

bootstrapMaterialDatePicker函數裡傳遞的常用參數:

time: false //不啟用時間選擇器

nowButton: true //顯示NOW Button

clearButton: true //顯示CLEAR Button

lang: 'zh-tw' //台灣繁中語系

format: 'YYYY/MM/DD' //日期格式(都是大寫),預設YYYY-MM-DD,例如:2017-11-27 

執行結果:

線上Demo:https://jsfiddle.net/ShadowKao/8ev787ho/

此Plugin目前發現美中不足的是,當手機轉成橫向時會被畫面切到,無法像原生手機日期選擇器一樣自適應寬度

2018.01.25 追記

趁著Bootstrap 4正式版4.0.0最近發佈,重新研究一下此套件,發現其實有沒有引用Bootstrap.css對功能使用沒什麼差XD(自己打臉自己

完整Source Code↓

<!DOCTYPE html>
<html>
<head>

    <!--有無引用bootstrap 4 樣式差異一點點,不影響功能-->
     <!--<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"   >--> 
    <style type="text/css">
        .dtp-buttons > button.btn {
            border: none;
            border-radius: 2px;
            position: relative;
            box-shadow: none;
            color: rgba(0,0,0, 0.87);
            padding: 5px 16px;
            font-size: 12px;
            margin: 10px 1px;
            font-weight: 500;
            text-transform: uppercase;
            letter-spacing: 0;
            will-change: box-shadow, transform;
            transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
            outline: 0;
            cursor: pointer;
            text-decoration: none;
            background: transparent;
        }

            .dtp-buttons > button.btn:hover,
            .dtp-buttons > button.btn:focus {
                background-color: rgba(153, 153, 153, 0.2);
            } 

            /*我自己多寫這個*/
         .dtp-picker-calendar > table {
            width: 100%;
        } 
    </style>

    <!--影響 Close < > 的切換icon-->
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
     
    <!--引用plugin的css(自行到作者GitHub下載)-->
    <link rel="stylesheet" href="css/bootstrap-material-datetimepicker.css" />
</head>
<body>
    <!--文字框,type不可填date,自訂一個class加上去-->
    <input type="text" placeholder="請選擇日期" class="myDatePicker" />


    <!--引用jQuery-->
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <!--此plugin會影響語系-->
    <script type="text/javascript" src="http://momentjs.com/downloads/moment-with-locales.js"></script>
     
    <!--引用plugin的js(自行到作者GitHub下載)-->
    <script src="js/bootstrap-material-datetimepicker.js"></script>
    <script type="text/javascript">
        //當做全域參數使用
        let bootstrapMaterialDatePickerOption = { time: false, nowButton: true, clearButton: true, lang: 'zh-tw', format: 'YYYY/MM/DD' };
        $(function () {
            $('.myDatePicker').bootstrapMaterialDatePicker(bootstrapMaterialDatePickerOption);
        });
    </script>
</body>
</html>

2018.2.22追記

User回報,如果在iPhone上瀏覽此日期選擇器的話,icon無法正常顯示,貌似iPhone不支援Google的icon(?)

 

 

結語

還有另一款日曆選擇器pickadate.js也滿適合手機瀏覽

它的Theme區分default、classic,務必要選default

classic我試過,Non mobile-friendly,畫面會卡住,手指滑動營幕沒有反應↓

pickadate.js在手機(小營幕)瀏覽,效果會變成全營幕日曆選擇器(早期沒有加入Close按鈕,挺讓人困擾Orz)

※手機擺橫的,不會像Bootstrap Material DatePicker被畫面切掉

pickadate.js等哪天有時間再撰寫文章介紹