1. 程式人生 > >面試中css常見的幾種問題。

面試中css常見的幾種問題。

前言:今天看到一篇前端妹子的面試總結,前端妹子一直說自己懶。頓時讓我感覺到無地自容啊。2016年畢業,計算機行業,接觸前端是2014 年吧,要說總結,真的是除了在學校裡做的幾個本的筆記外就沒有了啦。從事前端工作兩年多了,一點總結都沒有,也是一直處於原生開發,react和vue的文件看了又看,卻一直沒有實現過一個小專案。每次面試都不理想,物件也說沒見過我總結,總結和筆記才是成長的必要條件。這裡就把前端妹子提的那幾個前端面試的問題總結一下。趕緊的追!

1. 常用的幾種佈局方式

  • 固定佈局
  • 流式佈局(自適應佈局)
  • 彈性佈局(伸縮佈局)
  • 定位佈局
  • 浮動佈局
  • 響應式佈局(媒體查詢)

固定佈局、流式佈局、定位佈局、和浮動佈局都比較簡單。都可以檢視W3C。簡單的我是這個理解這幾個的。如下:

固定佈局的固定說的是盒子的寬高都是固定的。margin,padding等。
流式佈局的流式是指的盒子的寬高和margin,padding是百分比。所以也稱為百分比佈局。有以下幾點需要注意
* 百分比是基於元素父級的大小計算得來的;
* 元素的水平或者豎直間距都是相對於父級的寬度計算的.(margin&padding)
* 邊框不能用百分比設定
定位佈局指的是,絕對定位和相對定位以及固定定位。這個可檢視W3C。
浮動定位是隻float:left;和float:right;要記得清浮動。

這頁面中的佈局,現在我都是綜合幾種佈局一塊來實現的,那種以哪一種的佈局方式為主要形式,此頁面就可以說是哪一種的佈局頁面。

下面主要的是談談彈性佈局(flex-box)當然關於flex-box的文章很多,我寫在這裡只是為了寫給自己的,我的理解有誤的話,也歡迎有人來提出。可點選檢視阮一峰老師的文章

CSS3引入了一種新的佈局模式——Flexbox佈局,即伸縮佈局盒模型(Flexible Box),用來提供一個更加有效的方式制定、調整和分佈一個容器裡專案佈局,即使它們的大小是未知或者動態的,這裡簡稱為Flex。

相容性
come form 菜鳥教程
所以說在pc端用的還廣泛,畢竟有的企業,還是在相容性方面要求的比較嚴格,但是手機端flexBox實現的還不錯,可以考慮寫一個彈性佈局的手機app專案。

定義
任何一個容器都可以指定為Flex佈局。

.box {
    display:flex;
}

行內元素也可以制定為Flex佈局

.box {
    display: inline-flex;
}

Webkit核心的瀏覽器,必須加上-webkit字首。

.box {
    display: -webkit-flex; /* Safari */
    display: flex;
}

注意,設為Flex佈局以後,子元素的float、clear和vertical-align屬性將失效。

基本概念
用Flex佈局的元素,稱為Flex容器(flex container),簡稱”容器”。它的所有子元素自動成為容器成員,稱為Flex專案(flex item),簡稱”專案”。

容器的屬性

    flex-direction:row | row-reverse | column | column-reverse;//決定主軸的方向(即專案的排列方向)。
    row(預設值):主軸為水平方向,起點在左端。
    row-reverse:主軸為水平方向,起點在右端。
    column:主軸為垂直方向,起點在上沿。
    column-reverse:主軸為垂直方向,起點在下沿。


    flex-wrap//預設情況下,專案都排在一條線(又稱”軸線”)上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。
    nowrap(預設):不換行。
    wrap:換行,第一行在上方。
    wrap-reverse:換行,第一行在下方。


    flex-flow:<flex-direction> || <flex-wrap>;//是flex-direction屬性和flex-wrap屬性的簡寫形式,預設值為row nowrap。


    justify-content:flex-start | flex-end | center | space-between | space-around;//屬性定義了專案在主軸上的對齊方式。
    具體對齊方式與軸的方向有關。下面假設主軸為從左到右。
    flex-start(預設值):左對齊
    flex-end:右對齊
    center: 居中
    space-between:兩端對齊,專案之間的間隔都相等。
    space-around:每個專案兩側的間隔相等。所以,專案之間的間隔比專案與邊框的間隔大一倍。


    align-items:flex-start | flex-end | center | baseline | stretch;//定義專案在交叉軸上如何對齊。
    它可能取5個值。具體的對齊方式與交叉軸的方向有關,下面假設交叉軸從上到下      
    flex-start:交叉軸的起點對齊。
    flex-end:交叉軸的終點對齊。
    center:交叉軸的中點對齊。
    baseline: 專案的第一行文字的基線對齊。
    stretch(預設值):如果專案未設定高度或設為auto,將佔滿整個容器的高度。


    align-content//定義了多根軸線的對齊方式。如果專案只有一根軸線,該屬性不起作用。
    flex-start:與交叉軸的起點對齊。
    flex-end:與交叉軸的終點對齊。
    center:與交叉軸的中點對齊。
    space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈。
    space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
    stretch(預設值):軸線佔滿整個交叉軸。

