CSS基礎面試題,快來查漏補缺

来源:https://www.cnblogs.com/L-xmin/archive/2020/07/10/13276894.html
-Advertisement-
Play Games

本文大部分問題來源:50道CSS基礎面試題(附答案),外加一些面經。 我對問題進行了分類整理,並給了自己的回答。大部分知識點都有專題鏈接(來源於本博客相關文章),用於自己前端CSS部分的查漏補缺。雖作為一個面試資料,但感覺也能幫助前端新手梳理CSS的知識點。 開胃餐-兩道常見考題 盒子模型 樣式與選 ...


本文大部分問題來源:50道CSS基礎面試題(附答案),外加一些面經。

我對問題進行了分類整理,並給了自己的回答。大部分知識點都有專題鏈接(來源於本博客相關文章),用於自己前端CSS部分的查漏補缺。雖作為一個面試資料,但感覺也能幫助前端新手梳理CSS的知識點。

開胃餐-兩道常見考題
盒子模型
樣式與選擇器
CSS3
包含塊
BFC
中插小點
定位position
display與visibility
float
flexbox
overflow
響應式設計
CSS優化
應用

▶開胃餐x2

用純CSS創建一個三角形的原理是什麼?

CSS 邊框的基礎使用

圖1為border最普遍的用法,border: solid 10px #ffb6b9;。用多了你會不會就覺得border是由四個矩形邊框拼接而成,但其實是錯的。實際上,元素的border是由三角形組合而成,為了說明這個問題,我們繼續看:

圖2,我們為邊框四個方向設置不同顏色,border-color: #ffb6b9 #fae3d9 #bbded6 #8ac6d1;,並加大邊框寬度。

圖3,我們進一步將元素的寬高設為0。我們發現,此時元素由上下左右4個三角形組成。

為了實現一個三角形,那就很簡單了,我們只需將其它border邊的顏色設置為白色或者透明色即可

圖4,border-color: transparent transparent #bbded6;,設置上三角,左右三角為透明,那麼我們就能看到一個圖4的三角形了。

.triangle {
    width: 0;
    height: 0;
    border: 50px solid;
    border-color: transparent transparent #bbded6;
}

水平垂直居中

個人常用的水平垂直居中方法,具體的可以戳鏈接我寫的很全,在本文里只提供思路。

水平垂直居中無非分成內聯元素的居中和塊級元素的居中。最簡單的方法就是使用flex佈局,但要註意瀏覽器相容性問題,包括後面提到的transform。

內聯元素的水平和垂直居中分別可以使用text-align: center;line-height解決

塊級元素的水平和垂直居中又需要考慮這個元素的寬高是否固定,如果固定則定位和margin的auto屬性就能解決。例:

#container{
    width: 1000px;
    height: 1000px;
    position: relative;
}

#center{
    width: 100px;
    height: 100px;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin: auto;
}

還有一種方法,拿水平居中來舉例:

step1:left:50%; 將子元素定位到父元素1/2寬的位置

step2:margin-left:-1/2自身寬 將子元素向左移動自身寬度的一半

當寬高不固定的時候,也可以使用transform:translateX(-50%)來實現step2。


由於使用了float後,浮動元素脫離了普通文檔流,因此塊級元素常用的margin:auto無效了。改用定位的方法(即上面提到的step1、step2)

好,正文開始。

▶盒子模型

介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的?

每一個盒子都被劃分為四個區域:內容區、內邊距區、邊框區、外邊區。

樣式設置里with和height指的內容區的寬高。

標準盒子模型:padding、border和margin不會影響content的尺寸,但是會增加元素框的總尺寸。

IE盒子模型:內容區大小包含了padding、border。

box-sizing屬性?

用來控制元素的盒子模型的解析模式,預設值為content-box

context-box:聯想W3C的標準盒子模型。元素盒子的width和height屬性指的是內容盒子,這時候添加邊框和內邊距不會影響內容盒子的大小,但會導致整個元素盒子變大。

