挑戰一輪大廠後的面試總結 - css 篇

2021-02-13 前端技術優選

   戳藍字「前端技術優選」關注我們哦!

在去年底開始換工作,直到現在算是告了一個段落,斷斷續續的也面試了不少公司,現在回想起來,那段時間經歷了被面試官手撕,被筆試題狂懟,悲傷的時候差點留下沒技術的淚水。

這篇文章我打算把我找工作遇到的各種面試題(每次面試完我都會總結)和我自己複習遇到比較有意思的題目,做一份匯總,年後是跳槽高峰期,也許能幫到一些小夥伴。

先說下這些題目難度,大部分都是基礎題,因為這段經歷給我的感覺就是,不管你面試的是高級還是初級,基礎的知識一定會問到,甚至會有一定的深度,所以基礎還是非常重要的。

這篇文章是對 css 相關的題目做總結,歡迎朋友們先收藏再看。

先看看目錄

目錄BFC - 塊級格式化上下文

塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是塊盒子的布局過程發生的區域,也是浮動元素與其他元素交互的區域。

又多了一個名詞,可以先不用糾結 BFC 的概念,先看看它能解決什麼問題

清除浮動

在 flex 布局還沒流行的時候,我們常常會用到浮動 float ,浮動元素脫離的文檔流,帶來直接的一個問題就是父級高度塌陷。

清除浮動常用的方法有, clear 屬性,還有就是構建 BFC ,看個小慄子

.con{
    border: 1px solid;
    width: 300px;
}
.float{
    float: left;
    height: 100px;
    background-color: sandybrown;
}
<div class="con">
    <div class="float">xxxxxxxx</div>
    <p>dsfsdfwefesfhjkhjkhuhjk</p>
</div>

黃色 div 是個浮動元素,定了 100px 高度,父級不定高,很明顯父級高度沒有被撐開。

float

給父級 con 加上 overflow: auto; 效果如下

float1

這時候父級div就是一個 BFC

外邊距摺疊

在CSS中,兩個或多個毗鄰的普通流中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外邊距會發生疊加,這種形成的外邊距稱之為外邊距疊加。

形成外邊距摺疊有幾個關鍵要素:毗鄰、兩個及以上、垂直方向、正常流

毗鄰:對於父子元素,他們自己是緊挨著的,子元素沒有被父元素 border padding 給隔開,這樣他們就是毗鄰的;對於兄弟元素,他們的盒模型是挨著一起的就是毗鄰的。

正常流:除去浮動定位、絕對定位,也就是正常的文檔流。

這是個非常常見的問題。解決方案也挺多的,無外乎打破三要素中的一個即可,比如採用浮動、絕對定位、inline-block、添加空白的flex元素、還有就是我們接下來要說的構建 BFC

.con {
    width: 300px;
    background-color: antiquewhite;
}

.one {
    height: 100px;
    margin-top: 10px;
    margin-bottom: 20px;
    background-color: seagreen;
}

.two {
    height: 100px;
    margin-top: 10px;
    background-color: slateblue;
}
<div class="con">
    <div class="one"></div>
    <div class="two"></div>
</div>

float2

div one 的 margin-top: 10px; 導致父級向下移動 10px,這是父子元素的外邊距摺疊,我們用構建 BFC 的方式解決。

.con {
    width: 300px;
    background-color: antiquewhite;
    overflow: auto; /* 構建BFC */
}

效果如下:

float3

那麼對於毗鄰的兄弟節點,方法也是一樣,把一個節點構建成 BFC 即可

<div class="con">
    <div class="one"></div>
    <div style="overflow: auto;">
        <div class="two"></div>
    </div>
</div>

float4如何創建

方法很多,可根據實際情況選擇

根元素(html)

浮動元素(元素的 float 不是 none)

絕對定位元素(元素的 position 為 absolute 或 fixed)

行內塊元素(元素的 display 為 inline-block)

表格單元格(元素的 display為 table-cell,HTML表格單元格默認為該值)

表格標題(元素的 display 為 table-caption,HTML表格標題默認為該值)

