CSS基礎(chǔ)布局

CSS布局
確定頁面的大致結(jié)構(gòu),頁面分多少塊塘装,每塊的位置旁仿。每個(gè)部分怎么把該部分撐起來妆够。

* 早期以table為主(簡單)
* 之后 以技巧性的布局為主(難)
* 現(xiàn)在有flexbox/grid(偏簡單)
* 響應(yīng)式布局 在移動(dòng)端大行其道的時(shí)代 是必備的

* table表格布局
* float浮動(dòng) + margin
* inline-block布局 (用起來方便商玫,但是小問題較多)
* flexbox布局
盒模型
如下圖所示:
寬度和高度 指的是content的寬度和高度
margin指的是 距離上一個(gè)元素的距離 或者是 距離父元素的content的距離狂打。
* 要注意content-box 和 border-box區(qū)別:
    content-box: 設(shè)置的width/height 是設(shè)置content的寬高
    border-box: 設(shè)置的width/height 是border+padding+content的寬高
* w3c盒模型
    外盒尺寸計(jì)算(元素空間尺寸)
        element空間高度=內(nèi)容高度+內(nèi)距+邊框+外距
        element空間寬度=內(nèi)容寬度+內(nèi)距+邊框+外距

    內(nèi)盒尺寸計(jì)算(元素大惺樾薄)
        element高度=內(nèi)容高度+內(nèi)距+邊框(height為內(nèi)容高度)
        element寬度=內(nèi)容寬度+內(nèi)距+邊框(width為內(nèi)容寬度)

* IE盒模型
    外盒尺寸計(jì)算(元素空間尺寸)
        element空間高度=內(nèi)容高度+外距(height包含了元素內(nèi)容寬度诬辈、邊框、內(nèi)距)
        element空間寬度=內(nèi)容寬度+外距(width包含了元素內(nèi)容寬度荐吉、邊框焙糟、內(nèi)距)

    內(nèi)盒尺寸計(jì)算(元素大小)
        element高度=內(nèi)容高度(height包含了元素內(nèi)容寬度稍坯、邊框酬荞、內(nèi)距)
        element寬度=內(nèi)容寬度(width包含了元素內(nèi)容寬度淘菩、邊框助琐、內(nèi)距)

* display確定元素的顯示類型
    block/inline/inline-block
    inline元素 默認(rèn)是沒有寬高的(設(shè)置width/height也不會(huì)起作用)

* position確定元素的位置
    static/relative/absolute/fixed
    * relative的偏移 是相對(duì)于 元素自身默認(rèn)位置 進(jìn)行偏移的外里。并且 偏移 不會(huì)改變?cè)刈陨碓谖臋n流中 占據(jù)的空間(也就是說宗弯,其后的元素的位置 仍是依照 元素進(jìn)行偏移之前的位置 進(jìn)行排布)虚婿。設(shè)置relative 不會(huì)使元素 脫離文檔流彼硫。

    * 對(duì)元素設(shè)置absolute溜徙,會(huì)使元素 脫離文檔流(也就是說 不會(huì)對(duì)其它元素的布局 造成影響)市怎。absolute元素的參照位置 是參照 距離元素自身 最近的 父級(jí)absolute/relative元素 進(jìn)行定位的.

    對(duì)元素設(shè)置fixed陨亡,會(huì)使元素 脫離文檔流(也就是說 不會(huì)對(duì)其它元素的布局 造成影響)傍衡。fixed相對(duì)于瀏覽器窗口是 固定的。

    * 默認(rèn)情況下负蠕,會(huì)按照元素出現(xiàn)的先后順序 進(jìn)行層疊蛙埂。想要手動(dòng)改變 層疊元素的層疊順序,可以設(shè)置z-index.
    * 什么樣的元素可以設(shè)置z-index? position為relative/absolute/fixed的元素 可以設(shè)置z-index遮糖,z-index數(shù)值大的 在上層. 
    * 寫css時(shí)要注意z-index的設(shè)置绣的,一般來說 會(huì)給不同的元素 設(shè)置不同的區(qū)間,以防元素之間相互覆蓋。
Flexbox
* flexbox是有彈性的屡江,可伸縮的
* flexbox本身就是 可以并列的
* 可以指定 寬度
使用float布局
* 元素設(shè)置float后芭概,元素就脫離了文檔流,但是不會(huì)脫離文本流惩嘉。
* float對(duì)元素自身的影響:
    * 會(huì)形成 ’塊‘(BFC - block formatting context): BFC會(huì)形成自己的布局(也就是 BFC塊的寬高 都由自己決定罢洲,也可以給它設(shè)置寬高)
    * 位置 先會(huì)向上靠
    * 位置 再向左/右靠

