Bootstrap零基礎(chǔ)入門教程(三)
什么是 Bootstrap?
Bootstrap 是一個用于快速開發(fā) Web 應(yīng)用程序和網(wǎng)站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。
歷史
Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 開發(fā)的。Bootstrap 是 2011 年八月在 GitHub 上發(fā)布的開源產(chǎn)品。
寫到這里,這篇從零開始學Bootstrap(3)我想寫以下幾個內(nèi)容:
1. 基于我對Bootstrap的理解,做一個小小的總結(jié)。
2. 對從零開始學Bootstrap(2)例子進行UI美化和代碼優(yōu)化,主要是說說我是怎么做出自己想要的效果的。
3. 授人以魚不如授人以漁,以自己的例子(因為自己也是新手,寫出來的東西可能更適合初學者),講講代碼編寫過程中遇到的坑和需要注意的點。
廢話不多說,下面開始:
一、 Bootstrap的小小總結(jié)
基于以Bootstrap的官方文檔(http://v3.bootcss.com/)的說明,Bootstrap分為三個大塊:CSS樣式,組件,Javascript插件。
首先要明確一點:Bootstrap是一個框架,意思就是別人造好了輪子,你可以直接拿來用,免去了自己去造輪子。所以咱們需要明確兩點:這些輪子是什么樣的輪子,怎么樣去使用這些輪子。
1. CSS樣式:主要介紹了柵格系統(tǒng)和Bootstrap的全局樣式。通過設(shè)定Class的值實現(xiàn)。
1.1柵格系統(tǒng):
讓我們可以很方便的實現(xiàn)HTML頁面的布局(http://v3.bootcss.com/css/#grid)。
我覺得柵格系統(tǒng)很重要。因為HTML頁面的布局是很重要也很繁瑣的一項任務(wù)(你看一下W3School里關(guān)于布局的介紹http://www.w3school.com.cn/html/html_layout.asp,看一下例子里的代碼,就明白了),并且需要考慮到不同瀏覽器、不同設(shè)備的兼容性。
柵格系統(tǒng)把這一切大大簡化了。打開上面關(guān)于柵格系統(tǒng)的連接,你會發(fā)現(xiàn)只需要根據(jù)你想要實現(xiàn)的效果,給HTML元素Class屬性賦相應(yīng)的值,就可以實現(xiàn),并且還能設(shè)置針對不同屏幕大小的設(shè)備展現(xiàn)不同的效果。
1.2 Bootstrap全局樣式:
也就是Bootstrap對常用HTML元素(eg: DIV、Button、 P、 Table、 Img等等)是怎樣美化的。通過給HTML元素的Class屬性賦相應(yīng)的值,就可以得到自己想要的效果。
舉一個最簡單的例子:
如上圖所示,Bootstrap可以讓你僅僅改變Button元素的class的值就是改變按鈕的大小,而不用很麻煩的去修改css文件,或者給元素內(nèi)嵌style的值。
2. 組件:我認為組件就是Bootstrap把一些元素(HTML元素和Javascript代碼)組合起來,就變成了組件,并且提供了很多很好看很實用的圖標。這些組件基本都是HTML開發(fā)過程中常用的。通過設(shè)定Class的值實現(xiàn)。(http://v3.bootcss.com/components/)
舉一個最簡單的例子:
如上圖所示,當我們需要實現(xiàn)導航功能的時候。找到Boostrap里相應(yīng)的組件,依照其給的代碼模板,根據(jù)自己的需求,賦相應(yīng)的class和ul、li值就可以了
3. Javascript插件:我認為Bootstrap的Javascript插件就是封裝了常用網(wǎng)頁交互功能的”輪子”。只需要設(shè)定class屬性和data屬性就可以實現(xiàn)常用的網(wǎng)頁交互功能,而不用自己寫一大堆javascript代碼。
首先說一個小插曲,新手可能誤以為”javascript”和”java”有著很深的聯(lián)系,甚至會認為javascript是java的變種。其實并不是這樣,javascript是網(wǎng)景(Netscape)公司開發(fā)的應(yīng)用于互聯(lián)網(wǎng)的腳本語言,其實它最先的名字”是livescript”,后來網(wǎng)景公司與Sun公司(也就是發(fā)明Java的公司,后來被Oracle收購)達成合作,當時Java語言如日中天,名氣很大,為了搭順風車,就把livesript改名為javascript。以至于有人開玩笑:”Java”和”Javascrip”的區(qū)別就好比”雷鋒”和”雷峰塔”的區(qū)別一樣。
言歸正傳,我們知道,Javascript是為了賦予網(wǎng)頁交互功能而存在的。所以,Bootsript上豐富的Javascript插件能夠讓你很方便的實現(xiàn)常用的網(wǎng)頁交互功能,而不用把精力放在”造輪子”上。
如上圖所示,利用Bootstrap的輪播插件(http://www.runoob.com/bootstrap/bootstrap-carousel-plugin.html, Bootstrap的官方文檔這里沒有翻譯成中文,runoob上卻有很詳細的中文翻譯,并且可以在線修改代碼提交觀察效果,強烈推薦),你可以很方便的實現(xiàn)現(xiàn)在很多網(wǎng)站都采用的圖片輪播功能。這里只需要根據(jù)上述鏈接里面的教程,賦相應(yīng)的class和圖片src值就可以了,連data值都不用設(shè)。
二、 對從零開始學Bootstrap(2)例子進行UI美化和代碼優(yōu)化
下圖是上期教程中實現(xiàn)的效果:
我們可以看到有以下幾個缺點需要改正:
(1) 點擊具體同學,顯示其信息之后,沒有處于被選中的狀態(tài)。(你一開始點擊,會處于被選中狀態(tài),但那只是button的點擊效果,你點一下空白處,被選中的狀態(tài)就消失了)
(2) 色彩單調(diào),不太美觀。
(3) 布局方面需要調(diào)整,信息框是呈現(xiàn)我們需要的信息的地方,應(yīng)該盡可能大,最好其顯示的時候能把不需要的框給隱藏起來。
(4) 對于代碼方面,對從零開始學Bootstrap(2)中的Javascript代碼都寫在HTML頁面里了,并且有重復的代碼段,應(yīng)該把重復的代碼段寫成函數(shù),這樣可以減少代碼體積,再一個修改代碼的時候,我直接修改相應(yīng)的函數(shù)就可以了,而不用一個地方一個地方的找。Javascript代碼可以寫到JS文件里,實現(xiàn)HTML頁面和Javascript代碼的分離。
技術(shù)選型(直白的說就是思考怎樣利用Bootstrap框架里已有的東西,實現(xiàn)想要的效果):
1、首先調(diào)整布局,把信息框和同學框調(diào)整在一起,班級框顯示在最上面。
顯然,我們只需要把信息框所在的DIV和同學框的DIV放在同一個row的DIV里,并把修改跟柵格系統(tǒng)相關(guān)的class屬性值”col-md”就可以實現(xiàn)。比如我們想讓他們2:1的比例顯示,那么信息框的class屬性應(yīng)該有col-md-8,而同學框的應(yīng)該是col-md-4了。
值得注意的是,前端永遠不可能是一步到位的開發(fā),往往最開始的代碼都不是我們想要的完美結(jié)果,需要細細調(diào)整。以下面為例,大家要學會自己搜,去嘗試,去不斷的調(diào)整(后面的調(diào)整,具體過程就不交代了):
我們修改完代碼后,呈現(xiàn)的效果是下面這樣的:
很明顯的,上面每行只顯示一個Class,有點浪費空間。下面的兩個部分沒有對齊。
把上面DIV組件的class屬性里的”btn-group-vertical”刪掉,把col-md-6添加到j(luò)s代碼里的tmp_button的class屬性中。另外觀察到這樣設(shè)定了之后,第一行與第二行相比有奇怪的縮進:
毫無疑問,這種外觀、布局類的變化跟CSS有關(guān)。這時候我們可以看一下元素具體的CSS。
以Chrome為例:
在這個元素上點鼠標右鍵,選擇Inspect,即審查,你會在右邊的框里查到相應(yīng)的代碼。通過比對,我們發(fā)現(xiàn)是margin-left的問題,這個屬性是bootstrap框架里默認的,從上層元素繼承而來,有的為 -1px,有的為0px,我們只需要改成一樣就可以了,比如都改成0px:
在js代碼里的tmp_button,修改style屬性,添加”margin-left:0px;”,有的人覺得字體居中不好看,可以添加text-align:left,設(shè)定按鈕上的文字從左邊起。
改正后的效果:
2、添加折疊按鈕,讓用戶可以通過這個按鈕隱藏/打開class框,點擊classmate顯示詳細信息的時候,自動隱藏,以把大量的空間省給信息框來顯示。
添加折疊按鈕可以參考http://www.runoob.com/bootstrap/bootstrap-collapse-plugin.html 來實現(xiàn)。
另外,我們可以給折疊按鈕加一個好看的圖標,參考http://v3.bootcss.com/components/#glyphicons的教程就可以輕松實現(xiàn)。
實現(xiàn)點擊classmate顯示詳細信息的時候,自動隱藏,需要修改classmate按鈕的點擊事件,即相應(yīng)的js代碼。
我們查看Bootstrap折疊插件的用法http://www.runoob.com/bootstrap/bootstrap-collapse-plugin.html(這個更好,官方的這部分還沒翻譯好),查到下面的內(nèi)容:
原來Class屬性里的cllapse和in值控制了隱藏和顯示功能,那我們只需要在按鈕的click事件js代碼里修改相應(yīng)的要進行”顯示/隱藏”操作的HTML元素的class屬性就可以了,于是在classmate按鈕的click函數(shù)里添加以下語句就可以了:
$("#collapseOne").attr("class","panel-collapse collapse");
3、修正”點擊具體同學,顯示其信息之后,沒有處于被選中的狀態(tài)”的bug。
我們通過查閱文檔,http://www.runoob.com/bootstrap/bootstrap-button-plugin.html, 給button的data-toggle屬性設(shè)置為”button”,可以使其變成點擊后自動呈現(xiàn)被選中的狀態(tài)。
所以我們給classmate的button添加屬性data-toggle=”button”。
此時又出現(xiàn)了另一個問題,我想接下去點擊其他classmate的時候,原來點的還是處于激活狀態(tài),怎么辦?
通過查閱http://www.runoob.com/bootstrap/bootstrap-buttons.html, button的class賦值有active時,才會呈現(xiàn)被選中的狀態(tài),也就是說,上面的設(shè)定,也就是bootstrap做了這么一件事情:當data-toggle=”button”的按鈕被點擊時,自動把active添加到class里,此時呈現(xiàn)被選中狀態(tài),當再次被點擊時,自動把active從class里移除,就呈現(xiàn)未被選中的狀態(tài)。
也就是說,我們只要自己去做這個操作,比如在點擊classmate時,我可以把所有的classmate按鈕的active都從class屬性里移除,這樣點擊完成后,只有我最新點擊的Button處于active狀態(tài)。
因此,只需要在classmate按鈕的click函數(shù)里加入這樣的語句:
$(".btn-classmate").attr("class","btn btn-default btn-classmate btn-info");
效果如下圖:
4、美化按鈕外觀
找到bootstrap里CSS關(guān)于按鈕的部分:
http://www.runoob.com/bootstrap/bootstrap-buttons.html
按照教程修改,我這里只是簡單的修改了一下按鈕的顏色,大家可以按照需求自己改。效果如下圖:
5、 HTML頁面和Javascript代碼的分離
其實分為兩步:
第一步:把javascript代碼放到j(luò)s文件里,并在HTML文件里鏈接上。
第二步:把javascript里復用,或者有明確功能的代碼塊,寫進一個函數(shù)里,直接調(diào)用函數(shù)。
由于這兩步都比較簡單,任何學過編程語言的應(yīng)該都會。我就不展開寫了。
值得注意的是,在鏈接JS文件時,要注意順序。
比如Bootstrap的JS文件,里面的代碼是基于Jquery寫的,用了很多Jquery的函數(shù),所以Jquery的JS文件要在Bootstrap的JS文件之前聲明鏈接。
同理,咱們的JS文件時基于Bootstrap,所以要在Bootstrap之后,不然代碼就不起作用了。
最后國際慣例,貼一下相關(guān)的代碼:
getClassmate.html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getClassmate</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <style type="text/css"> #btn-group-vertical-classes { overflow-y:auto; overflow-x:auto; height:100px; } #btn-group-vertical-classmates { overflow-y:auto; overflow-x:auto; height:500px; } button { text-overflow: ellipsis; overflow: hidden; border-radius: 0px; } #context_div { overflow-y:auto; overflow-x:auto; height:500px; } </style> </head> <body> <div class="container"> <div class="panel panel-default"> <div class="panel-heading"> <h4 class="panel-title" style="text-align:right;"> <a id="collapse_a" data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> Click this to show/hide class </a> </h4> </div> <div id="collapseOne" class="panel-collapse collapse in"> <div class="panel-body"> <div class="row" id="div1-classes-classmates"> <div class="btn-group-lg col-md-12" role="group" aria-label="..." id="btn-group-vertical-classes"> <!-- where classes show--> </div> </div> </div> </div> </div> <br></br> <div class="row"> <div class="btn-group-vertical btn-group-lg col-md-4 " id="btn-group-vertical-classmates" role="group" aria-label="..."> <!-- where classmates show--> <button type="button" style="border-radius: 0px;" class="btn btn-default">Click class to show classmate.</button> </div> <div class="form-group"> <div class="col-md-8"> <div class="jumbotron" id="context_div"> <p>Click classmate to show details.</p> </div> </div> </div> </div> </div> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="js/jquery-3.0.0.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="js/bootstrap.min.js"></script> <script src="js/script_getClassmate.js"></script> </body> </html>
script_getClassmate.js:
$(document).ready(function(){ $.getJSON("resource/classmates.json",function(result){ $.each(result, function(i, field){ var tmp_button=$('<button type="button" style="border-radius: 0px; text-align:left; margin-left:0px" class="btn btn-default btn-class col-md-6 btn-success" data-toggle="button" chosen_state=0></button>').text(i); tmp_button.attr("title",i); $("#btn-group-vertical-classes").append(tmp_button); }); $(".btn.btn-default.btn-class").click(function(){ var tmp_chosen=Number($(this).attr("chosen_state"))^1; $(this).attr("chosen_state",String(tmp_chosen)); showClassmates(result); $(".btn.btn-default.btn-classmate").click(function(){ $(".btn-classmate").attr("class","btn btn-default btn-classmate btn-info"); $("#collapseOne").attr("class","panel-collapse collapse"); var selected_classmate=$(this).text(); showClassmateDetail(result,selected_classmate); }); }); }); }) function showClassmates(result){ $("#btn-group-vertical-classmates").empty(); var chosen_list=new Array(); $(".btn.btn-default.btn-class").filter(function(){ judgeflag=false; if($(this).attr("chosen_state")=="1"){ judgeflag=true; chosen_list.push($(this).text()); } return judgeflag; }); $.each(result,function(i,field){ var chosen_list_x; for (chosen_list_x in chosen_list){ if(chosen_list[chosen_list_x]==i){ $.each(field,function(j,field2){ var tmp_button=$('<button type="button" style="border-radius: 0px;" class="btn btn-default btn-classmate btn-info" data-toggle="button" chosen_state=0></button>').text(j); tmp_button.attr("title",j); $("#btn-group-vertical-classmates").append(tmp_button); }); } } }); } function showClassmateDetail(result,selected_classmate){ var classmate_context_item; $("#context_div").empty(); $.each(result,function(i,field){ $.each(field,function(j,field2){ if(j==selected_classmate){ $.each(field2,function(k,field3){ //alert(k); //alert(field3); classmate_context_item=k + ": " + field3; var tmp_p=$('<p></p>').text(classmate_context_item); $("#context_div").append(tmp_p); }); } }); }); }
classmates.json:
{ "Class 001": { "Xiao Wang": { "Gender": "Male", "Age": "18", "Interest": "Football", "Hometown": "Shanghai", "Chinese": "78", "Math": "90", "English": "66", "Physics": "81", "Chemistry": "88", "History": "69", "Geography": "92" }, "Xiao Li": { "Gender": "Male", "Age": "20", "Interest": "Basketball", "Hometown": "Beijing", "Chinese": "98", "Math": "77", "English": "97", "Physics": "72", "Chemistry": "73", "History": "88", "Geography": "81" } }, "Class 002": { "Xiao Cai": { "Gender": "Female", "Age": "19", "Interest": "Dance", "Hometown": "Gaoxiong", "Chinese": "93", "Math": "80", "English": "92", "Physics": "82", "Chemistry": "77", "History": "89", "Geography": "83" } }, "Class 003": { "Xiao Ma": { "Gender": "Male", "Age": "18", "Interest": "Reading", "Hometown": "Taibei", "Chinese": "91", "Math": "93", "English": "96", "Physics": "97", "Chemistry": "100", "History": "94", "Geography": "92" } }, "Class 005": { "Xiao Zhang": { "Gender": "Male", "Age": "20", "Interest": "Running", "Hometown": "Guangzhou", "Chinese": "67", "Math": "70", "English": "66", "Physics": "80", "Chemistry": 68, "History": "79", "Geography": "93" } } }
以上所述是小編給大家介紹的Bootstrap零基礎(chǔ)入門教程(三),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
實現(xiàn)web打印的各種方法介紹及實現(xiàn)代碼
web的打印方法具我自己懂得知道的有:JQuery插件Jqprint實現(xiàn);JQery打印插件PrintArea實現(xiàn)網(wǎng)頁打印;CSS控制網(wǎng)頁打印樣式,本文詳細介紹實現(xiàn)步驟,感興趣的朋友可以了解下2013-01-01微信自定義分享鏈接信息(標題,圖片和內(nèi)容)實現(xiàn)過程詳解
這篇文章主要介紹了微信自定義分享鏈接信息(標題,圖片和內(nèi)容)實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09使用webpack將ES6轉(zhuǎn)化ES5的實現(xiàn)方法
這篇文章主要介紹了使用webpack將ES6轉(zhuǎn)化ES5的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10ExtJs使用自定義插件動態(tài)保存表頭配置(隱藏或顯示)
這篇文章主要介紹了ExtJs使用自定義插件動態(tài)保存表頭配置(隱藏或顯示) ,需要的朋友可以參考下2018-09-09使用phantomjs進行網(wǎng)頁抓取的實現(xiàn)代碼
這篇文章主要介紹了使用phantomjs進行網(wǎng)頁抓取的實現(xiàn)代碼,需要的朋友可以參考下2014-09-09javascript 動態(tài)改變onclick事件觸發(fā)函數(shù)代碼
javascript 動態(tài)改變onclick事件觸發(fā)函數(shù)代碼,需要的朋友可以參考下。2011-08-08