匿名表格單元格元素(元素的 display為 table、table-row、 table-row-group、table-header-group、table-footer-group(分別是HTML table、row、tbody、thead、tfoot的默認屬性)或 inline-table)

overflow 值不為 visible 的塊元素

display 值為 flow-root 的元素

contain 值為 layout、content或 paint 的元素

彈性元素(display為 flex 或 inline-flex元素的直接子元素)

網格元素(display為 grid 或 inline-grid 元素的直接子元素)

多列容器(元素的 column-count 或 column-width 不為 auto,包括 column-count 為 1)

column-span 為 all 的元素始終會創建一個新的BFC,即使該元素沒有包裹在一個多列容器中(標準變更,Chrome bug)。

然後

上面可看出 BFC 可以清除浮動,可以解決外邊距摺疊兩問題。

BFC 可通俗理解成是構建一個獨立的區域,可包含區域內的所有元素,包括浮動元素,與外界互不打擾的一個空間。

參考文檔:

https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context

https://tech.youzan.com/css-margin-collapse/

https://www.cnblogs.com/libin-1/p/7098468.html

absolute 是相對哪個元素定位的

元素定位在 css 算是基礎中的基礎了,網上有很多介紹的文章,但我覺得 mdn 的講解就已經非常清晰 position - CSS(層疊樣式表) | MDN

position 屬性取值有 relative, absolute, fixed 或 sticky,元素設置了其中之一的就是定位元素。(換句話說,除static以外的任何東西)。

目前定位類型有四類:

相對定位元素(relatively positioned element)是計算後位置屬性為 relative 的元素。

絕對定位元素(absolutely positioned element)是計算後位置屬性為 absolute 或 fixed 的元素。

粘性定位元素(stickily positioned element)是計算後位置屬性為 sticky 的元素。用於滑動中固定某一元素,這個目前有些兼容性問題。

相對定位

position: relative;  元素按照文檔流的布局放置元素,它的用處是可以在不改變布局方式的前提下調整元素位置,使用 top bottom left right

絕對定位

position: absolute;  絕對定位的元素脫離了文檔流,不會佔據文檔流的空間,感覺就像在文檔流的上一層。

絕對定位的元素可以使用 top bottom left right 調整布局位置,在沒有設置這幾個值的時候,絕對定位元素顯示還是保持在當前的位置。如果設置了值,那麼這個元素就需要找到一個錨點,因為已經脫離文檔流,所以需要找到一個參考點,這參考點就是 最近的非 static 祖先元素 ,可以是 relative, absolute, fixed,一直往上到 body 元素。

所以常常會採用 relative + absolute 的組合布局方式,當然也可以利用絕對定位元素在當前位置顯示的特性結合 margin 來使用。

絕對定位還有個用處,就是避免觸發回流,因為脫離正常的文檔流,因此對於頻繁回流的元素可以採用絕對定位。

z-index

在說一個跟定位常一起使用的 z-index ,這個值表示創建一個新的顯示層級,值大的在最上層。

多個絕對定位元素會按照後一個覆蓋前一個的顯示方式,而且絕對定位元素會覆蓋文檔流中的元素,那麼只有在元素位置不當便調整順序的時候才只用,正常情況下不建議設置值,畢竟多使用一個元素,就容易出現詭異的問題。

DPR

先看看幾個概念

像素

是圖像顯示的基本單位,類似於米是長度的一個單位一樣。

1像素是顯示的最小區域。

物理像素

設備的物理像素,每個設備的物理像素都是廠家固定好的,

css像素

這個主要用於我們編碼用的,約定好的在顯示層上的單位,screen.width 可獲取到邏輯編碼中的窗口最大像素。

再看看 DPR

在 iphone 沒有搞事之前,物理像素和邏輯像素是相等的,但如今高清屏已經快成標配,可顯示的像素點越多越清晰,導致設備上每英寸可顯示的像素點(PPI)越來越多,這樣一來,屏幕的大小沒變,css的邏輯像素沒變,可物理像素卻變多了,一個邏輯像素要對於多個物理像素,這兩者的比例就是 DPR