* 對(duì)兄弟元素的影響
    * float元素 向上緊貼 非float的元素(當(dāng)然 也可以是float元素)
    * float元素 向旁邊 緊貼 float元素(或者是 父元素的邊)
    * float元素不影響 其他塊級(jí)元素的位置
    * float元素影響 其他塊級(jí)元素 的內(nèi)部文本

* (float元素)對(duì)父級(jí)元素的影響
    * float元素 會(huì)從父級(jí)元素的空間中 消失
    * 父級(jí)元素 可能會(huì) 高度坍陷
        解決思路:
            1. float元素 進(jìn)行設(shè)置float時(shí),float元素 會(huì)變成BFC文黎,BFC會(huì)負(fù)責(zé)接管自己的寬高的設(shè)置惹苗。
            那么有 沒有可能 讓父元素 也成為BFC,讓父元素 接管(父元素)自身的寬高呢臊诊?
            可以設(shè)置 父元素的overflow屬性(除了 visible 以外的值(hidden鸽粉,auto,scroll)). 


span默認(rèn)是 inline元素抓艳,而inline元素 是不能設(shè)置寬高的触机,這里span為什么會(huì)有寬高?
    float使span成為了一個(gè)BFC塊玷或,使得span可以設(shè)置寬高儡首。

* CSS中BFC詳解
    https://www.cnblogs.com/chen-cong/p/7862832.html

clear: both;  的作用是:保證該元素左右兩側(cè) 沒有浮動(dòng)元素。
after偽元素 默認(rèn)是inline的偏友。設(shè)置after為block 另起一行蔬胯。
高度height:0;visibility: none;
position: absolute元素位他,脫離文檔流 氛濒,無法繼承父元素的高度,因此需要 顯示的指定 高度鹅髓。

float+margin 實(shí)現(xiàn)兩列布局
1. div1 左浮動(dòng):給出左側(cè)的空間
2. div2 的margin-left留出 div1 的寬度. + overflow: hidden;也變?yōu)锽FC塊舞竿,和 div1的BFC塊 并列。

float+margin 實(shí)現(xiàn)三列布局
1. div1 左浮動(dòng):給出左側(cè)的空間
2. div2 右浮動(dòng):給出右側(cè)的空間
3. div3 的margin-left margin-right 分別留出 div1 div2的寬度
這里面需要注意:div3要出現(xiàn)在 div1 和 div2 之后窿冯。否則的話 會(huì)先 排布div3骗奖,此時(shí)浮動(dòng)的div2 的頂部(由于float元素的特性) 會(huì)緊貼div3的底部。
inline-block 布局
布局所要做的事情是 把不同的塊 橫向并列起來醒串。由于縱向是由 每一行堆疊起來的执桌,重復(fù)的 布局一行的內(nèi)容,就可以了芜赌。
所以 布局重點(diǎn)就是 把塊 橫向的 排布開來仰挣。

* 像文本一樣 排列block元素
* 沒有 清除浮動(dòng) 等問題,簡單易用
* 但是需要 處理間隙
    多個(gè)inline-block之間的間隙 相當(dāng)于 文字與文字 之間的間隙缠沈。不管使用什么字體椎木,兩個(gè)字之間 始終是有間隙的违柏。
    所以 間隙就出現(xiàn)在了 inline-block上面。
    解決辦法:
        1. 把inline-block的父元素 字體大小(font-size) 設(shè)置為0香椎。
        (因?yàn)?字體大小為0了 文字之間的間隙也就為0了)
        為了顯示inline-block內(nèi)的文字, 要重新設(shè)置inline-block的font-size.

        2. 把inline-block元素 之間的 空隙注釋掉,就可以了禽篱。

        還是推薦使用 設(shè)置字體 的方式畜伐,來處理inline-block之間的間隙。
* 局限:使用inline-block去做 自適應(yīng)的東西躺率,會(huì)有一定的困難玛界。
    所以 對(duì)于定寬的東西來說,比較適合 采用 inline-block 來進(jìn)行布局悼吱。
響應(yīng)式設(shè)計(jì)和布局
在移動(dòng)端時(shí)代慎框,響應(yīng)式的設(shè)計(jì)和布局 是必需掌握的內(nèi)容。響應(yīng)式布局 能幫助網(wǎng)頁 更好的適配pc端 和不同尺寸的移動(dòng)端后添。