專案的屬性

    order: <integer>//定義專案的排列順序。數值越小,排列越靠前,預設為0。
    flex-grow: <number>//定義專案的放大比例,預設為0,即如果存在剩餘空間,也不放大
    flex-shrink:<number>;//定義了專案的縮小比例,預設為1,即如果空間不足,該專案將縮小。
    flex-basis:<length> | auto//定義了在分配多餘空間之前,專案佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的預設值為auto,即專案的本來大小。
    flex:none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]//是flex-grow, flex-shrink 和 flex-basis的簡寫,預設值為0 1 auto。後兩個屬性可選。該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
    align-self: auto | flex-start | flex-end | center | baseline | stretch;//允許單個專案有與其他專案不一樣的對齊方式,可覆蓋align-items屬性。預設值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch。

以上是菜鳥教程的文件,我就照搬過來了,菜鳥教程有相應的比較好圖片解說。
總結: 重申一下這個概念,有助於對文件的理解:

軸線:專案排在一條線上(這條線就是軸線)
主軸:主軸並不一定是水平軸,flex-direction:row則代表主軸是水平軸,那麼交叉軸就是垂直軸,
flex-direction:column則代表主軸是垂直軸,那麼交叉軸就是水平軸。
align-content:多根軸線才會起效果,就是專案在主軸方向上排了多列。
justify-content:主軸上的專案的排列對齊方式
justify-content:交叉軸上的專案的排列對齊方式

面試題:
(1).Flex專案移動到頂部
如何將flex專案移動到頂部,取決於主軸的方向。如果它是垂直的方向通過justify-content設定;如果它是水平的方向通過align-items設定。
(2).Flex專案移到左邊
flex專案稱動到左邊或右邊也取決於主軸的方向。如果flex-direction設定為row,設定justify-content控制方向;如果設定為column,設定align-items控制方向。
(3).Flex專案移動右邊

.flexcontainer{ display: -webkit-flex; display: flex; -webkit-flex-direction: row; flex-direction: row; -webkit-justify-content: flex-end; justify-content: flex-end; }
.flexcontainer{ display: -webkit-flex; display: flex; -webkit-flex-direction: column; flex-direction: column; -webkit-align-items: flex-end; align-items: flex-end; }

(4).水平垂直居中
在Flexbox容器中製作水平垂直居中是微不足道的。設定justify-content或者align-items為center。另外根據主軸的方向設定flex-direction為row或column。
(5).Flex專案實現自動伸縮
您可以定義一個flex專案,如何相對於flex容器實現自動的伸縮。需要給每個flex專案設定flex屬性設定需要伸縮的值。

.bigitem{ -webkit-flex:200; flex:200; }  .smallitem{ -webkit-flex:100; flex:100; }

上面幾條是我看了幾遍才懂,正在努力集中注意力。懶時間長了,注意力都難集中了。

2. 實現水平垂直居中的幾種方法

  • 用inline-block和text-align及vertical-align來實現:這種方法適合於未知寬度高度的情況下。(最基本的方法)
  • 用相對絕對定位和負邊距實現上下左右居中(已知寬度和高度)
 .img{
       height: 200px;
       width: 200px;
       position: relative;
       top: 50%;
       left: 50%;
       margin: -100px 0 0 -100px;//負邊距是寬度和高度的一半
  }
  • 使用table-cell,inline-block實現水平垂直居中:適合高度寬度未知的情況(模擬表格)
    <style>
        #container{
            display: table-cell;
            text-align: center;
            vertical-align: middle;
            height: 300px;
            background: #ccc;
        }
        #center-div{
            display: inline-block;
        }
    </style>