DPR = 物理像素/css邏輯像素

可通過 window.devicePixelRatio 獲取設備的 DPR

參考文檔:
https://www.cnblogs.com/xiaohuochai/p/5494624.html

1px 問題了解麼?有什麼解決方案?

在高清屏中 DPR 可能會是 2 或者 3 ,那麼原先 1px 像素的線在高清屏下就佔了2個或者3個物理像素,導致線看著比較粗。

解決:

使用偽類,設置 border 1px scale(0.5)

設置 meta initial-scale 根據DPR設置初始值

偽類 + transform: scaleY(0.5);

/* 偽類 + transform: scaleY(0.5); */
.px1 {
    position: relative;
}

.px1:before {
    content: " ";
    position: absolute;
    left: 0;
    top: 0;
    width: 200%;
    border: 1px solid black;
    color: black;
    height: 200%;
    transform-origin: left top;
    transform: scale(0.5);
}

link 和 @import 的區別

看到這個問題我沒反應過來,import 不是js裡的東西嗎?回來查了資料才明白 css 還可以這麼玩。

@import 根據字面意思就知道是用於導入其他樣式文件的,兩者的區別如下:

從屬關係區別

link:是 html 提供的標籤,不僅可以加載css樣式表,還可以定義 RSS、rel 連接屬性等。

@import:是 css 提供的語法規則,用於導入樣式表。

加載順序區別

link:文件是同時加載。

@import 引入的 CSS 將在頁面加載完畢後被加載。

兼容性問題

link 不存在兼容性問題;@import 可能會有兼容性問題

display:none與visibility:hidden的區別?

效果都是隱藏元素

display:none 在文檔布局中不在分配空間(節點),值變化會導致回流和重繪

visibility:hidden 保留渲染樹中的節點,佔用空間,會導致重繪

inline-block block 的區別

這兩個分別是:行內塊級元素和塊級元素,順帶介紹下行內元素

塊級元素

塊級元素的特點:元素總是在新的一行開始,盒模型的屬性均可以控制,div p ul ol ... 等元素默認就是塊級元素,也可以通過 display: block; 設置為塊級元素。

行內元素

行內元素的特點:和其他元素在同一行,元素不可以設置高度和寬度,取決於內容的寬高度,默認的行內元素有 span a lable input img ...,也可通過 display: inline; 設置為行內元素。

行內塊級元素

名字看上去就是上面兩者的結合,同時具備了兩個的特性。通過 display: inline-block; 設置。

但是兩個相鄰的 inline-block 元素中間有空格就會出現間隙,解決辦法可以粗暴的移除空格和換行,還有設置字體大小為 0 , 因空格也是字符,所以可給父級設置 font-size:0、letter-spacing:-3px

rem em vh vw 的區別

這幾個單位常用於自適應布局

rem em

rem : css3 新增,相對於根節點的字體大小的一個單位,eg: 1rem * font-size:20px = 20px

在開發前先制定好一個基準,比如說以 375 寬的設計稿作為規範,設定這個寬度下的字體大小為 375/10 = 37.5 ,那設計稿下 60px 的寬對應的 rem 就是:60px = (60/37.5)rem

若使用css預處理,可以寫一個轉換函數

@function px2rem($px) {
    @return ($px/37.5) + rem;
}

em : 與rem類似,但是相對於父級元素的字體大小。

vw vh

相對於視口寬高的百分比值

vw : 1vw 等於視口寬度的1%

vh : 1vh 等於視口高度的1%

vmin : 選取 vw 和 vh 中最小的那個

vmax : 選取 vw 和 vh 中最大的那個

//iPhone 6尺寸作為設計稿基準
$vm_base: 375; 
@function vw($px) {
    @return ($px / $vm_base) * 100vw;
}

單行、多行文本居中

單行:

設置 line-height 跟 height 相同

flex 布局,設置交叉軸對齊方式

多行:

flex 布局 display: flex;align-items: center;

