2016年9月8日 星期四

BS3 datetimepicker

BS3 datetimepicker

簡介

在基本的 BS3 中並沒有提供圖形的日曆介面以供選取日期,必須使用額外的插件 (plug-in)。在網路上可以找到很多 BS3 的日期選取插件, https://eonasdan.github.io/bootstrap-datetimepicker/ 這個插件可說是廣受歡迎。這個插件除了架構於 jQuery 及 Bootstrap 3 之上,還另需一個 Moment.js 的 JavaScript 程式館,可由 http://momentjs.com/ 下載。如果必須客製顯示日期時使用的語言,則下載 moment-with-locales.js 程式館。

datetimepicker 這個插件,並沒有定義容器類別,必須透過 JavaScript 在程式中建立。建立 datatimepicker 時,常用的傳入參數略述如下:

viewMode
允許值為 'decades','years','months','days',預設為 'days'。指定日期選取插件顯示時的內容格式。
locale
指定顯示日期時所要使用的語言,正體中文為 'zh-TW'。
daysOfWeekDisabled
允許值為一陣列,內中包含 0 到 6 的數值,0 代表週日,其它數值則代表一週中對應的日子。日期選取插件顯示時,會將陣列中數值對應的日子,顯示為無法選取。
format
設定日期及時間的格式,只設定日期格式時,會隱藏時間的選取介面; 只設定時間格式時,會隱藏日期的選取介面。也就是說這個參數的值,也同時用來設定輸入時只能選取日期,或只能選取時間。
toolbarPlacement
允許值為 'top', 'bottom',預設為 'bottom'。用來設定工具列出現的位置。
showTodayButton
允許值為 true/false,預設為 false。在工具列中顯示「今日」按鈕,圖像為「準星」;點按時會自行輸入當日日期及時間。
showClear
允許值為 true/false,預設為 false。在工具列中顯示「清除」按鈕,圖像為「拉圾」;點按時會清除日期輸入值。
showClose
允許值為 true/false,預設為 false。在工具列中顯示「關閉」按鈕,圖像為 "X";點按時會隱藏日期選取介面。

以下為 datetimepicker.css 樣式表的內容。

<style>
/*!
 * Datetimepicker for Bootstrap 3
 * version : 4.17.42
 * https://github.com/Eonasdan/bootstrap-datetimepicker/
 */
.bootstrap-datetimepicker-widget {
    list-style: none;
}
.bootstrap-datetimepicker-widget.dropdown-menu {
    margin: 2px 0;
    padding: 4px;
    width: 19em;
}
@media (min-width: 768px) {
    .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
        width: 38em;
    }
}
@media (min-width: 992px) {
    .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
        width: 38em;
    }
}
@media (min-width: 1200px) {
    .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
        width: 38em;
    }
}
.bootstrap-datetimepicker-widget.dropdown-menu:before,
.bootstrap-datetimepicker-widget.dropdown-menu:after {
    content: '';
    display: inline-block;
    position: absolute;
}
.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before {
    border-left: 7px solid transparent;
    border-right: 7px solid transparent;
    border-bottom: 7px solid #ccc;
    border-bottom-color: rgba(0, 0, 0, 0.2);
    top: -7px;
    left: 7px;
}
.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after {
    border-left: 6px solid transparent;
    border-right: 6px solid transparent;
    border-bottom: 6px solid white;
    top: -6px;
    left: 8px;
}
.bootstrap-datetimepicker-widget.dropdown-menu.top:before {
    border-left: 7px solid transparent;
    border-right: 7px solid transparent;
    border-top: 7px solid #ccc;
    border-top-color: rgba(0, 0, 0, 0.2);
    bottom: -7px;
    left: 6px;
}
.bootstrap-datetimepicker-widget.dropdown-menu.top:after {
    border-left: 6px solid transparent;
    border-right: 6px solid transparent;
    border-top: 6px solid white;
    bottom: -6px;
    left: 7px;
}
.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before {
    left: auto;
    right: 6px;
}
.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after {
    left: auto;
    right: 7px;
}
.bootstrap-datetimepicker-widget .list-unstyled {
    margin: 0;
}
.bootstrap-datetimepicker-widget a[data-action] {
    padding: 6px 0;
}
.bootstrap-datetimepicker-widget a[data-action]:active {
    box-shadow: none;
}
.bootstrap-datetimepicker-widget .timepicker-hour,
.bootstrap-datetimepicker-widget .timepicker-minute,
.bootstrap-datetimepicker-widget .timepicker-second {
    width: 54px;
    font-weight: bold;
    font-size: 1.2em;
    margin: 0;
}
.bootstrap-datetimepicker-widget button[data-action] {
    padding: 6px;
}
.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Increment Hours";
}
.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Increment Minutes";
}
.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Decrement Hours";
}
.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Decrement Minutes";
}
.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Show Hours";
}
.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Show Minutes";
}
.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Toggle AM/PM";
}
.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Clear the picker";
}
.bootstrap-datetimepicker-widget .btn[data-action="today"]::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Set the date to today";
}
.bootstrap-datetimepicker-widget .picker-switch {
    text-align: center;
}
.bootstrap-datetimepicker-widget .picker-switch::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Toggle Date and Time Screens";
}
.bootstrap-datetimepicker-widget .picker-switch td {
    padding: 0;
    margin: 0;
    height: auto;
    width: auto;
    line-height: inherit;
}
.bootstrap-datetimepicker-widget .picker-switch td span {
    line-height: 2.5;
    height: 2.5em;
    width: 100%;
}
.bootstrap-datetimepicker-widget table {
    width: 100%;
    margin: 0;
}
.bootstrap-datetimepicker-widget table td,
.bootstrap-datetimepicker-widget table th {
    text-align: center;
    border-radius: 4px;
}
.bootstrap-datetimepicker-widget table th {
    height: 20px;
    line-height: 20px;
    width: 20px;
}
.bootstrap-datetimepicker-widget table th.picker-switch {
    width: 145px;
}
.bootstrap-datetimepicker-widget table th.disabled,
.bootstrap-datetimepicker-widget table th.disabled:hover {
    background: none;
    color: #777777;
    cursor: not-allowed;
}
.bootstrap-datetimepicker-widget table th.prev::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Previous Month";
}
.bootstrap-datetimepicker-widget table th.next::after {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    content: "Next Month";
}
.bootstrap-datetimepicker-widget table thead tr:first-child th {
    cursor: pointer;
}
.bootstrap-datetimepicker-widget table thead tr:first-child th:hover {
    background: #eeeeee;
}
.bootstrap-datetimepicker-widget table td {
    height: 54px;
    line-height: 54px;
    width: 54px;
}
.bootstrap-datetimepicker-widget table td.cw {
    font-size: .8em;
    height: 20px;
    line-height: 20px;
    color: #777777;
}
.bootstrap-datetimepicker-widget table td.day {
    height: 20px;
    line-height: 20px;
    width: 20px;
}
.bootstrap-datetimepicker-widget table td.day:hover,
.bootstrap-datetimepicker-widget table td.hour:hover,
.bootstrap-datetimepicker-widget table td.minute:hover,
.bootstrap-datetimepicker-widget table td.second:hover {
    background: #eeeeee;
    cursor: pointer;
}
.bootstrap-datetimepicker-widget table td.old,
.bootstrap-datetimepicker-widget table td.new {
    color: #777777;
}
.bootstrap-datetimepicker-widget table td.today {
    position: relative;
}
.bootstrap-datetimepicker-widget table td.today:before {
    content: '';
    display: inline-block;
    border: solid transparent;
    border-width: 0 0 7px 7px;
    border-bottom-color: #337ab7;
    border-top-color: rgba(0, 0, 0, 0.2);
    position: absolute;
    bottom: 4px;
    right: 4px;
}
.bootstrap-datetimepicker-widget table td.active,
.bootstrap-datetimepicker-widget table td.active:hover {
    background-color: #337ab7;
    color: #fff;
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.bootstrap-datetimepicker-widget table td.active.today:before {
    border-bottom-color: #fff;
}
.bootstrap-datetimepicker-widget table td.disabled,
.bootstrap-datetimepicker-widget table td.disabled:hover {
    background: none;
    color: #777777;
    cursor: not-allowed;
}
.bootstrap-datetimepicker-widget table td span {
    display: inline-block;
    width: 54px;
    height: 54px;
    line-height: 54px;
    margin: 2px 1.5px;
    cursor: pointer;
    border-radius: 4px;
}
.bootstrap-datetimepicker-widget table td span:hover {
    background: #eeeeee;
}
.bootstrap-datetimepicker-widget table td span.active {
    background-color: #337ab7;
    color: #fff;
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.bootstrap-datetimepicker-widget table td span.old {
    color: #777777;
}
.bootstrap-datetimepicker-widget table td span.disabled,
.bootstrap-datetimepicker-widget table td span.disabled:hover {
    background: none;
    color: #777777;
    cursor: not-allowed;
}
.bootstrap-datetimepicker-widget.usetwentyfour td.hour {
    height: 27px;
    line-height: 27px;
}
.bootstrap-datetimepicker-widget.wider {
    width: 21em;
}
.bootstrap-datetimepicker-widget .datepicker-decades .decade {
    line-height: 1.8em !important;
}
.input-group.date .input-group-addon {
    cursor: pointer;
}
.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
}
</style>

範例

範例中建立了三個日期/時間的輸入選取介面。由左至右,第一個不具圖像,當輸入欄位獲得焦點時,自動顯示日期選取介面。點選工具列中的時鐘圖像則顯示時間選取介面。第二個具有圖像,當輸人欄位獲得焦點時,並不會顯示日期選取介面,必須點按「日曆」圖像才能顯示日期選取介面,工具列中具有「今日」、「清除」及「關閉」三個圖像。第三個具有「時鐘」圖像,用來點按以顯示時間的選取介面。在實務上運作時,三個介面在一個時間點只會出現一個介面,其它的會被隱藏,圖例中的示意圖有經過剪貼。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

在 CSS 中沒有特別的樣式需要設定。但要在 <head> 標記中加上下列程式碼,以納入 datetimepicker 的樣式表。請自行修改路徑位置。
<link rel="stylesheet" href="libs/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css">

HTML

<body>
    
</body>

第 5 行建立一個不具圖像的日期和時間輸入欄位的掛載點,因為不具圖像,所以用不到 .form-group 及 .input-group 樣式類別。搜尋用的 id 設在 <input> 之中。
第 8~15 行及 18~26 行各建立一個具有圖像的日期和時間輸入欄位,因為具有圖像,所以用到 .form-group 及 .input-group 等樣式類別。搜尋用的 id 設在 .input-group 的 <div> 標記中,注意 .input-group 伴隨一個 .date 樣式類別,這是程式碼中唯一定義於 datetimepicker.css 中的樣式類別,.input-group.date{}樣式中設定了游標形狀。
第 22 行用 glyphicon-time 將圖像設成「時鐘」的圖像。
剩下的工作都得靠 JavaScript 程式來完成了。

Script

記得加上下列程式碼,以納入 datetimepicker 的 JavaScript 程式碼。請自行修改路徑位置。
<script src="libs/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>

<script>
$(function(){
    $('#datetimepicker1').datetimepicker({
        daysOfWeekDisabled: [0, 6]
    });
    $('#datetimepicker2').datetimepicker({
        locale: 'zh-TW',
        format: 'YYYY-MM-DD',   // this will only display date selector
        toolbarPlacement: 'bottom',
        showTodayButton : true,
        showClear: true,
        showClose: true
    }).on('dp.change', function(){
        let picked = $('#datetimepicker2').datetimepicker('date');
        alert(picked);
    });
    $('#datetimepicker3').datetimepicker({
        format: 'LT'          // this will only display time selector
    });
});
</script>

第 4 行將所有週六及週日的日子,都設定為不可選取。
第 7 行設定顯示時使用正體中文。
第 8 行設定日期格式,因為只設定了日期格式,所以不會出現時間的選取介面。
第 9 行設定工具列在選取介面中的位置。
第 10~12 行則分別顯示「今日」、「清除」及「關閉」三個工具列的圖像鈕。
第 13~15 行於資料改變時,處理 dp.change 事件,讀取輸入值,並顯示在螢幕上。
第 20 行將格式設定為 LT (Local Time),因此只會出現時間選取介面。format 屬性的值,得去參考 Moment.js 的文件。

2016年8月17日 星期三

BS3 Popovers - Part 2

BS3 Popovers

簡介

這篇解說如何用 Javascript 直接建立 BS3 的 popover。用法很簡單,就如同在 jQuery 中建立一個元件的方式一樣,建立元件時,傳入的參數必須是一個 Javascript 的物件,物件中包含所有要設定的參數及其值,請參考文章下方的 Javascript 程式碼。

以下為各參數及其允許值,以下大多數的參數亦可以用 data-* 的自訂屬性在 HTML 程式碼中設定,只有少數幾個屬性,當其值為 Javascript 物件時,受限於 HTML5 對自訂屬性的限制,是不能在 data-* 中設定的。popover 的屬性個數比 tooltip 的屬性要略多一些。

animation
Boolean 值, 設定為 true 時,popover 顯示時有動畫效果,反之則無。
delay
允許值為一 Javascript 物件,如 {show: 500, hide:300} 設定顯示及取消時的歷時,單位為 ms。允許值亦可為一數值,為數值時,顯示及取消歷時都同樣設定為此數值。
html
Boolean 值,設定為 true 時,允許在 title 參數中置入 html 程式碼並顯示,反之則只能使用一般文字。
placement
值可為字串或函式。若為字串,允許值為 "top", "right", "bottom", "left" 及 "auto",若為函式,則由函式運算後傳回代表位置的字串值。
selector
允許值為 CSS3 篩選器的字串值,用以委任 (delegate) 要顯示 popover 的元件;這個屬性值只用在顯示 popover 的元件為動態加入 DOM 文件中的時候才有意義。
title
允許值為 html 字串或純文字。其值做為 popover 的標題。如果在 HTML 程式碼中已設定 title 屬性的值,則優先以其設定值為 popover 標題的內容,如果不曾設定,才會以此處的設定值做為 popover 的標題內容。
content
允許值為 html 字串或純文字。其值做為 popover 的內容。
trigger
允許值為字串,設定顯示 popover 的條件。允許值為 "hover"(預設), "click", "focus" 及 "manual"。
container
允許值為 CSS3 的篩選字串。將 popover 的 DOM 元件指派給特定的元件。使用這個屬性設定時,螢幕上是看不出任何變化的,必須打開「開發者工具」檢視元件 (element) 頁面才能看出有何不同,popover 的 DOM 元件會出現在 container 指定的內容中。
template
允許值為字串,popover 的 html 範本,預設為 '

'。可依需要修改範本內容。
viewport
允許值為一個 Javascript 物件。用來規範 popover 顯示時的位置,這個屬性的使用時的行為模式比較複雜,最好寫個程式好好測一下。Javascript 物件中的屬性有二:
selector
允許值為 CSS3 籂選器的字串值,限制 popover 所顯示的範圍為篩選元件所佔據的空間;預設值為 body。
padding
允許值只能為正整數值,單位為 px。設定 popover 內容的偏移量,當 placement 為 "top" 及 "bottom" 時,popover 的內容向左偏移;當 placement 為 "left" 及 "right" 時,popover 的內容向下偏移。這樣,可以有限度的調整箭頭和 popover 外框的相對位置。偏移量則由 viewport 中的 selector 屬性中篩選的元件作為基準。

範例

範例串建立了兩個具有 popover 的按鈕,第一個(上方)以 data-* 自訂屬性設定其樣式及內容。第二個 (下方)以 Javascript 設定其樣式和內容,冋時在 template 屬性中增加 style 屬性的設定更改了 popover 標題的底色。trigger 屬性設定為 "hover",在游標移到按鈕上方時,會顯示 popover,游標移出按鈕時取消 popover。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 900px;
    padding: 20px;
}
</style>