* 讓頁面 在不同的設(shè)備上 能正常的使用
* 主要處理的是 屏幕大小的問題(嚴(yán)格來講 還涉及到 是否有鼠標(biāo) 是否是讀屏軟件 是否支持一些樣式)
* 在具體的方法上 涉及到 設(shè)計(jì) 和 實(shí)現(xiàn) 兩方面笨枯。
    響應(yīng)式頁面的設(shè)計(jì) 如果沒有 設(shè)計(jì)思路的支持,是很難進(jìn)行的遇西。
    (如果設(shè)計(jì)師直接給你固定寬度980的頁面馅精,位置都定死的話,那么到移動(dòng)端 是沒有辦法 做適配的)所以 在設(shè)計(jì)的源頭 就要想一些辦法 去適配粱檀。

* 主要方法:
    * 隱藏 + 折行 + 自適應(yīng)空間
        隱藏:確定好哪一部分的內(nèi)容(比如導(dǎo)航 個(gè)人信息 可以通過點(diǎn)擊菜單 從而彈出導(dǎo)航和個(gè)人信息 的方式洲敢,去隱藏起來) 在移動(dòng)端是可以隱藏的。
        比如側(cè)邊欄 友情鏈接 和很大的footer 在移動(dòng)端就不顯示了茄蚯。
        折行:在pc端橫向排布的若干個(gè)東西压彭,在移動(dòng)端 可以 一行顯示兩個(gè) 分多行顯示。
        留下自適應(yīng)的空間:和兩列布局類似渗常,一列固定寬度 另一列隨屏幕自適應(yīng)壮不。
        (類似的思路,在屏幕頂部 給logo固定寬度 logo右側(cè)的純色背景 可以自適應(yīng))凳谦。如果在設(shè)計(jì)的時(shí)候忆畅,多留一些自適應(yīng)的空間 就可以很好的適配移動(dòng)端。
    具體的方法:
        rem:通過html的字體大小 來確定元素大小的辦法尸执,我們可以使用rem的單位 進(jìn)行布局家凯。布局完成之后 針對(duì)不同大小的屏幕 給出不同大小的字號(hào),那么其它元素就會(huì)跟著縮放如失。
        viewpoint:用js或者手工確定 要把整個(gè)界面放到多大
        media query:根據(jù)不同設(shè)備的特性 來匹配不同的樣式绊诲。比如 為小屏幕 寫一段樣式 為大屏 寫一段樣式,然后 通過media query來進(jìn)行褪贵。

    折行:把橫向排布的inline-block元素, 
        用@media (max-width: 640px)適配屏幕掂之,
        從而更改inline-block元素 為 block抗俄,margin: 0 auto
        (為了元素居中)。 

    自適應(yīng):1. 既然不同設(shè)備的屏幕尺寸不一樣世舰,那么網(wǎng)頁中的文字 也應(yīng)該是不一樣的动雹,此時(shí) 可以采用等比例的方式 來自適應(yīng)屏幕。
        2. 固定設(shè)備的邏輯寬度為320跟压,來適配(<meta name="viewport" content="width=320">)胰蝠。
        3. rem: 使用html{font-size: 20px;}指定rem的單位,然后media根據(jù)查詢到的設(shè)備寬度震蒋,給html{font-size: 20px;}字體大小設(shè)置不同的值茸塞。

        @media (max-width: 375px){
            html{
                font-size: 24px;
            }
        }
        @media (max-width: 320px){
            html{
                font-size: 20px;
            }
        }
        @media (max-width: 640px){
            .intro{
                margin: .3rem auto;
                display: block;
            }
        }

    問題:rem的單位不一定非常精確,有時(shí)候會(huì)碰到’帶小數(shù)點(diǎn)的rem數(shù)值‘(比如font-size: 16px, 不好除盡 會(huì)算出來 帶小數(shù)點(diǎn)的rem數(shù)值)查剖。而小數(shù) 換算出來的 像素 是不精準(zhǔn)的钾虐。所以 使用rem的時(shí)候 要考慮到不精準(zhǔn)的情況 要預(yù)留一些余地 給不精準(zhǔn)的情況。對(duì)于精確性非常高的地方 就不要使用rem來布局了笋庄。
CSS面試題
1. 實(shí)現(xiàn)兩欄/三欄的布局 的方法
    1. 表格布局
    2. float+margin布局
    3. inline-block布局
    4. flexbox布局
2. position: absolute和fixed有什么區(qū)別效扫?
    主要區(qū)別在于 參照物不同
    absolute相對(duì)于 最近的父級(jí) absolute/relative元素 來進(jìn)行定位。
    fixed相對(duì)于屏幕(viewport) 來進(jìn)行定位
3. display: inline-block的間隙 如何處理无切?
    間隙原因:字符間距
    解決方案:1.消滅空白字符:注釋掉 標(biāo)簽之間的空白字符
            2.消滅字符間距:把父級(jí)元素的字體大小設(shè)置為0荡短,再設(shè)置元素自身的字體大小。