table 布局 ,外層使用 display: table; 內層使用 vertical-align: middle;display: table-cell; table-cell 可以將元素表現與單元格 td 類似,在對單元格設置居中,不過會破壞其他屬性,比如浮動、margin 等

.text{
    background-color: sandybrown;
    width: 200px;
    height: 300px;
    display: table;
}
.cell{
    vertical-align: middle;
}
<div class="text">
    <div class="cell">
        今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.
    </div>
</div>

設置外層 line-height 等於外層高度,文本一行的高度就等於容器的高度,內層使用 display: inline-block;vertical-align: middle;line-height: 17px; 內層設定為行內塊級元素,設置行內元素的對齊方式是 middle,在對元素重新設定行高

.text {
    background-color: sandybrown;
    width: 200px;
    height: 300px;
    line-height: 300px;
}
.cell {
    display: inline-block;
    vertical-align: middle;
    line-height: 20px;
}
<div class="text">
    <div class="cell">
        今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.今天天氣很好,好想出去玩.
    </div>
</div>

css 選擇器和優先級

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

a > b :子類選擇器,只有直接的子類才生效

a + b:毗鄰選擇器,只有毗鄰的下一個元素才生效

a ~ b :後續選擇器,a元素之後的所有同級的b元素

[attribute] :屬性選擇器,含有這個屬性的元素才生效

:first-of-type : 選擇器匹配元素其父級是特定類型的第一個子元素

選擇器權重

優先級排序:!important > 行內樣式 > ID > 類、偽類、屬性 > 標籤名 > 通配符 > 繼承

權重值如下,每個都是相差一個量級

元素和偽元素選擇器:1

class選擇符:10

id選擇符:100

內聯樣式:1000

英文換行哪些屬性可以繼承

元素外觀相關的屬性可以繼承,比如字體相關的屬性、文本系列的屬性。布局相關的屬性不可以繼承,具體屬性名就不列舉了。

flex 常見有屬性

問這種屬性名稱的真是尷尬,平常都是自動補全的,哪記得住呀…

容器上的屬性

flex-direction : 主軸方向

flex-wrap : 換行的方式

flex-flow :上面兩個的簡寫

justify-content : 主軸的對其方式

align-items : 交叉軸的對齊方式

align-content : 多根主軸的對齊方式

元素上的屬性

order : 排序值,數值越小越靠前

flex-grow : 項目放大的比例,默認為 0 不放大

flex-shrink : 項目縮小的比例,默認 1

flex-basis : 屬性定義了在分配多餘空間之前,項目佔據的主軸空間,如果元素定義了寬,那麼寬度將無效 默認 auto

flex :以上三個的簡稱

小結

css 相關的問的相對比較少些,一般會以一個具體場景作為前提展開問。

覺得有幫助的小夥伴,求求點個讚呀~~


