1. 程式人生 > 其它 >CSS面試題啟蒙

CSS面試題啟蒙

問題目錄

  1. 盒子模型的寬度如何計算?
  2. margin縱向重疊的問題
  1. margin負值的問題
  2. BFC理解和應用
  1. float佈局的問題,以及clearfix
  2. flex佈局的問題

問題列表

盒子模型的寬度如何計算?

<!-- 如下程式碼,請問 div1 的 offsetWidth 是多大? -->
<style>
    #div1 {
        width: 100px;
        padding: 10px;
        border: 1px solid #ccc;
        margin: 10px;
    }
</style>

<div id="div1">
</div>
  • 概念:offsetWidth = (內容寬度+內邊距+邊框),無外邊距
    • 答案:122px
  • 如果新增 box-sizing:border-box; 請問結果?
    • 答案:100px

margin縱向重疊的問題

<!-- 如下程式碼:AAA 和 BBB 之間的距離是多少? -->
<style>
    p {
        font-size: 16px;
        line-height: 1;
        margin-top: 10px;
        margin-bottom: 15px;
    }
</style>

<p>AAA</p>
<p></p>
<p></p>
<p></p>
<p>BBB</p>
  • 答案:
    • 相鄰元素的margin-top和margin-bottom會發生重疊
    • 空白內容的<p></p>也會重疊
    • 答案:15px,p和p之間互相重疊,得到最後結果;
    • 擴散:如果換成H1呢?H1自帶上下距離是0.67em單位,font-soze:2em;

margin負值的問題

  • 對 margin 的 top left right bottom 設定負值,有何效果?
  • 概念:
    • margin-top和margin-left負值,元素會向上、向左移動
    • margin-right負值,右側元素左移,自身不受影響
    • margin-bottom負值,下方元素上移,自身不受影響
  • 理解:
    • margin控制的是自身的邊界,為零的時候,邊界就是0,我不多佔也不少佔,當為負值的時候,就允許對方進入到國界內部,有點類似國家邊界被侵入的意思,界碑位置不變,變的是對方的可活動範圍;
    • 強國對外活動,弱國對內活動(即:被活動)

BFC理解和應用

  • 什麼是BFC?如何應用?
  • 概念:
    • Block format context,塊級格式化上下文
    • 一塊獨立渲染區域,內部元素的渲染不會影響邊界以外的元素
  • 形成BFC的常見條件:
    • float不是none
    • position是absolute或fixed
    • overflow不是visible
    • display是flex、inline-block等
  • 常用需求:BFC清除浮動
    • clear:both;專為清除浮動而生

float佈局的問題,以及clearfix

  • 如何實現聖盃佈局和雙飛翼佈局
    • 聖盃佈局使用padding為主,往中間擠壓
    • 雙飛翼佈局使用margin為主,往外排除,類似翅膀展開一樣
  • 手寫 clearfix
  • 概念:
    • 聖盃佈局和雙飛翼佈局的目的:
    • 三欄佈局,中間一欄最先載入和渲染(內容最重要)
    • 兩側內容固定,中間內容隨著寬度自適應
    • 一般用於PC網頁
    • 聖盃佈局和雙飛翼佈局的技術總結:
    • 使用float佈局
    • 兩側使用margin負值,以便和中間內容橫向重疊
    • 防止中間內容被兩側覆蓋,一個用padding一個用margin

聖盃佈局

  • 感受:其實就是margin-left、margin-right、left、right
  • 感悟:
    • 需要了解margin-left和margin-right在當前BFC裡面具有橫向流動性(之所以會換行,只是因為被擠下來,實際依然屬於同一行)
    • 而position:relation;的left和right,是相對當前位置的,和當前BFC沒有任何關係
    • 因此:
    • 只能通過margin-left讓left aside移動到最左側,無法通過margin-right移動到最左側
    • 可以理解為margin-left是移動自身,而margin-right是移動後面的同學
    • 所以理論上的四種辦法,其實只有兩種;這兩種辦法也只是left和right的簡單運用而已
<template>
    <div id="app">
        <div class="box">
            <div class="center">center</div>
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
    </div>
</template>