CSS 中沒有特別設定其它的樣式。

HTML

<body>
    
</body>

第 3~7 行以 HTML 屬性及 data-* 自訂屬性建立第一個按鈕,多數的屬性都採取預設值。
第 9 行建立一個單純的按鈕,其 popover 的樣式及內容在以下的 Javascript 中以程式的方法設定。

Script

<script>
$(function(){
    $(document).ready(function(){
        $("#pop1").popover();
        // only modifies one popover element
        var opts ={
            animation: true,
            delay: {
                show: 2000,
                hide: 1000
            },
            html: true,
            template: '

', title: "POPOVER", content: "

Here is some content.

", trigger: "hover", placement: "bottom", viewport:{ selector: "#demo", padding: 0 } }; $('#pop2').popover(opts); }); }); </script>

第 4 行啟動第一個按鈕的 popover 功能。
第 6~22 行設定 popover 的各項屬性值。
第 23 行啟動第二個按鈕的 popover 功能。

2016年8月15日 星期一

BS3 Popovers - Part 1

BS3 Popovers

簡介

BS3 的 popover 是一個擴充自 BS3 tooltip 的介面元件,在使用上和 BS3 的 tooltip 非常類示。popover 具有和 tooltip 不同的預設底色和字體的顏色;擴充的部份是將顯示的資訊內容分成「標題」和「內容」兩部份,以顯示更多的資訊;另外,popover 的箭頭也會依顯示位置和介面元件的相對位置做調整。tooltip 比較偏向「提示」介面元件的作用或功能,而 popover 比較偏向「解釋」介面元件具有的額外資訊和使用的方式。標題的內容來自 HTML 標記中 title 的屬性值(此為預設),或以 data-title 的自訂屬性值替代,(如果同時設定 title 屬性的值,則優先以 title 的值做為 popover 標題)。自訂屬性 data-content 的值則做為 popover 的內容。其於各自訂屬性所代表的意義和用法都和 tooltip 相同。和 tooltip 相同,因為執行效率的考量,popover 也必須透過 Javascript 程式來啟動。

以下為一些 popover 比較基本的 data-* 自訂屬性,及其允許值:

data-toggle
data-toggle 的值在 popover 元件中一定得設定為 "popover"。
data-placement
指定 popover 要出現的位置。其值可以是 top(預設值), right, bottom, left 及 auto,其中 auto 就是讓流覽器自行決定 popover 顯示的位置。
data-trigger
指定 popover 顯示的方式,可以組合使用,組合使用時,在字串值中用空白字元將各條件分隔。允許值如下:
hover
這是預設值,當游標移到元件上方時顯示 popover,移出時取消 popover。
focus
當元件取得焦點時顯示 popover,失去焦點時取消 popover。當點按元件時,元件會自動取得焦點,也會顯 popover,在元件外部點按時,元件會使去焦點,同時取消 popover。
click
點按元件時,顯示 popover,再次點按元件時取消 popover。
manual
這個值實際上指的是透過 Javascript 程式來控制 popover 的顯示和取消。

以下為 BS3 V3.3.6 中 bootstrsp.css 樣式表中與 .popover 相關的樣式類別定義。

.popover.top {
    margin-top: -10px;
}
.popover.right {
    margin-left: 10px;
}
.popover.bottom {
    margin-top: 10px;
}
.popover.left {
    margin-left: -10px;
}
.popover-title {
    padding: 8px 14px;
    margin: 0;
    font-size: 14px;
    background-color: #f7f7f7;
    border-bottom: 1px solid #ebebeb;
    border-radius: 5px 5px 0 0;
}
.popover-content {
    padding: 9px 14px;
}
.popover > .arrow,
.popover > .arrow:after {
    position: absolute;
    display: block;
    width: 0;
    height: 0;
    border-color: transparent;
    border-style: solid;
}
.popover > .arrow {
    border-width: 11px;
}
.popover > .arrow:after {
    content: "";
    border-width: 10px;
}
.popover.top > .arrow {
    bottom: -11px;
    left: 50%;
    margin-left: -11px;
    border-top-color: #999;
    border-top-color: rgba(0, 0, 0, .25);
    border-bottom-width: 0;
}
.popover.top > .arrow:after {
    bottom: 1px;
    margin-left: -10px;
    content: " ";
    border-top-color: #fff;
    border-bottom-width: 0;
}
.popover.right > .arrow {
    top: 50%;
    left: -11px;
    margin-top: -11px;
    border-right-color: #999;
    border-right-color: rgba(0, 0, 0, .25);
    border-left-width: 0;
}
.popover.right > .arrow:after {
    bottom: -10px;
    left: 1px;
    content: " ";
    border-right-color: #fff;
    border-left-width: 0;
}
.popover.bottom > .arrow {
    top: -11px;
    left: 50%;
    margin-left: -11px;
    border-top-width: 0;
    border-bottom-color: #999;
    border-bottom-color: rgba(0, 0, 0, .25);
}
.popover.bottom > .arrow:after {
    top: 1px;
    margin-left: -10px;
    content: " ";
    border-top-width: 0;
    border-bottom-color: #fff;
}
.popover.left > .arrow {
    top: 50%;
    right: -11px;
    margin-top: -11px;
    border-right-width: 0;
    border-left-color: #999;
    border-left-color: rgba(0, 0, 0, .25);
}
.popover.left > .arrow:after {
    right: 1px;
    bottom: -10px;
    content: " ";
    border-right-width: 0;
    border-left-color: #fff;
}

範例

範例中建立了四個按鈕,按鈕標示 popover 出現的的位置。點按按鈕時出現 popover,再次點按則取消 popover。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 900px;
    padding: 20px;
}
#demo {
    width:100%;
    padding: 200px;
}
</style>

#demo{} 樣式設定將介面元件移至螢幕中央,以便 popover 有足夠的空間顯示。

HTML

<body>
    
</body>

HTML 中建立四個按鈕,各在不同的方位顯示 popover。程式碼相當簡單,就不多做解釋了。

Script

<script>
$(function(){
    $(document).ready(function(){
        $('[data-toggle="popover"]').popover(); 
    });
});
</script>

第 4 行透過 [data-toggle="popover"] 篩選條件啟動 popover。

2016年8月7日 星期日

BS3 Tooltips - Part 2

BS3 Tooltips - Part 2

簡介

這篇解說如何用 Javascript 直接建立 BS3 的 tooltip。用法很簡單,就如同在 jQuery 中建立一個元件的方式一樣,建立元件時,傳入的參數必須是一個 Javascript 的物件,物件中包含所有要設定的參數及其值,請參考文章下方的 Javascript 程式碼。

以下為各參數及其允許值,以下大多數的參數亦可以用 data-* 的自訂屬性在 HTML 程式碼中設定,只有少數幾個屬性,當其值為 Javascript 物件時,受限於 HTML5 對自訂屬性的限制,是不能在 data-* 中設定的。

animation
Boolean 值, 設定為 true 時,提示框顯示時有動畫效果,反之則無。
delay
允許值為一 Javascript 物件,如 {show: 500, hide:300} 設定顯示及取消時的歷時,單位為 ms。允許值亦可為一數值,為數值時,顯示及取消歷時都同樣設定為此數值。
html
Boolean 值,設定為 true 時,允許在 title 參數中置入 html 程式碼並顯示,反之則只能使用一般文字。
placement
值可為字串或函式。若為字串,允許值為 "top", "right", "bottom", "left" 及 "auto",若為函式,則由函式運算後傳回代表位置的字串值。
selector
允許值為 CSS3 篩選器的字串值,用以委任 (delegate) 要顯示提示框的元件;這個屬性值只用在顯示提示框的元件為動態加入 DOM 文件中的時候才有意義。
title
依 html 屬性的設定,允許值為 html 字串或純文字。提示框的內容。如果在 HTML 程式碼中已設定 title 屬性的值,則優先以其設定值為提示框的內容,如果不曾設定,才會以此處的設定值做為提示框的內容。
trigger
允許值為字串,設定顯示提示框的條件。允許值為 "hover"(預設), "click", "focus" 及 "manual"。
container
允許值為 CSS3 的篩選字串。將提示框的 DOM 元件指派給特定的元件。使用這個屬性設定時,螢幕上是看不出任何變化的,必須打開「開發者工具」檢視元件 (element) 頁面才能看出有何不同,提示框的 DOM 元件會出現在 container 指定的內容中。我到目前還想不出這有什麼作用。
template
允許值為字串,提示框的 html 範本,預設為 ''。程式設計師可以依需要修改範本內容。
viewport
允許值為一個 Javascript 物件。用來規範提示框顯示時的位置,這個屬性的使用時的行為模式比較複雜,最好寫個程式好好測一下。Javascript 物件中的屬性有二:
selector
允許值為 CSS3 籂選器的字串值,限制提示框所顯示的範圍為篩選元件所佔據的空間;預設值為 body。
padding
允許值只能為正整數值,單位為 px。設定提示框內容的偏移量,當 placement 為 "top" 及 "bottom" 時,提示框的內容向左偏移;當 placement 為 "left" 及 "right" 時,提示框的內容向下偏移。這樣,可以有限度的調整箭頭和提示框的相對位置。偏移量則由 viewport 中的 selector 屬性中篩選的元件作為基準。

範例

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#demo {
    width: 400px;
    height: 400px;
    padding: 50px;
}
</style>

#demo{} 將介面元件略向螢幕中心移動,以便顯示提示框。

HTML

<body>
    
</body>

在 HTML 程式碼中建立一個有提示框的按鈕,不論是用 HTML 建立或是用 Javascript 建立,data-toggle="tooltip" 這個屬性是一定要設定的。

Script

<script>
"use strict"
$(function(){
    $(document).ready(function(){
        var opts ={
            animation: true,
            delay: {
                show: 500,
                hide: 300
            },
            html: true,
            template: '',
            title: "

Here is a large tooltip

", trigger: "click", placement: "bottom", viewport:{ selector: "#demo", padding: 0 } }; $('[data-toggle="tooltip"]').tooltip(opts); }); }); </script>

第 12 行,用 style 屬性變更了提示框箭頭和內容的底色和文字的顏色。這裡要特別注意,因為箭頭是用 border 做出來的,因此四個方向的箭頭只㤦用了 border 邊線的一邊;因此,當 placement 改變時,要相對應改變 border-*-color 的屬性名稱。

2016年8月4日 星期四

BS3 Tooltips - Part 1

BS3 Tooltips - Part 1

簡介

在 HTML 中本來就已經具有 tooltip (提示框)的功能,BS3 的 tooltip 將其外觀樣式做了更動,將 tooltip 的底色改成黑色,文字改成白色,提示框還具有一個指向元件的箭頭;同時也相當程度的擴充了 tooltip 的功能,讓其運用可以更為廣泛。在同一個頁面中,可以同時使用 HTML 的 tooltip 和 BS3 的 tooltip ,彼此間不會相互干擾。但是為了執行時的效率,BS3 的 tooltip 必須明確的使用 Javascript 將其啟動,如果沒有做這件事,則會使用 HTML 預設的 tooltip 樣式。

建立 BS3 的 tooltips 有二種方式,一種直接在 HTML 程式碼中使用 data-* 自訂屬性建立,然後在 Javascript 中啟動,另一種則是直接用 Javascript 建立並設定所有屬性值。基本上,用哪一種方式,純看個人喜好;但是如果要將 BS3 中的 tooltip 用到極致,用 Javascript 建立並設定會容易些。提示框的內容,預設都以 title 屬性值為其內容,這樣有個好處,如果程式有了問題,至少會用到 HTML 預設的 tooltip 來顯示。以下為一些比較基本的 data-* 自訂屬性,及其允許值:

data-toggle
data-toggle 的值在 tooltip 元件中一定得設定為 "tooltip"。
data-placement
指定提示框要出現的位置。其值可以是 top(預設值), right, bottom, left 及 auto,其中 auto 就是讓流覽器自行決定提示框顯示的位置。
data-trigger
指定提示框顯示的方式,可以組合使用,組合使用時,在字串值中用空白將各條件分隔。允許值如下:
hover
這是預設值,當游標移到元件上方時顯示提示框,移出時取消提示框。
focus
當元件取得焦點時顯示提示框,失去焦點時取消提示框。當點按元件時,元件會自動取得焦點,也會顯示提示框,在元件外部點按時,元件會使去焦點,同時取消提示框。
click
點按元件時,顯示提示框,再次點按元件時取消提示框。
manual
這個值實際上指的是透過 Javascript 程式來控制提示框的顯示和取消。

以下為 BS3 V3.3.6 的 bootstrap.css 樣式表中有關 .tooltip 的樣式設定。其中 .tooltip.top-left .tooltip-arrow {}, .tooltip.top-right .tooltip-arrow{} 及 .tooltip.bottom-left .tooltip-arrow {}, .tooltip.bottom-right .tooltip-arrow{} 的幾個樣式設定,在原本的 bootstrap.js 中並不支援,得去 https://github.com/andresgutgon/bootstrap-tooltip-extension 下載擴充套件才能使用。這個套件只是單純的增加了四個提示框箭頭的位置,是否真的需要使用,純粹是依照個人觀點和需求了。

.tooltip {
    position: absolute;
    z-index: 1070;
    display: block;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 12px;
    font-style: normal;
    font-weight: normal;
    line-height: 1.42857143;
    text-align: left;
    text-align: start;
    text-decoration: none;
    text-shadow: none;
    text-transform: none;
    letter-spacing: normal;
    word-break: normal;
    word-spacing: normal;
    word-wrap: normal;
    white-space: normal;
    filter: alpha(opacity=0);
    opacity: 0;
    line-break: auto;
}
.tooltip.in {
    filter: alpha(opacity=90);
    opacity: .9;
}
.tooltip.top {
    padding: 5px 0;
    margin-top: -3px;
}
.tooltip.right {
    padding: 0 5px;
    margin-left: 3px;
}
.tooltip.bottom {
    padding: 5px 0;
    margin-top: 3px;
}
.tooltip.left {
    padding: 0 5px;
    margin-left: -3px;
}
.tooltip-inner {
    max-width: 200px;
    padding: 3px 8px;
    color: #fff;
    text-align: center;
    background-color: #000;
    border-radius: 4px;
}
.tooltip-arrow {
    position: absolute;
    width: 0;
    height: 0;
    border-color: transparent;
    border-style: solid;
}
.tooltip.top .tooltip-arrow {
    bottom: 0;
    left: 50%;
    margin-left: -5px;
    border-width: 5px 5px 0;
    border-top-color: #000;
}
.tooltip.top-left .tooltip-arrow {
    right: 5px;
    bottom: 0;
    margin-bottom: -5px;
    border-width: 5px 5px 0;
    border-top-color: #000;
}
.tooltip.top-right .tooltip-arrow {
    bottom: 0;
    left: 5px;
    margin-bottom: -5px;
    border-width: 5px 5px 0;
    border-top-color: #000;
}
.tooltip.right .tooltip-arrow {
    top: 50%;
    left: 0;
    margin-top: -5px;
    border-width: 5px 5px 5px 0;
    border-right-color: #000;
}
.tooltip.left .tooltip-arrow {
    top: 50%;
    right: 0;
    margin-top: -5px;
    border-width: 5px 0 5px 5px;
    border-left-color: #000;
}
.tooltip.bottom .tooltip-arrow {
    top: 0;
    left: 50%;
    margin-left: -5px;
    border-width: 0 5px 5px;
    border-bottom-color: #000;
}
.tooltip.bottom-left .tooltip-arrow {
    top: 0;
    right: 5px;
    margin-top: -5px;
    border-width: 0 5px 5px;
    border-bottom-color: #000;
}
.tooltip.bottom-right .tooltip-arrow {
    top: 0;
    left: 5px;
    margin-top: -5px;
    border-width: 0 5px 5px;
    border-bottom-color: #000;
}

範例

範例中建立四個清單元件,取消其前導圖像,用以展示提示框出現時的不同位置。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#demo {
    padding: 50px;
}
ul {
    list-style: none;
}
</style>

#demo{} 將所有元件移到偏螢幕中間,好讓各提示框有空間顯示。 ul{} 取消列示的圖像。另建立一個按鈕群組,展示三個提示框顯示的不同條件。

HTML

<body>
    
</body>

第 1~8 行建立一個沒有前導圖像的清單元件,四個元件各設定四個不同提示框顯示的位置,當游標移到各元件上方時,則會在設定的位置顯示提示框。
第 9~13 行建立一個按鈕群組,並以 data-trigger 自訂屬性值設定不同提示框出現的條件。

Script

<script>
"use strict"
$(function(){
    $(document).ready(function(){
        $('[data-toggle="tooltip"]').tooltip();   
    });
});
</script>

Javascript 程式中,利用搜尋 data-toggle="tooltip" 條件啟動所有的 tooltips。

2016年7月28日 星期四

BS3 Modals

BS3 Modals

簡介

Modal 視窗在應用中是一種使用非常廣泛的元件,它的特性就是在視窗出現時,使用者必須明確的完成某項動作;例如輸入一些資料或者取消該視窗,否則視窗會佔據整個螢幕,迫使使用者在應用的過程中作出決定或動作,應用才能繼續進行。這讓應用的設計者在一定程度上可以掌控應用的運行方式和節奏。

.modal
為整個 modal 的主容器,內中必須包含一個 .modal-dialog 容器。
.modal-dialog
次容器,內中必須包含一個 .modal-content 次容器。
.modal-content
次容器,內中可選擇性包含 .modal-header, .modal-footer 類別容器,但都會包含 .modal-body 容器,以存放內容。
.modal-header, .modal-body, modal-footer
將 .modal-content 的內容區分成三大塊,.modal-body 為必要,其它兩者為選項。
.modal-title
定義內容為 modal 的標題,一般和 <h1> 。。。 <h4> 搭配使用。
.modal-lg, .modal-sm
改變 modal 的大小,預設寬為 600px,.modal-lg 寬為 900px,.modal-sm 寬為 300px。要特別注意的是:雖然類別名稱為 modal-* ,但在實作時,卻是應用在 .modal-dialog 容器類別的元件。
.modal-backdrop
這個樣式類別一般不寫在 HTML 的程式碼中,而是由 bootstrap.js 程式控制,類別樣式所定義的是 modal 背後的遮罩。

以下為 BS3 v3.3.6 的 bootstrap.css 樣式表中,與 .modal 相關的樣式設定。

.modal-open {
    overflow: hidden;
}
.modal {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1050;
    display: none;
    overflow: hidden;
    -webkit-overflow-scrolling: touch;
    outline: 0;
}
.modal.fade .modal-dialog {
    -webkit-transition: -webkit-transform .3s ease-out;
         -o-transition:      -o-transform .3s ease-out;
            transition:         transform .3s ease-out;
    -webkit-transform: translate(0, -25%);
        -ms-transform: translate(0, -25%);
         -o-transform: translate(0, -25%);
            transform: translate(0, -25%);
}
.modal.in .modal-dialog {
    -webkit-transform: translate(0, 0);
        -ms-transform: translate(0, 0);
         -o-transform: translate(0, 0);
            transform: translate(0, 0);
}
.modal-open .modal {
    overflow-x: hidden;
    overflow-y: auto;
}
.modal-dialog {
    position: relative;
    width: auto;
    margin: 10px;
}
.modal-content {
    position: relative;
    background-color: #fff;
    -webkit-background-clip: padding-box;
            background-clip: padding-box;
    border: 1px solid #999;
    border: 1px solid rgba(0, 0, 0, .2);
    border-radius: 6px;
    outline: 0;
    -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
            box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
.modal-backdrop {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1040;
    background-color: #000;
}
.modal-backdrop.fade {
    filter: alpha(opacity=0);
    opacity: 0;
}
.modal-backdrop.in {
    filter: alpha(opacity=50);
    opacity: .5;
}
.modal-header {
    padding: 15px;
    border-bottom: 1px solid #e5e5e5;
}
.modal-header .close {
    margin-top: -2px;
}
.modal-title {
    margin: 0;
    line-height: 1.42857143;
}
.modal-body {
    position: relative;
    padding: 15px;
}
.modal-footer {
    padding: 15px;
    text-align: right;
    border-top: 1px solid #e5e5e5;
}
.modal-footer .btn + .btn {
    margin-bottom: 0;
    margin-left: 5px;
}
.modal-footer .btn-group .btn + .btn {
    margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
    margin-left: 0;
}
.modal-scrollbar-measure {
    position: absolute;
    top: -9999px;
    width: 50px;
    height: 50px;
    overflow: scroll;
}
@media (min-width: 768px) {
    .modal-dialog {
        width: 600px;
        margin: 30px auto;
    }
    .modal-content {
        -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
                box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
    }
    .modal-sm {
        width: 300px;
    }
}
@media (min-width: 992px) {
    .modal-lg {
      width: 900px;
    }
}

範例

範例中先建立一個按鈕,點按按鈕則會出現一個 modal 的視窗。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

CSS 中沒有設定其它樣式。

HTML

<body>
    
    
    
</body>

第 2 行,建立一個按鈕,藉以控制 modal 的顯示。data-toggle="modal" 指定控制元件的型態,data-target="#myModal"則指定要控制元件的 id。
第 4 行,建立 .modal 元件,id 值為 #myModal,樣式類別 .fade 及 .in 定義 modal 元件出現時具有動畫效果。
第 6 行,建立 .modal-dialog 元件,如果要改變 modal 元件的大小, .modal-lg 或 .modal-sm 樣式類別需定義在這個元件。
第 9, 16 行,利用 .bg-primary 樣式類別改變 .modal-header 及 .modal-footer 的底色。

2016年7月26日 星期二

BS3 Input Groups

BS3 Input Group

簡介

BS3 中的 .input-group 容器類別可以裝飾文字輸入欄位,讓文字欄位的外觀有更多的變化,像是在輸入欄位的前端、後端或前後兩端加入副元件,副元件的內容可以是圖像或文字,可以產生相當有趣的輸入欄位外觀。要注意的是 .input-group 只能用在文字輸入欄位,如果所期望的不是文字型態的輸入值,在取得輸入值後,得配合做一些資料型態的轉換。.input-group 也可放在 .form-group 下使用,並使用 col-*-* 來設定寬度。

.input-group-addon
搭配 <span> 使用,在輸入欄位的前端或後端加入副件元件,加在前端或後端則依 <span> 的所在位置而定。
.input-group-sm, .input-group-lg
改變 .input-group 欄位的大小。很有趣的是,此時副件元件的大小也會跟著改變,但如果是使用 form-group-* 來改變欄位大小時,副元件會保持原來的大小。

以下為 BS3 V3.3.6 的 bootstrap.css 樣式表中和 .input-group 相關的部份樣式定義,其它的請參考 bootstrap.css 檔案的內容。

.input-group {
    position: relative;
    display: table;
    border-collapse: separate;
}
.input-group[class*="col-"] {
    float: none;
    padding-right: 0;
    padding-left: 0;
}
.input-group .form-control {
    position: relative;
    z-index: 2;
    float: left;
    width: 100%;
    margin-bottom: 0;
}
.input-group .form-control:focus {
    z-index: 3;
}
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn {
    height: 46px;
    padding: 10px 16px;
    font-size: 18px;
    line-height: 1.3333333;
    border-radius: 6px;
}
select.input-group-lg > .form-control,
select.input-group-lg > .input-group-addon,
select.input-group-lg > .input-group-btn > .btn {
    height: 46px;
    line-height: 46px;
}
textarea.input-group-lg > .form-control,
textarea.input-group-lg > .input-group-addon,
textarea.input-group-lg > .input-group-btn > .btn,
select[multiple].input-group-lg > .form-control,
select[multiple].input-group-lg > .input-group-addon,
select[multiple].input-group-lg > .input-group-btn > .btn {
    height: auto;
}
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
    border-radius: 3px;
}
select.input-group-sm > .form-control,
select.input-group-sm > .input-group-addon,
select.input-group-sm > .input-group-btn > .btn {
    height: 30px;
    line-height: 30px;
}
textarea.input-group-sm > .form-control,
textarea.input-group-sm > .input-group-addon,
textarea.input-group-sm > .input-group-btn > .btn,
select[multiple].input-group-sm > .form-control,
select[multiple].input-group-sm > .input-group-addon,
select[multiple].input-group-sm > .input-group-btn > .btn {
    height: auto;
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
    display: table-cell;
}
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
    border-radius: 0;
}
.input-group-addon,
.input-group-btn {
    width: 1%;
    white-space: nowrap;
    vertical-align: middle;
}
.input-group-addon {
    padding: 6px 12px;
    font-size: 14px;
    font-weight: normal;
    line-height: 1;
    color: #555;
    text-align: center;
    background-color: #eee;
    border: 1px solid #ccc;
    border-radius: 4px;
}

範例

範例用 form-horizontal 的表單格式,並將 .input-group 置於 .form-group 容器中展示了三個 .input-group 的例子。副元件有加在輸入欄位的前方,也有加在後端和兩端都加的。副元件的形態有圖像和文字。

CSS

<style>
html {
    width: 100%;
    height: auto;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#demo {
    width: 400px;
    height: auto;
}
</style>

#demo 定義了父元件的寬度為 400px。沒有設定其它的樣式。

HTML

<body>
    
.00
$ .00
</body>

HTML 程式碼淺顯易懂,不多作解釋了。

2016年7月25日 星期一

BS3 Forms

BS3 Forms

簡介

BS3 中針對輸入表單的部份只提供對表單中各元件外觀樣式的定義,及各元件定位的定義,並沒有提供其它的特殊功能。先介紹幾個重要的樣式類別:

.control-label
定義在 <label> 標記中,修飾輸入欄位名稱的外觀及其定位。
.form-control
定義在 <input> 標記中,修飾輸入欄位的外觀及其定位。
.form-group
此為容器類別。容器中包含至少一對或一對以上的 <label> 及 <input> 組合,此容器類別將容器中的輸入欄位及其名稱組成一個群組,根據輸入表單的格式決定輸入欄位及其名稱的排列方式。最重要的一點是樣式為 .form-group 的容器樣式會具有 margin-bottom: 15px; 的屬性值,藉以區隔不同的輸入群組。可以和 .form-group 同時使用的又有下列各修飾類別:
.form-group-lg, .form-group-sm
改變輸入欄位及其名稱的字體大小。
.has-success, has-warning, has-error
以上修飾類別在驗證欄位輸入值後,可以用來變更輸入欄位名稱及輸入欄位邊框的顏色,藉以表現欄位輸入值驗證後的結果。

BS3 中的輸入表單有三種不同的格式:

form-vertical
form-vertical 是預設的格式,因此並沒有 .form-vertical 的樣式類別需要設定。此樣式的輸入欄位名稱 (.control-label) 和輸入欄位 (.form-control) 各自佔據一列,輸入欄位名稱位於輸入欄位的上一列。
.form-horizontal
.form-horizontal 表單格式中,.form-group 容器中的所有元件都位於同一列,輸入欄位名稱位於輸入欄位的左側。必須使用 col-*-* 格線系統定位,輸入欄無名稱靠右對齊,輸入欄位則靠左對齊。在表格中使用 col-*-* 時,不需要有 .row 容器,.form-group 容器本身和 .row 容器相當。
.form-inline
.form-inline 的 .form-group 容器中的元件都位於同一列中,這種排列方式比較緊湊,可以節省螢幕上的空間,只是要注意每個輸入欄位的所需長度,也許得特別定義一下。

以下為 BS3 v3.3.6 的 bootstrap.css 樣式表中部份和 form 相關的樣式設定,因為所有 <form> 中的所有標記 BS3 都有特別的樣式設定,實在是太多了,為了節省篇幅,就沒有全部在下面列出來,有需要時,請去參考 bootstrap.css 檔案的內容。

<style>
.form-group {
    margin-bottom: 15px;
}
.form-group-sm .form-control-static {
    height: 30px;
    min-height: 32px;
    padding: 6px 10px;
    font-size: 12px;
    line-height: 1.5;
}
.form-group-lg .form-control {
    height: 46px;
    padding: 10px 16px;
    font-size: 18px;
    line-height: 1.3333333;
    border-radius: 6px;
}
.form-control:focus {
    border-color: #66afe9;
    outline: 0;
    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
            box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
}
.form-control::-moz-placeholder {
    color: #999;
    opacity: 1;
}
.form-control:-ms-input-placeholder {
    color: #999;
}
.form-control::-webkit-input-placeholder {
    color: #999;
}
.form-control::-ms-expand {
    background-color: transparent;
    border: 0;
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
    background-color: #eee;
    opacity: 1;
}
.form-control[disabled],
fieldset[disabled] .form-control {
    cursor: not-allowed;
}
</style>

範例 form-vertical (default)

此範例為 form-vertical。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#login {
    margin: 50px auto;
    width: 400px;
    height:auto;
    border: 1px solid gray;
}
form .title {
    padding:10px;
    font-size: 1.5em;
    text-align: center;
    background-color: #99CCFF;
}
form .inputArea {
    padding:20px;
    background-color: #eeeeee;
}
form .action {
    padding:10px;
    text-align: center;
    background-color: #99CCFF;
}
</style>

#login{} 設定了輸入視窗的外觀及大小 寬度有 400px。
form .title{}, form .inputArea{}, form .action{} 各設定了輸入視窗中三個區域的底色及外觀。

HTML

<body>
    
Login
</body>

只有二個輸入欄位,各自用一個 .form-group 的容器裝載,因此兩個欄位間的間距會比較大,有 15px。

範例 form-horizonal

此範例為 form-horizontal。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#login {
    margin: 50px auto;
    width: 400px;
    height:auto;
    border: 1px solid gray;
}
form .title {
    padding:10px;
    font-size: 1.5em;
    text-align: center;
    background-color: #99CCFF;
}
form .inputArea {
    padding:20px;
    background-color: #eeeeee;
}
form .action {
    padding:10px;
    text-align: center;
    background-color: #99CCFF;
}
</style>

#login{} 設定了輸入視窗的外觀及大小,寛度有 400px。
form .title{}, form .inputArea{}, form .action{} 各設定了輸入視窗中三個區域的底色及外觀。

HTML

<body>
    
Login
</body>

第 2 行將輸入表單設為 .form-horizontal 的格式。
第6, 7 行各用 col-*-* 類別設定 <label> 及 <input> 的寬度。在裝置螢幕的尺寸為 xs 時,其外觀等同於 form-vertical 的外觀。

範例 form-inline

此範例為 form-inline。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#login {
    margin: 50px auto;
    width: 800px;
    height:auto;
    border: 1px solid gray;
}
form .title {
    padding:10px;
    font-size: 1.5em;
    text-align: center;
    background-color: #99CCFF;
}
form .inputArea {
    padding:20px;
    background-color: #eeeeee;
}
form .action {
    padding:10px;
    text-align: center;
    background-color: #99CCFF;
}
.form-inline .control-label {
    margin-left: 15px;
    margin-right: 5px;
}
</style>

#login{} 設定了輸入視窗的外觀及大小,為了讓兩個欄位有足夠的空間在同一列,寛度設為 800px。
form .title{}, form .inputArea{}, form .action{} 各設定了輸入視窗中三個區域的底色及外觀。
.form-inline .control-label{} 設定左、右邊界各為 15px 及 5px,這樣在視覺比較美觀,預設的情況下,輸入欄位的名稱和輸入欄位會靠得很近。

HTML

<body>
    
Login
</body>

第 2 行將輸入表單設為 .form-inline 的格式。
兩個輸入欄位及其名稱都包含在同一個 .form-group 的容器中。

2016年7月20日 星期三

BS3 Progressbars

BS3 Progressbars

簡介

進度條 (progressbar) 常用來顯示目前的工作進度,特別是在上傳和下載文件時常會使用。HTML5 中也有個新的標記 <progress> 用來顯示進度條,但其外觀相當單調,和 BS3 中的進度條的外觀比較,根本不在同一個檔次。進度條的基礎樣式類別為 .progress 及 .progress-bar,.progress 為外圍容器,構建進度條的底色;.progress-bar 則為進度條的本體。 style 屬性的百分比值則決定進度條本體的長度;進度條本體的內容文字決定進度條的標示。

進度條本體的修飾樣式類別有:

.progress-bar-sucess, .progress-bar-info, .progress-bar-warning, .progress-bar-danger
設定進度條的本體顏色,不具動畫效果。
.progress-bar-striped
設定進度條本體的斜紋裝飾,如再加上 .active 狀態樣式類別,則具有動畫效果。

以下為 BS3 V3.3.6 之 bootstrap.css 樣式表中有關 .progress-bar 的相關樣式設定。

@-webkit-keyframes progress-bar-stripes {
  from {
    background-position: 40px 0;
  }
  to {
    background-position: 0 0;
  }
}
@-o-keyframes progress-bar-stripes {
  from {
    background-position: 40px 0;
  }
  to {
    background-position: 0 0;
  }
}
@keyframes progress-bar-stripes {
  from {
    background-position: 40px 0;
  }
  to {
    background-position: 0 0;
  }
}
.progress {
    height: 20px;
    margin-bottom: 20px;
    overflow: hidden;
    background-color: #f5f5f5;
    border-radius: 4px;
    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
            box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
}
.progress-bar {
    float: left;
    width: 0;
    height: 100%;
    font-size: 12px;
    line-height: 20px;
    color: #fff;
    text-align: center;
    background-color: #337ab7;
    -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
            box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
    -webkit-transition: width .6s ease;
         -o-transition: width .6s ease;
            transition: width .6s ease;
}
.progress-striped .progress-bar,
.progress-bar-striped {
    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    -webkit-background-size: 40px 40px;
          background-size: 40px 40px;
}
.progress.active .progress-bar,
.progress-bar.active {
    -webkit-animation: progress-bar-stripes 2s linear infinite;
         -o-animation: progress-bar-stripes 2s linear infinite;
            animation: progress-bar-stripes 2s linear infinite;
}
.progress-bar-success {
    background-color: #5cb85c;
}
.progress-striped .progress-bar-success {
    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-info {
    background-color: #5bc0de;
}
.progress-striped .progress-bar-info {
    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-warning {
    background-color: #f0ad4e;
}
.progress-striped .progress-bar-warning {
    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-danger {
    background-color: #d9534f;
}
.progress-striped .progress-bar-danger {
    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
    background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}

範例

範例中展示了六種不同的進度條外觀,前五種都經由條飾樣式類別改變其外觀,唯有最後一種堆疊進度條的 HTML 程式碼略有不同。

CSS

<style>
html {
    width: 100%;
    height: 100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

CSS 中沒有特別的樣式設定。

HTML

<body>
                   
    

Default progress bar

73%

With / Without min-width

0%
0%

Context progress bar

100% charged (Success)
80% charged (Info)
35% charged (Warning)
25% charged (Danger)

Striped progress bar

83%

Animated striped progress bar

83%

Stacked progress bar

10% 15% 20% 15%
</body>

HTML 程式碼相當簡單,不多作解釋;只有三個地方需要注意。
第 14 行中用 min-width 屬性值決定進度條本體的最小長度,這裡用的不是百分比的值。
第 55~60 行是建立堆疊進度條的方式,只要將數個進度條本體元件放置到一個 .progress 的容器中即可。
第 48 行的 .active 類別加在 .progress 容器中,第 59 行的 .active 類別則加在 .progress-bar 的進度條本體中。這二種用法在容器中只有一條進度條時,不會產生任何差異,只有在像堆疊進度條這種情況下,如果 .active 類別是加在 .progress 容器時,則容器中所有斜紋裝飾的進度條都會有動畫效果。但如果 .active 只加在 .progress-bar 的本體元件時,只有該進度條會具有動畫效果。

2016年7月19日 星期二

BS3 Medias

BS3 Medias

簡介

BS3 中的 Media 主要是用來快速產生類似部落格中或社群網站中留言的格式外觀,但其作用不限於此。其基礎類別有二: .media 及 .media-list。.media 一般和 <div> 搭配使用,產生單一的 Media object。.media-list 一般和 <ul> 搭配使用,產生一系列的 media 物件。兩者都可以以巢狀方式存在。Media 的基本結構為一幅圖像(可置於文字的左邊或文字的右邊),一段主題文字,再加上一段敘述性的文字。預設狀態下,圖像的上緣和文字段落的上緣切齊。請參考範例圖。

修飾類別如下:

.media-middle
圖像的中線切齊文字段落的中線。
.media-bottom
圖像的下緣切齊文字段落的下緣。
.media-left
圖像靠左。這裡樣式的設定是將圖像的 padding-right 設定為 10px,而非將圖像移至文字段落的左邊
.media-right
圖像靠右。這裡樣式的設定是將圖像的 padding-left 設定為 10px,而非將圖像移至文字段落的右邊
.media-heading
指定標記內容為主題樣式,般會搭配 <h1> 。。。 <h6> 標記使用。

以下為 BS3 V3.3.6 的 bootstrap.css 樣式表中,有關 .media 類別的定義。

.media {
    margin-top: 15px;
}
.media:first-child {
    margin-top: 0;
}
.media,
.media-body {
    overflow: hidden;
    zoom: 1;
}
.media-body {
    width: 10000px;
}
.media-object {
    display: block;
}
.media-object.img-thumbnail {
    max-width: none;
}
.media-right,
.media > .pull-right {
    padding-left: 10px;
}
.media-left,
.media > .pull-left {
    padding-right: 10px;
}
.media-left,
.media-right,
.media-body {
    display: table-cell;
    vertical-align: top;
}
.media-middle {
    vertical-align: middle;
}
.media-bottom {
    vertical-align: bottom;
}
.media-heading {
    margin-top: 0;
    margin-bottom: 5px;
}
.media-list {
    padding-left: 0;
    list-style: none;
}

範例

範例中用水平分隔線區分兩個展示,上方一個展示單一的 .media 容器。下方則展示一個 .media-list 的容器,並以巢狀方式顯示三個 media object。範例中的圖像都用 holder.js 工具來產生圖像。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

CSS 中沒有特別需要定義的類別。

HTML

<body>
    

Subject

Bla, bla, bla . . .


  • photo_1

    Subject

    Bla, bla, bla . . .

    photo_2

    Subject

    Bla, bla, bla . . .

  • photo_3

    Subject

    Bla, bla, bla . . .

</body>

第 3~13 行建立一個 .media 的元件。第 17~45 行建立一個 .media-list 的元件。
第 6 行用 .img-circle 的修飾類別,將圖像以圓形呈現。
如果要將圖像呈現在文字段落的右邊,可以將其在 HTML 和式碼中的位置對調即可,或使用 .pull-right 修飾類別以逹到目的。

2016年7月15日 星期五

BS3 Navbar

BS3 Navbar

簡介

使用 BS3 的網站其最主導覽列通常都用 .navbar 來實作。主導覽列一般都會佔據螢幕的全寬,因此在螢幕的尺寸變小時,都得做特別的處理,像是將導覽選項隱藏在按鈕中,必須點按按鈕才會出現選項。主導覽列中可以包含的介面元件相當的多樣,可以有圖像、選項、下拉式選項、輸入欄位等等,因此在樣式表中相關類別的定義很繁複,HTML 的程式碼也多,但只要瞭解其基本結構,就很容易看得懂了。

首先,根標記 <nav> 的基礎類別為 .navbar,並在這個元件設定所須的修飾類別。元件內容為一個類別為 .navbar-header 的 <div> 標記,內含要出現在導覽列中的元件。導覽列中的元件又區分成三部份,一部份是不論螢幕大小,都會出現在導覽列中的元件,像是企業的商標,其類別為 .navbar-brand。另外二部則會因應螢幕的大小隱藏或出現,這二部份則利用 collapse 插件來處理,其類別分別為 .navbar-toggle 及 .navbar-collapse。這二部份看範例程式碼的解說會比較清楚。

以下為 .navbar 的修飾類別:

.navbar-default
主導覽列的底色為淡灰色,字體為黑色。
.navbar-inverse
主導覽列的底色為黑色,字體為白色。
.navbar-static-top
去除主導覽列的上、左、右的邊框及邊框的圓角,其餘不變。
.navbar-fixed-top
主導覽列佔據螢幕畫面的全寬,並在捲動螢幕時,保持在螢幕畫面的上方不動。
.navbar-fixed-bottom
主導覽列佔據螢幕畫面的全寬,並在捲動螢幕時,保持在螢幕畫面的下方不動。

下列為 BS3 V3.3.6 中 bootstrap.css 樣式表中 .navbar 相關的部份樣式定義。全部約有近 500 行的定義,為了節省篇幅,這裡只列出很小的一部份。

.navbar {
    position: relative;
    min-height: 50px;
    margin-bottom: 20px;
    border: 1px solid transparent;
}
@media (min-width: 768px) {
    .navbar {
        border-radius: 4px;
    }
}
@media (min-width: 768px) {
    .navbar-header {
        float: left;
    }
}
.navbar-collapse {
    padding-right: 15px;
    padding-left: 15px;
    overflow-x: visible;
    -webkit-overflow-scrolling: touch;
    border-top: 1px solid transparent;
    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
}
.navbar-collapse.in {
    overflow-y: auto;
}
@media (min-width: 768px) {
    .navbar-collapse {
        width: auto;
        border-top: 0;
        -webkit-box-shadow: none;
                box-shadow: none;
    }
    .navbar-collapse.collapse {
        display: block !important;
        height: auto !important;
        padding-bottom: 0;
        overflow: visible !important;
    }
    .navbar-collapse.in {
        overflow-y: visible;
    }
    .navbar-fixed-top .navbar-collapse,
    .navbar-static-top .navbar-collapse,
    .navbar-fixed-bottom .navbar-collapse {
        padding-right: 0;
        padding-left: 0;
    }
}
.navbar-fixed-top .navbar-collapse,
.navbar-fixed-bottom .navbar-collapse {
    max-height: 340px;
}
@media (max-device-width: 480px) and (orientation: landscape) {
    .navbar-fixed-top .navbar-collapse,
    .navbar-fixed-bottom .navbar-collapse {
        max-height: 200px;
    }
}
.container > .navbar-header,
.container-fluid > .navbar-header,
.container > .navbar-collapse,
.container-fluid > .navbar-collapse {
    margin-right: -15px;
    margin-left: -15px;
}
@media (min-width: 768px) {
    .container > .navbar-header,
    .container-fluid > .navbar-header,
    .container > .navbar-collapse,
    .container-fluid > .navbar-collapse {
        margin-right: 0;
        margin-left: 0;
    }
}
.navbar-static-top {
    z-index: 1000;
    border-width: 0 0 1px;
}
@media (min-width: 768px) {
    .navbar-static-top {
        border-radius: 0;
    }
}
.navbar-fixed-top,
.navbar-fixed-bottom {
    position: fixed;
    right: 0;
    left: 0;
    z-index: 1030;
}
@media (min-width: 768px) {
    .navbar-fixed-top,
    .navbar-fixed-bottom {
        border-radius: 0;
    }
}
.navbar-fixed-top {
    top: 0;
    border-width: 0 0 1px;
}
.navbar-fixed-bottom {
    bottom: 0;
    margin-bottom: 0;
    border-width: 1px 0 0;
}
.navbar-brand {
    float: left;
    height: 50px;
    padding: 15px 15px;
    font-size: 18px;
    line-height: 20px;
}
.navbar-brand:hover,
.navbar-brand:focus {
    text-decoration: none;
}
.navbar-brand > img {
    display: block;
}
@media (min-width: 768px) {
    .navbar > .container .navbar-brand,
    .navbar > .container-fluid .navbar-brand {
        margin-left: -15px;
    }
}
.navbar-toggle {
    position: relative;
    float: right;
    padding: 9px 10px;
    margin-top: 8px;
    margin-right: 15px;
    margin-bottom: 8px;
    background-color: transparent;
    background-image: none;
    border: 1px solid transparent;
    border-radius: 4px;
}
.navbar-toggle:focus {
    outline: 0;
}
.navbar-toggle .icon-bar {
    display: block;
    width: 22px;
    height: 2px;
    border-radius: 1px;
}
.navbar-toggle .icon-bar + .icon-bar {
    margin-top: 4px;
}
@media (min-width: 768px) {
    .navbar-toggle {
        display: none;
    }
}
.navbar-nav {
    margin: 7.5px -15px;
}
.navbar-nav > li > a {
    padding-top: 10px;
    padding-bottom: 10px;
    line-height: 20px;
}
@media (max-width: 767px) {
    .navbar-nav .open .dropdown-menu {
        position: static;
        float: none;
        width: auto;
        margin-top: 0;
        background-color: transparent;
        border: 0;
        -webkit-box-shadow: none;
                box-shadow: none;
    }
    .navbar-nav .open .dropdown-menu > li > a,
    .navbar-nav .open .dropdown-menu .dropdown-header {
        padding: 5px 15px 5px 25px;
    }
    .navbar-nav .open .dropdown-menu > li > a {
        line-height: 20px;
    }
    .navbar-nav .open .dropdown-menu > li > a:hover,
    .navbar-nav .open .dropdown-menu > li > a:focus {
        background-image: none;
    }
}
@media (min-width: 768px) {
    .navbar-nav {
        float: left;
        margin: 0;
    }
    .navbar-nav > li {
        float: left;
    }
    .navbar-nav > li > a {
        padding-top: 15px;
        padding-bottom: 15px;
    }
}

範例

範例中展示了 .navbar-default 及 .navbar-inverse 兩種樣式的導覽列。導覽列中含有二個靠左的選項及一個下拉式選單及一個靠右的搜尋選項。當螢幕縮小時,所有選項會隱藏於一個按鈕中。點按按鈕則會以下拉式選單的表現方式出現所有的選項。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width:1000px;
    padding:20px;
}
</style>

CSS 中沒有特別的樣式需要設定。

HTML

<body>
    
    
</body>

HTML 程式碼第 2~40 行和第 42~80 行的程式碼,除了第 2 行和第 42 行的類別有 .navbar-default 及 .navbar-inverse 的區分外,其實是完全一樣的,所以只註解第 2~40 行的程式碼。
第 2 行建立一個導覽列的容器元件。
第 5~13 行建立導覽列的內容。
第 6 行建立企業的商標,通常會放置一個圖像,這裡簡單的用文字替代。
第 7~12 行建立一個圖像有三條橫線的按鈕,設定其類別為 .navbar-toggle 及 .collapsed 表示此元件會和另一元件進行切換,目前的狀態為隱藏。這裡要注意 .collapsed 的拼法為 collapse 的過去式,在 bootstrap.css 中是找不到這個類別定義的,它是在 bootstrap.js 程式中用來區分元件狀態為隱藏或顯現之用,千萬不要拼錯了。
第 7 行尚有二個自訂屬性 data-toggle="collapse" 表示切換的模式為隱藏或顯現, data-target="#navbar-collapse-1" 則指定切換時的目標元件是 id 值設定為 navbar-collapse-1 的元件。這裡也要注意兩邊的值要符合。
第 16~38 行建立要和按鈕切換顯現的內容元件。
第 16 行設定其 id 為 "navbar-collapse-1", 類別為 .navbar-collpase 及 .collapse,注意這裡的拼法 collapse 不是過去式。
第 17~31 行建立選項及下拉式選單。
第 32~37 行建立搜尋功能。用 .navbar-right 類別設定,將選項置於導覽列的右方。

2016年7月11日 星期一

BS3 Pills

BS3 Pills

簡介

.nav-pills 和 .nav-tabs 的基本結構大致相同,作業方式也一致,只是在外觀上有所差別。.nav-pills 沒有檔案夾的外觀,選項的部份比較像是個按鈕,而不是檔案夾的標箋。選項和閱讀內容的關聯方式,則和 .nav-tabs 完全一樣。實際上,只要把 .nav-tabs 的 HTML 碼中的 .nav-tabs 類別改成 .nav-pills,data-toggle 自訂屬性的值籨 "tab" 類別改成 "pill",外觀就會從檔案標箋的型態改成 pills 的型態了。

.nav-justified 也可以用在 .nav-pills 中,同樣是把父元件的寬度平均分配給所有的 pills。另有一個 .nav-stacked 的修飾類別,可以讓 pills 成垂直排列。這個修飾類別在 .nav-tabs 中也可以用,但是要修改很多的 CSS 定義,畫面才會好看,若非絕對必要,不要在 .nav-tabs 中應用 .nav-stacked,如果用了,就得修改很多 CSS 類別的屬性;用在 .nav-pills 中,就容易的多了。

以下為 BS3 v3.3.6 之 bootstrap.css 樣式表中,.nav-pills 相關 CSS 類別的定義。

.nav-pills > li {
    float: left;
}
.nav-pills > li > a {
    border-radius: 4px;
}
.nav-pills > li + li {
    margin-left: 2px;
}
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
    color: #fff;
    background-color: #337ab7;
}
.nav-pills > .active > a > .badge {
    color: #337ab7;
    background-color: #fff;
}
.nav-pills > li > a > .badge {
    margin-left: 3px;
}
.nav-stacked > li {
    float: none;
}
.nav-stacked > li + li {
    margin-top: 2px;
    margin-left: 0;
}

範例

範例中展示二個例子,第一個的選項為橫式排列。第二個的選項為直式排列,為了因應直式排列的選項,將選項相關的內容移到選項的右邊放置。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

CSS 中沒有特別的樣式需要定義。

HTML

<body>
    
    

CSS

Description of CSS

HTML

Description of HTML

Javascript

Description of Javascript


Red

Description of red

Blue

Description of blue

Yellow

Description of yellow

</body>

第 3 行除了 .nav 之外,又定義了 .nav-pills 和 .nav-justified 二個 CSS 類別,讓所有選項佔滿父元件的寬度。
所有 <li> 標記都具有 data-toggle 自訂屬性,其值為 "pill"。data-toggle="pill"
第 27 行除了 .nav 之外,又定義了 .nav-pills 和 .nav-stacked 二個 CSS 類別,讓選項成垂直排列。
第 26,33 行用 .col-sm-* 定義選項和內容所佔的寬度,讓選項出現在左邊,內容出現在右邊。
第 10~23 行及第 34~47 行 關於 .tab-content 的部份,其結構和 .nav-tabs 的結構如出一轍。

2016年7月8日 星期五

BS3 Tabs

BS3 Tabs

簡介

標箋 (tab) 是一㮔在點按標箋後改變顯示內容的介面元件。常常用來在有限的網頁版面中讓使用者選擇有興趣閱讀的內容。BS3 中的 CSS 基礎擴充類別 .nav-tabs 的作用便在建立這種標箋的介面元件。.nav-tabs 基本上是擴充 .nav 而來,所以元件的 CSS 類別必須同時含有 .nav 及 .nav-tabs 兩個類別。搭配使用的標記也主要是 <ul>, <li>, <a> 等等。<li> 中含有可供選取的選項,具有 .active 及 .disabled 兩個狀態。<a> 標記中則為標箋的標示文字或圖像。

至於點按標箋後,相對應要出現的內容則會使用到 .tab-content 及 .tab-pane 兩個基礎類別。

以下為 BS3 V3.3.6 的 bootstrap.css 樣式表中 .nav-tabs 相關的樣式定義。

.nav-tabs {
    border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
    float: left;
    margin-bottom: -1px;
}
.nav-tabs > li > a {
    margin-right: 2px;
    line-height: 1.42857143;
    border: 1px solid transparent;
    border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover {
    border-color: #eee #eee #ddd;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
    color: #555;
    cursor: default;
    background-color: #fff;
    border: 1px solid #ddd;
    border-bottom-color: transparent;
}
.nav-tabs.nav-justified {
    width: 100%;
    border-bottom: 0;
}
.nav-tabs.nav-justified > li {
    float: none;
}
.nav-tabs.nav-justified > li > a {
    margin-bottom: 5px;
    text-align: center;
}
.nav-tabs.nav-justified > .dropdown .dropdown-menu {
    top: auto;
    left: auto;
}
@media (min-width: 768px) {
    .nav-tabs.nav-justified > li {
        display: table-cell;
        width: 1%;
    }
    .nav-tabs.nav-justified > li > a {
        margin-bottom: 0;
    }
}
.nav-tabs.nav-justified > li > a {
    margin-right: 0;
    border-radius: 4px;
}
.nav-tabs.nav-justified > .active > a,
.nav-tabs.nav-justified > .active > a:hover,
.nav-tabs.nav-justified > .active > a:focus {
    border: 1px solid #ddd;
}
@media (min-width: 768px) {
    .nav-tabs.nav-justified > li > a {
        border-bottom: 1px solid #ddd;
        border-radius: 4px 4px 0 0;
    }
    .nav-tabs.nav-justified > .active > a,
    .nav-tabs.nav-justified > .active > a:hover,
    .nav-tabs.nav-justified > .active > a:focus {
        border-bottom-color: #fff;
    }
}
.tab-content > .tab-pane {
    display: none;
}
.tab-content > .active {
    display: block;
}

範例

範例中展示了二個標箋介面元件,第一個採用預設的外觀。第二個使用了 .nav-justified 的 CSS 修飾類別,這個修飾類別會將父元件的寬度平均分配給每一個標箋,讓標箋的寬度一致。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
</style>

CSS 中不需要設定其它樣式。

HTML

<body>
    
    

CSS

Description of CSS

HTML

Description of HTML

Javascript

Description of Javascript


Red

Description of red

Blue

Description of blue

Yellow

Description of yellow

</body>

第 3, 25 行,產生標箋元件需同時使用 .nav 及 .nav-tabs 類別。第 25 行多加了一個 .nav-justified 修飾類別。
所有 <li> 標記需具有 data-toggle 屬性,其值需設定為 "tab" 字串。也就是data-toggle="tab",注意,這裡的 tab 是單數詞。
所有標箋內容的部份,需全部包含在一個具有 .tab-content 類別的標記中;每單一標箋的內容,則全部包含在一個具有 .tab-pane 的標記中。
標箋和標箋內容,則經 <a> 的 href 屬性,和具有 .tab-pane 類別標記的 id 屬性來連接。例:第 4 行的 href="#CSS" 和第 10 行的 id="CSS"

2016年7月7日 星期四

BS3 Navs

BS3 Navs

簡介

BS3 中有個名為 .nav 的 CSS 基礎類別,這個類別又是所有導覽 (navigation) 介面元件的基石,其它幾個導覽介面元件像是: .nav-bar, .nav-tabs, .nav-pills 等,都是以 .nav 為基本樣式,再加以擴充而成。.nav 原則上都搭配 <ul>, <li>, <a> 幾個標記使用,可以很容易產生一個導覽的介面元件,<li> 中含有可供選取的選項,具有 .active 及 .disabled 兩個狀態。如果 <li> 具有 .nav-divider 類別且標記中不含內容,則該 <li> 顯示成分隔線,藉以分隔不同性質的選項。<a> 中的 href 屬性值則指向所要導覽的位置。

以下為 BS3 V3.3.6 中 bootstrap.css 樣式表中 .nav 相關的樣式定義。

.nav {
    padding-left: 0;
    margin-bottom: 0;
    list-style: none;
}
.nav > li {
    position: relative;
    display: block;
}
.nav > li > a {
    position: relative;
    display: block;
    padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
    text-decoration: none;
    background-color: #eee;
}
.nav > li.disabled > a {
    color: #777;
}
.nav > li.disabled > a:hover,
.nav > li.disabled > a:focus {
    color: #777;
    text-decoration: none;
    cursor: not-allowed;
    background-color: transparent;
}
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
    background-color: #eee;
    border-color: #337ab7;
}
.nav .nav-divider {
    height: 1px;
    margin: 9px 0;
    overflow: hidden;
    background-color: #e5e5e5;
}
.nav > li > a > img {
    max-width: none;
}

範例

範例中展示了一個很簡單的導覽介面元件,具有五個顏色選項及一條水平分隔線。同時也展示了如何變更介面元件的底色,及為了配合底色的變更,也變更了選項字體的顏色。這是因為變更後的底色比較深,預設的字體顏色會顯得不清楚,所以必須同時變更字體的顏色,若選擇變更的底色比較淡,也許可以不用更改字體的顏色。這個必須自行加以判斷。

CSS

<style>
html {
    width:100%;
    height:100%;
}
body {
    margin: 0 auto;
    max-width: 1000px;
    padding: 20px;
}
#color {
    width: 200px;
    height: auto;
    border: 3px solid skyblue;
    border-radius: 4px;
    background-color: coral;
}
#color > .nav > li > a {
    color: white;
}
#color > .nav > li > a:hover {
    background-color: skyblue;
    color: black;
}
#color > .nav >li.disabled > a{
    color: #777;
}
</style>

#color{} 定義了介面元件的整體外觀。其它的樣式都以 #color 領頭,定義了字體的顏色及當游移至選項上方時,所要改變的底色,如此可以避免干擾到其它 .nav 元件的樣式設定。

HTML

<body>
    
</body>

HTML 中,用 <nav> 標記做為容器,並賦予 id 值,利用 CSS 改變其樣式值以形成介面元件的整體外觀。