-使用css3中的transform來時實現水平垂直居中:適合高度寬度未知的情況

    <style>
        #container{
            position: relative;
            height: 200px;
            background: #333;
        }
        #center-div{
            position: absolute;//絕對定位中的transform
            top:50%;
            left: 50%;
            transform: translate(-50%,-50%);
        }
    </style>

-使用Flexbox來實現水平垂直居中;適合寬度高度未知情況,但是要注意相容性


        .box{
            display: flex;
            justify-content: center;
            align-items: center;
            width: 200px;
            height: 200px;
            background: #009f95;
        }

3.css3動畫的一些屬性

  • 2D轉換(transform的屬性方法)
    -translate()通過 translate() 方法,元素從其當前位置移動,根據給定的 left(x 座標) 和 top(y 座標) 位置引數
    -rotate()通過 rotate() 方法,元素順時針旋轉給定的角度。允許負值,元素將逆時針旋轉。
    -scale()通過 scale() 方法,元素的尺寸會增加或減少,根據給定的寬度(X 軸)和高度(Y 軸)引數
    -skew()通過 skew() 方法,元素翻轉給定的角度,根據給定的水平線(X 軸)和垂直線(Y 軸)引數
    -matrix()方法把所有 2D 轉換方法組合在一起。
    -matrix() 方法需要六個引數,包含數學函式,允許您:旋轉、縮放、移動以及傾斜元素。

    matrix(n,n,n,n,n,n)     定義 2D 轉換,使用六個值的矩陣。
    translate(x,y)  定義 2D 轉換,沿著 X 和 Y 軸移動元素。
    translateX(n)   定義 2D 轉換,沿著 X 軸移動元素。
    translateY(n)   定義 2D 轉換,沿著 Y 軸移動元素。
    scale(x,y)  定義 2D 縮放轉換,改變元素的寬度和高度。
    scaleX(n)   定義 2D 縮放轉換,改變元素的寬度。
    scaleY(n)   定義 2D 縮放轉換,改變元素的高度。
    rotate(angle)   定義 2D 旋轉,在引數中規定角度。
    skew(x-angle,y-angle)   定義 2D 傾斜轉換,沿著 X 和 Y 軸。
    skewX(angle)    定義 2D 傾斜轉換,沿著 X 軸。
    skewY(angle)    定義 2D 傾斜轉換,沿著 Y 軸。
    
  • 3D轉換

    matrix3d(n,n,n,n,n,n,
    n,n,n,n,n,n,n,n,n,n)    定義 3D 轉換,使用 16 個值的 4x4 矩陣。
    translate3d(x,y,z)  定義 3D 轉化。
    translateX(x)   定義 3D 轉化,僅使用用於 X 軸的值。
    translateY(y)   定義 3D 轉化,僅使用用於 Y 軸的值。
    translateZ(z)   定義 3D 轉化,僅使用用於 Z 軸的值。
    scale3d(x,y,z)  定義 3D 縮放轉換。
    scaleX(x)   定義 3D 縮放轉換,通過給定一個 X 軸的值。
    scaleY(y)   定義 3D 縮放轉換,通過給定一個 Y 軸的值。
    scaleZ(z)   定義 3D 縮放轉換,通過給定一個 Z 軸的值。
    rotate3d(x,y,z,angle)   定義 3D 旋轉。
    rotateX(angle)  定義沿 X 軸的 3D 旋轉。
    rotateY(angle)  定義沿 Y 軸的 3D 旋轉。
    rotateZ(angle)  定義沿 Z 軸的 3D 旋轉。
    perspective(n)  定義 3D 轉換元素的透視檢視。
    
  • transform-origin:改變元素中心點的位置

  • transiton過渡
transition: property duration timing-function delay;
transition-property: none|all|property;//過渡的元素名稱
transition-duration: time;(time是毫秒計的)//過渡的時間
transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);//過渡的速度曲線
transition-delay: time;//過渡效果開始之前延遲

4.CSS實現寬度自適應100%,寬高16:9的比例的矩形。

.rect {
     width: 100%;
     padding-bottom: 56.25%;
     border: 1px solid #000;
}

講一下其原理,我們來看W3C對應邊距採用不同值得定義
這裡寫圖片描述
padding的值如果用百分比的話是依據於父元素寬度。