border-box:聯想IE傳統盒子模型。width和height屬性的值將會包含padding和border,從視覺上規定了箱子的大小。

▶樣式與選擇器

為什麼要初始化CSS樣式

因為瀏覽器的相容問題,不同瀏覽器對有些標簽的預設值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。

CSS 預處理器

用的最多的:Less、Scss、Stylus

CSS預處理器為CSS增加一些編程的特性,無需考慮瀏覽器的相容性問題,例如你可以在CSS中使用變數、簡單的邏輯程式、函數等等在編程語言中的一些基本特性,可以讓你的CSS更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護等諸多好處。

CSS優先順序演算法如何計算?

必看-一定要搞懂的選擇器優先順序和權重問題

優先順序:!important > style > id > class、屬性、偽類 > 元素、偽元素

  1. !important聲明的樣式優先順序最高,如果衝突再進行計算。

  2. 如果優先順序相同,則選擇最後出現的樣式。

  3. 繼承得到的樣式的優先順序最低。

CSS選擇器有哪些?

CSS選擇符:id選擇器(#myid)、類選擇器(.myclassname)、標簽選擇器(div, h1, p)、相鄰選擇器(h1 + p)、子選擇器(ul > li)、後代選擇器(li a)、通配符選擇器(*)、屬性選擇器(a[rel="external"])、偽類選擇器(a:hover, li:nth-child)

CSS那些屬性可以繼承?

CSS屬性速覽(含版本、繼承性和簡介)

可繼承的屬性:visibility、color、cursor、zoom、direction(特殊:<a>標簽的字體顏色不能被繼承)

字體全部都可以繼承:font、font-style、font-variant、font-weight、font-size、font-family、font-stretch

文本除了vertical-align,其它都可繼承:text-align、text-justify、text-indent、line-height、word-wrap等等

文本裝飾:text-underline-position、text-shadow

li相關:list-style、list-style-image、list-style-position、list-style-type

不可繼承的樣式:定位、佈局、尺寸、內邊距、外邊距、背景、邊框相關等等

::before 和 :after中雙冒號和單冒號有什麼區別?解釋一下這2個偽元素的作用

css偽元素與偽類思維導圖

:before 和 :after 這兩個偽元素,是在CSS2.1里新出現的。起初,偽元素的首碼使用的是單冒號語法,但隨著Web的進化,在CSS3的規範里,單冒號表示偽類,偽元素的語法被修改成使用雙冒號,成為::before ::after。偽元素並不存在與dom中,只存在於頁面之中。

::after用來創建一個偽元素,作為已選中元素的最後一個子元素。通常會配合content屬性來為該元素添加裝飾內容。這個虛擬元素預設是行內元素。

::before 創建一個偽元素,其將成為匹配選中的元素的第一個子元素。

瀏覽器是怎樣解析CSS選擇器的?

瀏覽器在碰到HTML中指向CSS文件的鏈接時,會獲取並解析CSS文件。CSS文件會被瀏覽器轉為CSS對象模型。不僅是外部CSS,內部style元素或行內style屬性中的CSS也會被解析並添加到這個對象模型中。這個對象模型事宜個樹形結構,包含頁面中樣式的層次結構。

每個CSS選擇符都會匹配一個DOM節點,然後瀏覽器會基於層疊、繼承和特殊性來計算每個DOM節點的最終樣式。

瀏覽器『從右往左』解析CSS選擇器

▶CSS3

CSS3新增偽類有那些?

CSS-偽元素和偽類(思維導圖)

p:first-of-type 選擇屬於其父元素的第一個出現的p
p:last-of-type 選擇屬於其父元素最後一個出現的p

p:only-of-type 選擇屬於其父元素唯一的p元素
p:only-child 選擇屬於其父元素的唯一子元素(沒有任何兄弟元素的p元素)

p:nth-child(2) 選擇屬於其父元素的第二個子元素

:enabled :disabled 表單控制項的禁用狀態。
:checked 單選框或覆選框被選中。

CSS3有哪些新特性?

CSS3參考手冊屬性列表(鏈接中紫色鏈接表示該屬性在CSS3有修改或者增加了新的屬性值;橙色鏈接表示該屬性是CSS3新增屬性 )

下麵列出容易記的幾個

  1. 媒體查詢(@media (min-width:600px))
  2. 嵌入web字體(@font-face)
  3. 過渡(transition)與動畫(animation)
  4. 【陰影】box-shadow
  5. 【邊框】創建圓角(border-radius)、邊框圖片(border-image)
  6. 【背景】背景圖片尺寸(background-size)、背景圖片定位(background-origin)、背景裁剪(background-clip)、多重背景(background-image:url(1.jpg),url(2.jpg);)
  7. 【文字】允許長單詞換行(word-wrap:break-word)、文字陰影(text-shadow)
  8. 【顏色】rgba和透明度opacity
  9. 【漸變】線性漸變(gradient)
  10. 【佈局】flex、grid、多欄佈局
  11. 【盒模型】box-sizing

▶包含塊

CSS基礎一定要看的包含塊containing block

包含塊的確定

確定一個元素的包含塊的過程完全依賴於這個元素的 position 屬性:

  1. static、relative、sticky:包含塊可能由它的最近的祖先塊元素的內容區的邊緣組成。也可能會建立格式化上下文(比如說 table container, flex container, grid container, 或者是block container 自身)。

  2. absolute: 包含塊就是由它的最近的 position 的值不是 static 的祖先元素的內邊距區的邊緣組成。

❗註意以上兩個,一個是內容區、一個是內容邊距區

  1. fixed:在連續媒體的情況下包含塊是視窗視圖(viewport),分頁媒體下的情況下包含塊是分頁區域(page area)。

如果position值是absolute或fixed,包含塊也可能是由滿足以下條件的最近父級元素的內邊距區的邊緣組成的:

註意:根元素()所在的包含塊是一個被稱為初始包含塊的矩形。

元素豎向的百分比設定是相對於容器的高度嗎?

如果某些屬性被賦予一個百分值的話,它的計算值是由這個元素的包含塊計算而來的。這些屬性包括盒模型屬性和偏移屬性:

  1. height、top、bottom:通過包含塊的 height 的值。如果包含塊的 height 值會根據它的內容變化,而且包含塊的 position 屬性的值被賦予 relative 或 static ,那麼,這些值的計算值為 auto。

  2. width、left、right、padding、margin 這些屬性由包含塊的 width 屬性的值來計算它的百分值。
    這裡特別強調padding和margin講的是上下左右四個都是根據包含塊的width

▶BFC

可見格式化模型BFC與應用

對BFC規範(塊級格式化上下文:block formatting context)的理解?

BFC指的是塊級格式化上下文,簡單的來說,BFC就是創建一個div盒子或者給已存在的盒子激活BFC,盒子內部的元素佈局不影響盒子外部的元素。也就是所謂的相互隔絕,互不影響。

常見的創建BFC方式

  1. float:none以外的屬性值。如:left 、 right
  2. overflow:visible以外的屬性值。如:hidden、auto 、 scroll
  3. position屬性值為:absolute、fixed(只有這兩個可以)
  4. dispaly屬性值為:inline-block、 flex、 inline-flex、 table-cell、 table-caption 反正block不行就是了

BFC應用

詳細解決方案戳上面給的鏈接。

  1. 解決margin重疊
  2. 解決使用float時浮動元素和非浮動元素重疊(也是一種清除浮動的方法啦)
  3. 解決使用float時容器高度塌陷

▶中插小點

你對line-height的理解?

line-height指的是行盒子的總高度,更通俗的叫法是行間距。行盒子的整體行高減去font-size,得到的值平分,就是裡面文本的上下空白位置。

可以給line-height設置像素值、百分比值或em值,但要註意body元素的所有子元素都會繼承line-heoght的計算值,但無單位的值就不會這樣。因此,設置,line-height:1.5,那麼子元素繼承的是一個繫數,永遠與自己的font-size成比例。一般取值在1.2~1.5範圍內。

將行高設置為height的值,可以實現文本的垂直居中。

手動寫動畫,最小時間間隔?

17ms,紅寶書原話:

大多數電腦顯示器的刷新頻率是60HZ,大概相當於每秒重繪60次。大多數瀏覽器都會對重繪操作加以限制,不超過顯示器的重繪頻率,因為即使超過那個頻率用戶體驗也不會有提升。因此,最平滑動畫的最佳迴圈間隔是1000ms/60,大概相當於17ms。以這個迴圈間隔重繪的動畫是最平滑的,因為這個速度是最接近瀏覽器的最高限速。為了適應17ms的迴圈間隔,多重動畫可能需要加以節制,以便不會完成太快。

網頁中應該使用奇數還是偶數的字體?

偶數。

  1. 相對來說偶數字型大小比較容易和頁面中其他部分的字型大小構成一個比例關係。
  2. 低版本的瀏覽器ie6會把奇數字體強制轉化為偶數,即13px渲染為14px。
  3. Windows 自帶的點陣宋體(中易宋體)從 Vista 開始只提供 12、14、16 px 這三個大小的點陣,而 13、15、17 px 時用的是小一號的點陣(即每個字占的空間大了 1 px,但點陣沒變),於是略顯稀疏。

常見的相容性問題

CSDN瀏覽器相容問題,這個人寫的很全。我下麵列幾個我能記住的,

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Canvas概述 Canvas API(畫布)用於在網頁實時生成圖像,並且可以操作圖像內容,基本上它是一個可以用JavaScript操作的點陣圖(bitmap)。 要使用HTML5在瀏覽器視窗中繪製圖形,首先需要在HTML文檔中新建一個canvas網頁元素。一般方法如下: <canvas id=" ...
  • 項目搭建時間:2020-06-29 本章節:講述基於vue/cli, 項目的基礎搭建。 本主題講述了: 1、跨域配置 2、axios請求封裝 3、eslint配置 4、環境dev,test,pro(開發,測試,線上), run自動調用對應的介面(proxy多代理配置) vue+element-ui ...
  • 數據類型是我們學習JavaScript時最先接觸的東西,它是JavaScript中最基礎的知識,這些知識看似簡單,但實則有著許多初學者甚至是部分學習了多年JavaScript的老手所不瞭解的知識。 ...
  • Vue數組的變異方法 Vue 包含一組觀察數組的變異方法,所以它們也將會觸發視圖更新。這些方法如下: push() pop() shift() unshift() splice() sort() reverse() push():往數組最後面添加一個元素,成功返回當前數組的長度 pop():刪除數組 ...
  • B站前端學習視頻分享 都是我自己發時間看過,覺得不錯的(*^_^*) 1. es6, promise, async/await, vue的安裝, 說得很清楚(高校電腦畢業班的老師上傳的網課) https://space.bilibili.com/472813974/video?tid=0&page ...
  • 學習js:1.htmml2.cssjs+html+css == html5 js的組成:1).ecamscript ES是js的標準,js 是es 的實現2)文檔對象模型(Document Object Model,簡稱DOM)3)瀏覽器對象模型(Browser Object Model,簡稱BOM ...
  • 兩種自定義標記 在 echarts 中 markPoint 的樣式內置了 ‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’ 幾種,如果這些都不太符合需要就必須自定義我們需要的樣式。 自定義標記的圖形有兩種方式:1 ...
  • 沒有基礎怎麼學Web前端?相關學習路線是什麼?隨著互聯網的迅猛發展,互聯網項目對用戶體驗提出了更高的要求,Web前端開發人員成為了重要的研發角色。很多人想要快速加入前端開發這一高薪行列,對於想要學習Web前端的人而言,小編建議你做好以下準備。 1、多多實踐練習 代碼是程式員日常生活的重要組成部分,很 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...