4. 如何清除浮動(dòng)哆键,為什么清除浮動(dòng)
    這是因?yàn)?float元素 不會(huì)占據(jù)父元素的布局空間掘托,有可能 float元素 就會(huì)超出 父元素,從而對(duì)其它的元素 造成影響籍嘹。所以作為父元素 要清除浮動(dòng) 來保證父元素內(nèi)的元素 不會(huì)影響父元素的外部元素闪盔。
    清除方式:
        * 讓盒子負(fù)責(zé)自己的布局(overflow:hidden(auto))
            設(shè)置超出時(shí) 要怎么辦,那么就會(huì)管理 什么時(shí)候會(huì)超出
        * ::after{clear:both} display:block 
            content:""  height:0  visibility:none
            不讓父元素管自己的布局辱士,而是加一個(gè)偽元素 放到浮動(dòng)元素的后面泪掀,從而讓父元素 包含浮動(dòng)元素。 

5. 如何視頻移動(dòng)端颂碘?
    * 適配頁面的viewport(頁面的寬度 要和 移動(dòng)端的寬度 適配异赫,否則頁面 在移動(dòng)端上 會(huì)縮小,也就是一定要加viewport)
    * rem/viewport/media query
    * 設(shè)計(jì)上:隱藏(不需要在移動(dòng)端顯示的头岔,就不讓 在移動(dòng)端顯示) 
        折行(在pc端 橫排的東西塔拳,在移動(dòng)端可以少排一些 或者 豎排) 
        自適應(yīng)(留下自適應(yīng)的空間)

我的博客即將同步至騰訊云+社區(qū),邀請(qǐng)大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=30ypesnuf06cs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峡竣,一起剝皮案震驚了整個(gè)濱河市靠抑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌适掰,老刑警劉巖颂碧,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠列,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡载城,警方通過查閱死者的電腦和手機(jī)肌似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诉瓦,“玉大人锈嫩,你說我怎么就攤上這事】寻幔” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵艳汽,是天一觀的道長猴贰。 經(jīng)常有香客問我,道長河狐,這世上最難降的妖魔是什么米绕? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮馋艺,結(jié)果婚禮上栅干,老公的妹妹穿的比我還像新娘。我一直安慰自己捐祠,他們只是感情好碱鳞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踱蛀,像睡著了一般窿给。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上率拒,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天崩泡,我揣著相機(jī)與錄音,去河邊找鬼猬膨。 笑死角撞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勃痴。 我是一名探鬼主播谒所,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼召耘!你這毒婦竟也來了百炬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤污它,失蹤者是張志新(化名)和其女友劉穎剖踊,沒想到半個(gè)月后庶弃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡德澈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年歇攻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梆造。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缴守,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镇辉,到底是詐尸還是另有隱情屡穗,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布忽肛,位于F島的核電站村砂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屹逛。R本人自食惡果不足惜础废,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罕模。 院中可真熱鬧评腺,春花似錦、人聲如沸淑掌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋拖。三九已至诈悍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兽埃,已是汗流浹背侥钳。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄错,地道東北人舷夺。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像售貌,于是被迫代替她去往敵國和親给猾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本來這篇博客早幾天前就該寫了颂跨,奈何牙痛無心學(xué)習(xí)敢伸,稍一緩和加緊來補(bǔ)上,廢話不多說直接進(jìn)入正題恒削。 一:浮動(dòng)布局 1.左...
    Save_Onfir3閱讀 311評(píng)論 0 3
  • 前言 總結(jié)下工作之中遇到過的知識(shí)點(diǎn)池颈,順便培養(yǎng)自己的一個(gè)習(xí)慣尾序。 1.盒模型 盒模型是元素的content,paddi...
    番茄炒西紅柿L閱讀 536評(píng)論 0 1
  • 1. 左右布局 為要橫向布局的子元素添加float: left;躯砰,然后對(duì)父元素添加.clearfix類 HTML ...
    wyx8267閱讀 180評(píng)論 0 0
  • 左右布局(高度自適應(yīng)) 1.左邊定寬每币,右邊自適應(yīng),或者右邊定寬琢歇,左邊自適應(yīng)兰怠,(高度自適應(yīng)) 使用 float 完成...
    wfcsm閱讀 371評(píng)論 0 0
  • 簡介 當(dāng)我們剛剛學(xué)完CSS就去做靜態(tài)頁面的時(shí)候會(huì)出現(xiàn)難以下手的情況,因?yàn)榭吹搅诵Ч麍D李茫,但是不知道這些元素要怎么擺放...
    寫代碼的海怪閱讀 424評(píng)論 0 0