Bootstrap 源碼解析


前言

Bootstrap 是個CSS庫,簡單,高效。很多都可以忘記了再去網站查。但是有一些核心的東西需要弄懂。個人認為弄懂了這些應該就算是會了。源碼看一波。

柵格系統

所謂的柵格系統其實就是一種布局方式。融合bootstap的自適應樣式就會顯的很酷炫。

例子:

    <div class="container">
        <div class="row">
            <div class="col-xs-6">
                I am col-xs-6
            </div>
            <div class="col-xs-6">
                I am col-xs-6
            </div>
        </div>
    </div>

.container

.container = margin:0 auto + padding:0 15px + clearfix + media

1.margin 讓盒子居中。

2.padding 讓盒子與兩邊有一定的距離,為了美感。注意數字15。

3.clearfix為了防止與BFC有關的一些bug(這個有空再寫一篇記錄)。

4.media是為了相應式,根據不同的屏幕大小設置寬度。

注:.container-fluid 跟.container 的唯一區別就是沒有相應式。

.row

.row = clearfix + margin:0 -15px

1.clearfix 是為了包含浮動的.col-xs-$ 們。

2.負的margin值是為了抵消.container的padding。

疑點:為什么要抵消掉.container的padding. 原因:抵消是為了盡量減少因為空間不足從而引起.contanier無法剛好的放下width加起來為100%的元素的元素。一個.col-xs-&元素最少width也有30px(15+15),也就是說12個.col-xs-1最少也要占360px,如果不用.row 抵消的話就需要390px的盒子來放置。
其實扯遠了,這種極端的情況很少會發生,主要還是看你想不想padding15px 之后再布局。

.col-xs-$

.col-xs-$ = float:left + position:relative + padding:15px + width:$$%(media);

1.float:left 一行放多個div等元素的原理,還有就是讓.col-xs-offset-$ 這樣的類生效,原理為margin-left 。

2.position:relative 讓.col-xs-pull-$ 和 .col-xs-push-$ 能夠生效。原理為left:***,right:***

3.padding 為了每個元素有間隔,這里不用擔心會讓元素占據更多空間,原因為box-sizing:border-box;

4.media 讓元素能夠根據不同的屏幕大小顯示不同樣式。最小的屏幕用.col-xs-$設置的寬度,再大一點用.col-sm-$的,再大用.col-md ,直到.col-lg.

注:嵌套使用柵格系統的時候,原則上要用.row 包起來。原因在上面又說,上面懂了,這里也就懂了,不懂得在看一看,css不是編程語言很好懂的。

表單

bootstrap 對表單控件做了處理,讓表單控件更美觀和規范,只需要加.form-control 在表單控件上就可以了

.form-control = display:block + width:100% + goodstyle

1.前面兩個是為了讓表單自成一行(如論元素是否浮動)。
2.一些margin和vertical-align等熟悉來美化表單,並讓管理他們的高度和位置。

簡單的應用這個類是不足夠滿足需求的。下面是一般表單布局的需求和實現方式。

label與控件各種占一行。

<form>
    <div class="form-group">
        <label class="control-label">介紹</label>
        <input class="form-control" type="input">
    </div>
</form>

這個是最簡單的實例,在bootstrap官網有,沒啥好說的。
1 .form-group 在這里就是margin-bottom:15px;
2 .control-label 規定label的高度和行高等使其規范。

許多控件與label在同一行

<form class="form-inline">
    <div class="form-group">
        <label class="form-label">選擇標簽:</label>
        <button  class="btn btn-sm btn-info" v-on:click="    showselect" type="button">選擇標簽</button>
        <samll class="form-control-static">已選擇{{select}}個標簽</small>
    </div>
    <div class="form-group">
        <label class="form-label">選擇關系</label>
        <select class="form-control" id="relation">
            <option value="OR">至少包含一個</option>
            <option value="AND">同時包含</option>
        </select>
    </div>
</form>

.form-inline 主要的作用就是控制子元素中的.form-control

.from-inline .form-control = display:inline-block + width:auto + vertical-align

樣式表一貼出來原理應該就不需要再說什么了。但是這個布局當你覺得每個form-group 太近的時候,改動就容易犯錯了,因為你很可能選擇bootstrap的柵格布局,那就容易出問題。如:

<form class="form-inline">
    <div class="form-group col-xs-4">
        <label class="form-label">選擇標簽:</label>
        <button  class="btn btn-sm btn-info" v-on:click="    showselect" type="button">選擇標簽</button>
        <samll class="form-control-static">已選擇{{select}}個標簽</small>
    </div>
    <div class="form-group  col-xs-6">
        <label class="form-label">選擇關系</label>
        <select class="form-control" id="relation">
            <option value="OR">至少包含一個</option>
            <option value="AND">同時包含</option>
        </select>
    </div>
</form>

這樣的布局乍一看,沒有什么問題,但是當縮小屏幕大小的時候就容易出問題。所以我建議不要使用來柵格布局來拉開距離,可以結合.pull-left 和 .
col-xs-offset-$ 來,這樣的自適應能力就好很多,如:

<form class="form-inline">
    <div class="form-group pull-left">
        <label class="form-label">選擇標簽:</label>
        <button  class="btn btn-sm btn-info" v-on:click="    showselect" type="button">選擇標簽</button>
        <label class="form-control-static">已選擇{{select}}個標簽</label>
    </div>
    <div class="form-group pull-left col-xs-offset-1">
        <label class="form-label">選擇關系</label>
        <select class="form-control" id="relation">
            <option value="OR">至少包含一個</option>
            <option value="AND">同時包含</option>
        </select>
    </div>
</form> 

label於控件共同占一行

這種布局就是使用柵格布局。

<form class="form-horizontal">
    <div class="form-group">
        <label class="control-label col-xs-3">選擇關系</label>
        <div class="col-xs-4">
            <select class="form-control" id="relation">
                <option value="OR">至少包含一個</option>
                <option value="AND">同時包含</option>
            </select>
        </div>
    </div>
</form>

form-horizontal > .form-group = clearfix ;
form-horizontal > .control-label = text-align:right;

這里需要注意的就是select等控件需要用盒子包起來。

To be continue...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM