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。