相關焦點

  • 年末的大廠前端面試總結(20屆雙非二本)-終入字節
    不死心的我又投了第五次,成功約上了面試。至於後來為什麼能再約上猿輔導,百度,58同城,去哪兒網,美團的面試,我猜應該都是因為運氣...又或者,實在很缺人?技術方面該如何準備結合我20多次的面試經驗,總結出一個核心:基礎。即便是大廠,也不會忽略問基礎,反而更重視這個。基礎不穩,地動山搖。基礎穩如狗,大廠隨便走。
  • 10 個 GitHub 上超火的 CSS 技巧項目,找到寫 CSS 的靈感!
    You-need-to-know-css該項目是 CSS 的各種效果實現,尤其是動畫效果。筆者把自己的收穫和工作中常用的一些 CSS 小樣式總結成這份文檔。https://github.com/chokcoco/CSS-Inspirationcss_tricks該項目總結了一些常用的 CSS 樣式,記錄一些 CSS 的新屬性和一點奇技淫巧
  • 去阿里面試失敗後,我總結了7條小經驗.
    比成功更為重要的是失敗的教訓,今天就和大家分享一下,去阿里的面試失敗後,總結的7條小經驗。01阿里HR的邀約效率很高但... ...如果你通過了阿里的第三面,面試官可能還需要糾結,這個時候面試官往往會告訴你一句話:來阿里之後你不缺挑戰,可能你更多需要關注第一年你能否活得下來。聽到這句話的時候,往往是個好消息,說明阿里會考慮你,只不過你進入了最後的二選一或者三選一環節。
  • 面試技巧之貓廠、鵝廠、宇宙條……如何拿到大廠offer
    如何拿到心儀的大廠offer,是很多小夥伴苦惱的問題。更令人苦惱的是,「我」明明有實力、崗位也契合,卻因為種種原因,與offer失之交臂。筆者根據多年獵頭經驗,總結了幾個大廠面試細節,希望能給到小夥伴一些幫助。因為篇幅有限,今天我會重點講貓廠。
  • 一輪面試就發offer,Amazon這次明目張胆放水!
    看來在求職低谷的今年,大廠面試難度整體拔高的情況下,亞麻對new grad依舊友好。不過對於社招來說,大廠面試門檻貌似並沒有降低,反而還變難了,特別是一考倒一片的系統設計題>,幾乎變成大廠面試的必考題,比如谷歌今年的VO標配就變成了3輪coding+1輪system design+1輪BQ。
  • 十幾家大廠前端面試總結(已拿網易 offer) ​
    (見後文小結裡的 HR 相關文章)一面過了後公眾號顯示進入複試狀態,但二面一直沒消息。成備胎了?頭條頭條面試問的算法題比起筆試題簡單多了。面試前會有小姐姐和你約時間。(看紅寶書)面試官對我的評價:基礎還可以,做項目的能力是有的,但缺乏深度,要多關注一些細節去哪兒網距離去哪兒網筆試快一個月了,我都以為我涼了,結果在北京面騰訊的當天下午連續接到三個電話……只有一輪技術面+一輪 HR 面,然後就給我發了口頭 offer,相當地乾脆利落……
  • 面試整理(三)CSS部分
    web前端面試 —— CSS部分1. css sprite 是什麼,有什麼優缺點概念:將多個⼩圖⽚拼接到⼀個圖⽚中。(配合本篇第5題)它決定了元素如何對其內容進⾏定位,以及與其他元素的關係和相互作⽤ 14. 談談浮動和清除浮動浮動的框可以向左或向右移動,直到他的外邊緣碰到包含框或另⼀個浮動框的邊框為⽌。 由於浮動框不在⽂檔的普通流中,所以⽂檔的普通流的塊框表現得就像浮動框不存在⼀樣。
  • 山月在年前的大廠面試
    年前面試據說是一年中最好通過面試的時候,這個時候面試的人少,加之崗位急,供需關係決定比以往更容易拿一個不錯的工資。趁著這幾天結束了幾月的旅行,在家沒事,恰好有充分的時間,面了幾家大廠。最終也有幾家拿了 Offer,再接再厲,最近有面試的同學也可以與我交流。
  • 面試題聯盟之CSS篇
    預處理器(sass/less/stylus/postcss)這些都是類css語言,通過webpack編譯可以轉成瀏覽器可讀的css,並且賦予css更強大的功能。IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin情況下,在IE6顯示margin比設置的大。display:inline;將其轉化為行內屬性。漸進識別的方式,從總體中逐漸排除局部。
  • 【面試題】CSS知識點整理(附答案)
    總結偽類和偽元素[1]2. 實現固定寬高比(width: height = 4: 3 )的div,怎麼設置利用css中 padding百分比的計算方法:padding設置為百分比,是以元素的寬度乘以100%從而得到的padding值的。
  • 對CSS居中的一點總結
    原文參考:https://css-tricks.com/centering-css-complete-guide/居中是什麼居中故名思意就是將物體放置在其容器的中間,在css中居中就是指元素、文本、圖片等相對其容器或父元素或瀏覽器窗口能夠居中顯示。而根據顯示方式的不同,又分為水平居中,垂直居中,水平垂直居中。
  • css篇-面試題6-偽類與偽元素的區別
    雖然它和普通的 css 類相似,可以為已有的元素添加樣式,但是它只有處於 dom樹無法描述的狀態下才能為元素添加樣式,所以將其稱為偽類常見偽類::link,:visited,:hover,:active,:focus,:not(),:first-child
  • 105道CSS 面試知識點總結
    詳細資料可以參考: 《Flex 布局教程:語法篇》 《Flex 布局教程:實例篇》14、用純 CSS 創建一個三角形的原理是什麼?採用的是相鄰邊框連接處的均分原理。使用base64的優點是:(1)減少一個圖片的HTTP請求使用base64的缺點是:(1)根據base64的編碼原理,編碼後的大小會比原文件大小大1/3,如果把大圖片編碼到html/css中,不僅會造成文件體積的增加,影響文件的加載速度,還會增加瀏覽器對html或css文件解析渲染的時間。
  • JQuery操作CSS功能用法總結
    JQuery是非常強大的一個JS框架,本人常用它處理一些JS效果,但由於沒有總結,往往在用的時候總是記不住用法,總得再上網查查,於是乾脆把平時用到的一些總結出來放在這裡。這次先總結JQuery操作CSS功能用法。JQuery獲得樣式值。用法:.css("樣式")。
  • 大廠面試過程復盤(微信/阿里/頭條,附答案篇)
    問題比較多,而且很多面試題都是跟個人項目相關的,項目相關的問題借鑑意義不大,所以這裡總結一些與項目無絕對關係的問題,歡迎圍觀~整體流程這裡,我梳理了一些自己的心得,先放個思維導圖。微信筆試數組交集,編寫一個函數,輸入兩個數組,輸出它們的交集。
  • 數據分析師成功面試進入大廠的經歷分享
    昂賽時面一輪忘一輪,千萬別想之前的表現,影響了後面的表現。7. 每一輪面完都要及時復盤,直視面試中的錯誤和尷尬。等你發現你寫下來的條目越來越少,最後只剩下這次都還不錯的時候,offer就離你不遠了。8. 面完昂賽不要數花瓣,就當它掛了,好好準備下一個面試。還有一個眾所周知的技巧就是把想去的公司排在最後。但是由於疫情的原因(那會兒只有狗家active)我第一個昂賽就是狗家。
  • 隨便問個CSS就被幹趴了...面試官哭訴:再招不到人,我要被祭天了!
    雖然CSS上手簡單,精通卻很難,大多數前端開發者抱著夠用就行的心態,在面試中一問就跪。《Web前端工程師P5-P6》的主講老師喬納森,是從Apple跳回阿里巴巴的P7級前端技術專家,對CSS一知半解、學習前端不得其法的同學不妨來聽聽他的經驗分享👇
  • 985碩畢業,面試13家企業,拿7個大廠offer,回顧面試總結
    2.拼多多(兩輪技術+一輪hr/offer)3.螞蟻金服(一輪技術/涼)4.騰訊(兩輪技術+一輪hr/地點不合適hr面拒)5.字節(三輪技術+一輪hr/實習轉正offer)6.美團(兩輪技術+一輪hr/offer)7.網易遊戲(兩輪技術/實習offer)8.百度(三輪技術/offer)9.小紅書(三輪技術+一輪hr/offer)10.華為(三輪技術/性格測試掛
  • 工作五年,一年內我靠這系列java面試寶典從13K到大廠30K
    我認為對於面試以及進階最佳的學習方法莫過於刷題+博客+書籍+總結!前三者我將淋漓盡致地揮毫於這篇文章中,至於總結要靠個人。實際上越到後面你越會發現面試並不難,其次就是在刷題的過程中有沒有去思考,刷題只是次之,這又是一個層次了,這裡暫時不提後面再談。
  • 「金三銀四」,讓我們愉快的開始準備Web面經吧:CSS篇
    這篇文章讓我們先從CSS開始。CSS1. 盒模型頁面渲染時,dom 元素所採用的 布局模型。可通過box-sizing進行設置。當解析到link時,頁面會同步加載所引的 css,而@import所引用的 css 會等到頁面加載完才被加載@import需要 IE5 以上才能使用link可以使用 js 動態引入,@import不行