<style>
body{background:green;}
.box{padding-left:200px;padding-right:150px;}
.box div{float:left;}
.center{background:red;color:#fff;width:100%;}
.left{background:blue;color:#fff;width:200px;}
.right{background:purple;color:#fff;width:150px;}

/* 第一種處理 */
/* .left{margin-left:-100%;position:relative;left:-200px;}
.right{margin-left:-150px;position:relative;left:150px;} */

/* 第二種處理 */
/* .left{margin-left:-100%;position:relative;right:200px;}
.right{margin-right:-150px;} */

/* 第三種組合:不成立 */
/* margin-right
margin-left */

/* 第四種組合:不成立 */
/* margin-right
margin-right */
</style>

雙飛翼佈局

  • 感受:雙飛翼佈局沒有那麼多的組合結果,本質只有一種
  • 感悟:
    • 這種方式是用結構換樣式,去除了定位(position),並且只是用margin-left;
    • 簡單,容易理解
<template>
    <div id="app">
        <div class="box">
            <div class="center">
                <div class="center_item">center-item</div>
            </div>
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
    </div>
</template>

<style>
body{background:green;}
.box{}
.box div{float:left;}
.center{background:red;color:#fff;width:100%;}
.center_item{background:rgba(255,255,255,.6);color:#fff;}
.left{background:blue;color:#fff;width:200px;}
.right{background:purple;color:#fff;width:150px;}


.center_item{margin-left:200px;margin-right:150px;}
/* 第一種處理 */
.left{margin-left:-100%;}
.right{margin-left:-150px;}

/* 第二種組合:不成立 */
/* .left{margin-left:-100%;}
.right{margin-right:-150px;} */

/* 第三種組合:不成立 */
/* margin-right
margin-left */

/* 第四種組合:不成立 */
/* margin-right
margin-right */
</style>

手寫clearfix(清除浮動)

.clearfix:after {
  content: "";
  display: table;
  clear: both;
}
.clearfix {
  *zoom: 1; /*相容 IE 低版本*/
}

flex佈局的問題

  • flex實現一個三點的色子
  • 常用語法回顧:
    • flex-content
    • justify-content
    • align-items
    • flex-wrap
    • align-self:在側軸方向上的對齊方式
<template>
    <div id="test">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
</template>

<style>
#test{border:solid 1px red;border-radius:20px;width:300px;height:300px;display: flex;justify-content: space-between;align-items: center;padding: 32px;box-sizing: border-box;}
.item{width:30px;height:30px;background:purple;border-radius:50%;}
.item:nth-child(1){align-self: flex-start;}
.item:nth-child(3){align-self: flex-end;}
</style>

CSS定位問題

  • absolute和relative分別依據什麼定位?
    • absolute依據最近一層的定位元素定位,一直向上找,如果沒有就相對body
    • 定位元素:absolute、relative、fixed
    • 兜底元素:body
    • relative依據自身定位
  • 居中對齊有哪些實現方式?
    • 水平居中
    • inline元素:text-align:center
    • block元素:margin:auto
    • absolute元素:left:50% + margin-left:負值
    • margin-left需要知道當前元素的具體width
    • 如果width不確定可以使用transform:translateX(-50%)
    • 垂直居中
    • inline元素:line-height的值等於height值
    • absolute元素:top:50%+margin-top:負值
    • absolute元素:transform:translate(-50%, -50%);
    • 低版本瀏覽器有問題
    • absolute元素:top, left, bottom, right = 0+margin:auto
    • 全相容無問題
    • position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;

CSS圖文樣式

  • line-height如何繼承
  • 問題:
<!--如下程式碼,P標籤的行高將會是多少?-->
<style>
body {
  font-size: 20px;
  line-height: 200%;
}
p {
  font-size: 16px;
}
</style>

<body>
    <p>AAA</p>
</body>
  • 思考:
    • 寫具體數值,如30px,則繼承該值(比較好理解)
    • 寫比例,如 2/1.5 ,則繼承改比例(比較好理解)
    • 寫百分比,如200%,則繼承計算出來的值(考點)
    • 百分比是和父級的font-size計算完之後在繼承,其餘的都是直接繼承不計算
<style>
/* 第一種:p標籤的line-height結果為30px */
body {
  font-size: 20px;
  line-height: 30px;
}
p {
  font-size: 16px;
}
/* 第二種:p標籤的line-height結果為32 */
body {
  font-size: 20px;
  line-height: 2;
}
p {
  font-size: 16px;
}
/* 第三種:p標籤的line-height結果為40 */
body {
  font-size: 20px;
  line-height: 200%;
}
p {
  font-size: 16px;
}
</style>

<body>
    <p>AAA</p>
</body>

CSS響應式

  • rem是什麼?
    • rem是一個長度單位
    • 類比:
    • px,絕對長度單位,最常用
    • em,相對長度單位,相對於父元素,不常用
    • rem,相對長度單位,相對於根元素(HTML元素),常用於響應式佈局
    • 這裡測試的時候建議用整數,或者大於1的數,因為web page最小可見font-size是12px
    • 所以如果使用小數會導致font-size觸發最小值,從而導致測試結果誤導,我就犯了這個錯誤
    • 已經確定,是相對html元素,不是相對body元素
  • 響應式佈局的常見方案?
    • media-query,根據不同的螢幕寬度設定根元素font-size
@media screen and (max-width:1100px){}
@media screen and (max-width:1000px){}
@media screen and (max-width:920px){}
@media screen and (max-width:800px){}
@media screen and (max-width:720px){}
@media screen and (max-width:600px){}
@media screen and (max-width:500px){}
@media screen and (max-width:400px){}

CSS響應式-vw/vh

  • rem的弊端
    • 當頁面尺寸分的特別細的時候,也就是需要寫一堆的media的時候,面對兩個問題:
    • 第一個:需要花多長時間寫出來
    • 第二個:維護成本怎麼降低
    • 個人感受:
    • 流動佈局:width:30%就是流動佈局
    • 其實只要流動佈局設計的足夠好,media用的不會太多
    • 響應式佈局設計:以流動佈局為主,media調節為輔
  • 網頁視口尺寸
    • window.screen.height // 螢幕高度,由手機決定,下圖1
    • window.innerHeight // 網頁視口高度,由瀏覽器決定,下圖2
    • document.body.clientHeight //body高度,由內容決定,下圖3
  • vm/vh
    • vh:網頁視口高度的1/100
    • vw:網頁視口寬度的1/100
    • vmax取兩者最大值,font-size:10vmax;
    • vmin去兩者最小值
    • window.innerHeight === 100vh
    • window.innerWidth ===100vw

技巧

使用vue

# 安裝
npm install -g @vue/cli-service-global
# 啟動待個vue檔案,並開啟瀏覽器
vue serve index.vue -o

Http-server

# 安裝
npm install -g http-server
# 執行並設定埠
http-server -p 9999