前端開發工程師 - 04.頁面架構 - CSS Reset & 佈局解決方案 & 響應式 & 頁面優化 &規範與模塊化

04.頁面架構

第1章--CSS Reset

第2章--佈局解決方案

居中佈局

課堂交流區css

水平列表的底部對齊

 

如圖所示,一個水平排列的列表,每項高度都未知,但要求底部對齊,有哪些方法能夠解決呢?html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平列表的底部對齊</title>
    <style type="text/css">
        html, body {
            height: 100%;
            width: 100%;
        }
        .parent {
            display: flex;
            align-items:flex-end;
            height: 30%;
            width: 50%;
            margin: auto;
        }
        .children {
            float: left;
            width: 25%;
            margin-bottom: 10px;
        }
        #item_1 {
            height: 50%;
            background-color: #006899;
        }
        #item_2 {
            height: 33%;
            background-color: #9f0000;
        }
        #item_3 {
            height: 17%;
            background-color: #00970a;
        }
        #item_4 {
            height: 40%;
            background-color: #009999;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="children" id="item_1"></div>
        <div class="children" id="item_2"></div>
        <div class="children" id="item_3"></div>
        <div class="children" id="item_4"></div>
    </div>
</body>
</html>

實現一個幻燈佈局

一個幻燈片效果如圖:css3

已知結構以下:express

<div class="slide">瀏覽器

<!-- 圖片省略 -->架構

<!-- 如下是指示器 -->編輯器

<div class="pointer"><i></i><i></i><i></i></div>ide

</div>模塊化

要求以下:幻燈(slide)寬高未知,指示器(pointer)在底部且水平居中,距離底部10px,指示器中的圓直徑爲10px,個數未知,背景爲黑色,間距爲5px,請完成CSS。工具

.slide {
    display: flex;
    align-items:flex-end;
    height: 200px;
    width: 400px;
    margin: auto;
    margin-top: 200px;
    background-color: #9dc3e6;
}
.pointer {
    margin-left: 50%;
    transform: translateX(-50%);
    text-align: center;
    margin-bottom: 10px;
}
.pointer i {
    display: inline-block;
    width: 10px;
    height: 10px;
    margin-left: 5px;
    border-style: solid;
    background-color: black;
    border-radius: 50%;
}

 

 

多列布局

 

全屏佈局

第3章--響應式

瀏覽網頁使用的設備屏幕大小迥異,如何保證頁面在不一樣設備上都正常顯示呢?

--  解決方法:響應式

優勢:無需爲不一樣設備編寫對應的頁面 --> 下降開發成本、維護成本

缺點:頁面中某些部分在某些設備上會被隱藏(資源加載了,可是隻是用CSS隱藏了)

爲何在手機端的頁面會很小呢?

全部的移動端的頁面都引入了viewport視窗

剛開始全部的元素都是加載到一個比較大的viewport視窗中,

以後經過某種比例等比縮小到屏幕的顯示區域,

所以文字圖片都顯得很小

viewport:

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/> 

width設置爲設備寬度

initial-scale爲0時,初始化不會進行等比縮小
user-scalable爲no時,用戶沒法手動縮放

響應式佈局:針對不一樣設備(電腦、pad、手機)

1. 最基本要求:少用定寬屬性,使用自適應(都是定寬則會出現水平滾動條)

2. 若是左邊的菜單是定寬,右邊的主內容爲自適應,在電腦和pad端均可行,可是在手機端會出現主內容寬度過窄

想要實現菜單和主內容在手機端佈局成上下排列(即佈局方式改變了)-- 媒體查詢 @media

@media screen and (max-width:320px) {
    /*screen表示在顯示設備中
    max-width:viewport視窗的最大寬度
    在顯示設備中且視窗<=320px時,
    該CSS生效*/
}
@media screen and (min-width:769px) {
    /* 在顯示設備中且視窗>=769px時,該CSS生效*/
}
@media screen and (min-width:769px) and (max-width:1000px) {
    /* 寬度區間[769, 1000]內 */
}

 

實例:

實現不一樣寬度設備對應不一樣佈局:

<style type="text/css">
    .left {
        float: left;
        width: 100px;
        margin-right: 20px;
        background-color: red;

    }
    .right {
        overflow: hidden;
        background-color: blue;
    }

    @media screen and (max-width: 769px) {
        .left {
            float: none;
            width: auto;
            margin-right: 0;
            margin-bottom: 20px;
        }
    }
</style>

<div class="parent">
    <div class="left">
        <p>left</p>
    </div>
    <div class="right">
        <p>right</p>
        <p>right</p>
    </div>
</div>

寬度大時:

寬度小時:

課堂交流區 實例1:

高清屏的背景圖片適配

當咱們把一個圖標作成CSS中的背景圖,在視網膜屏上預覽時會發現圖標是模糊的,因此咱們會同時準備一個2倍大小的圖標給高清屏,

那麼怎麼實如今普通屏下是普通背景圖,而在高清屏下是用的高清圖呢?

答:https://www.w3schools.com/cssref/css3_pr_mediaquery.asp

http://www.cnblogs.com/sese/p/5977486.html

http://mutian.wang/tech/1386

使用@media媒體查詢resolution的方式,設定圖片不一樣分辨率的url便可

課堂交流區 實例2:

完成響應式佈局的實現

已知一個自適應佈局的HTML結構以下:

<div class="parent">

<div class="side"></div>

    <div class="main"></div>

</div>

請完成如下響應式要求:

一、默認狀況,PC電腦(假設視窗都大於等於1000px)訪問:兩列布局,.parent寬960px且水平居中,左列.side寬300px,右列.main寬650px,列間距10px。

二、當用平板(假設視窗都大於400px且小於1000px)訪問:兩列布局,.parent寬度撐滿,右列.main自適應剩餘寬度,兩列間距仍舊爲10px。

三、當用手機(假設視窗都小於等於400px)訪問:上下兩行佈局,.parent寬度撐滿,.side和.main寬度也撐滿,行間距爲10px。

html, body {
    height: 100%;
}
@media screen and (min-width: 1000px) {
    /* for laptop and pc */
    .parent {
        width: 960px;
        height: 100%;
        margin: auto;
        
    }
    .side {
        float: left;
        width: 300px;
        height: 100%;
        margin-right: 10px;
        background-color: #4eb3b8;
    }
    .main {
        float: left;
        width: 650px;
        height: 100%;
        background-color: #ff1a97;
    }
}

@media screen and (min-width: 400px) and (max-width: 1000px) {
    /*for pad */
    .parent {
        width: 100%;
        height: 100%;
        margin: auto;
        
    }
    .side {
        float: left;
        width: 300px;
        height: 100%;
        margin-right: 10px;
        background-color: #4eb3b8;
    }
    .main {
        float: none;
        width: auto;
        margin-left: 310px;
        height: 100%;
        background-color: #ff1a97;
    }
}

@media screen and (max-width: 400px) {
    /*for mobile phones*/
    .parent {
        width: 100%;
    }
    .side {
        width: 100%;
        margin-bottom: 10px;
        background-color: #4eb3b8;
    }
    .main {
        width: 100%;
        background-color: #ff1a97;
    }
}

 

響應式的單元測驗

本次得分爲: 7.00/7.00, 本次測試的提交時間爲: 2017-09-11
1 單選(2分)

媒體查詢條件中,(max-width:320px)表示的是

  • A.當視窗寬度小於320px時
  • B.當屏幕寬度小於320px時
  • C.當視窗寬度小於等於320px時2.00/2.00
  • D.當屏幕寬度大於320px時
2 單選(2分)

已知CSS以下:

.a{float:left;width:600px;margin:10px;}

@media screen and (max-width:959px){

.a{width:400px;padding:10px;}

}

@media screen and (max-width:320px){

.a{float:none;width:auto;}

}

請問,當視窗寬度爲300px時,.a的樣式是

  • A..a{float:none;width:auto;}
  • B..a{float:left;width:400px;margin:10px;padding:10px;}
  • C..a{float:none;width:auto;margin:10px;}
  • D..a{float:none;width:auto;margin:10px;padding:10px;}2.00/2.00
3 判斷(1分)

要作響應式網站,就必須設置viewport

  • A.×
  • B.√1.00/1.00
4 判斷(1分)

經過viewport,能夠設置是否容許用戶手動縮放網頁

  • A.√1.00/1.00
  • B.×
5 判斷(1分)

viewport的默認寬度就是屏幕的水平分辨率

  • A.×1.00/1.00
  • B.√

 

第4章--頁面優化

頁面優化的好處:

提高網頁響應速度

對搜索引擎、屏幕閱讀器友好

提升可讀性、可維護性

如何優化:

減小請求:

圖片合併:小圖標的合併(PS課程中提到過)

CSS文件合併:

將多個css文件合併;

少許css樣式內聯;

避免使用import方式引入css文件(每一個import都會產生一個請求,且這些請求是串行的)

減小資源文件大小:

減小圖片大小:

選擇合適的圖片格式:半透明的小圖標:PNG;色彩絢麗尺寸比較大:JPG

壓縮圖片:經常使用無損壓縮工具 ImageOptim/ ImageAlpha/ JPEGmini

減小css文件大小:

css值縮寫,如margin: 5px 10px;

其餘可縮寫屬性:padding/ border/ border-radius/ font/ background等等

省略值爲0的單位:如

margin: 0px 10px; --> margin: 0 10px;

background-position: 50% 0%; --> background-position: 50% 0;

line-height: 0.5; --> line-height: .5;

顏色值最短表示:

red

#333

rgb(255, 255, 0)

rgba(255, 255, 0, 0.5)

如:color: rgb(204,204,204); --> color: #cccccc; --> color: #ccc;

css選擇器合併:

.m-logo, .m-help ... { ... }

css文件壓縮:去空格等

YUI Compressor, cssmin等工具

提高頁面性能:

規範文件的加載順序:

將css文件放在<head>中,在head中找到css文件進行下載並解析;當在body中遇到相應元素時,就能夠直接將解析好的對應css樣式應用到元素上;這樣用戶看到的頁面就很順暢

若是將css文件放到底部的話,極可能第一次渲染的時候沒有將這些樣式應用到元素上

將js文件放在<body>的底部,由於js的加載和執行會阻塞其餘資源的加載和頁面的執行和渲染,並且js的不少邏輯也是等到頁面加載完成後纔開始處理的

減小標籤數量:標籤數量不少,當js遍歷頁面的DOM時會對性能產生影響;對可讀性也有提高

如<div class="list"> <ul>...</ul> </div>  -->  <ul class="list">...</ul>

選擇器長度:

儘量書寫較短的選擇器名字、省略沒必要要的父類選擇器

儘可能避免耗性能的屬性:

好比expression的計算量較大、filter、border-radius、box-shadow、gradients等

給圖片設置寬高:

img標籤中的圖片儘可能不要進行縮放,儘可能直接使用原圖大小

由於:瀏覽器在解析html代碼時,有可能在圖片下載完成前就對頁面的佈局進行了定位,若是沒有給圖片設置固定寬高或原圖寬高與設置寬高不一樣,瀏覽器在圖片下載完成後,須要進行迴流和重繪,將圖片從新渲染一遍。

表現儘可能使用css實現:

能用css實現的儘可能都用css來實現,好比選中狀態的樣式能夠經過css或js實現,儘可能使用css

提升代碼可讀性、可維護性

規範:好比indent用幾個空格、變量名/文件名規範等

語義化:對搜索引擎和屏幕閱讀器友好,也能增長可讀性和可維護性

儘可能避免hack:有的時候爲了兼容不一樣瀏覽器會進行一些hack,須要想一下是否有別的方式代替hack,若是沒有辦法或代價比較大的時候才用hack的方式;hack的方式也要統一,好比對IE6就用*號、對IE7就用_號。

模塊化:把頁面中一系列相關的部分作成一個模塊,好比導航模塊、列表模塊等

也使得代碼複用性更強,也能夠減小代碼數量

註釋:後期維護、可閱讀性

 

課堂交流區:

請對如下CSS進行優化: 

h1{font-weight: bold;}
h2{font-weight: bold;}
h3{font-weight: bold;width:100px;}
.g-bd{
  border-top: 1px solid #000;
  border-right: 1px solid #f00;
  border-bottom: 1px solid #f00;
  border-left: 1px solid #000;
  color: #bbff22;
}
.m-tab{
  margin-top: 10px;
  margin-right: 10px;
  margin-bottom: 20px;
  margin-left: 10px;
  color: rgb(255,0,0);
}
.m-tab li a{
  display: block;
  padding: 0px 10px;
  font-family: "Microsoft YaHei", simsun;
  font-size: 20px;
  line-height: 1.5;
}
.m-side{
  width: 200px;
  background-image: url(bg.png);
  background-repeat: repeat-y;
  background-color: #ccc;
}

答:

1. h1, h2, h3中font-weight屬性重複
2. .g-bd中border屬性可簡寫
3. .g-bd中color屬性可縮短表示
4. .m-tab中margin屬性可簡寫
5. .m-tab中color屬性可縮短表示
6. .m-tab li a 選擇器可省略中間的li (甚至.m-tab也能夠省略)
7. .m-tab li a中padding的0px的單位可省略
7. .m-tab li a中的font屬性可簡寫
8. .m-side中background屬性可簡寫

h1, h2, h3{font-weight: bold;}
h3{width:100px;}
.g-bd{
  border: 1px solid #000;
  border-right-color: #f00;
  border-bottom-color: #f00;
  color: #bf2;
}
.m-tab{
  margin: 10px 10px 20px 10px;
  color: #f00;
}
.m-tab a{
  display: block;
  padding: 0 10px;
  font: 20px/1.5 "Microsoft YaHei", simsun;
}
.m-side{
  width: 200px;
  background: #ccc url(bg.png) repeat-y
}

 

 

第5章--規範與模塊化

站在團隊的多人協同開發的角度看待

每一個工程師都有本身的規範,人員的更替,使得後期維護成本提升

-- 團隊規範:約束團隊的每個成員

規範

文件規範:

文件分類:可將css文件分類

通用類:共用樣式base、第三方庫lib、自定義UI控件ui 等

業務類:專輯album、歌手artist、排行榜toplist等

如:

文件引入:

行內樣式:不推薦--表現與內容分離(可是某些時候必須用到)

外聯引入:推薦 <link rel="stylesheet" href="css/style.css"/>

內聯引入:推薦 <style>...</style>

避免使用@import--引發頁面從新渲染的性能問題

文件自己:

文件名:由小寫字母、數字、中劃線組成

文件編碼:UTF-8

註釋規範:

塊狀註釋:統一縮進、位於被註釋對象上面

單行註釋:文字兩端須有空格、位於被註釋對象上面

行內註釋:文字兩端須有空格、位於分號以後

命名規範:選擇器的命名

分類命名:

避免由於選擇器重名致使的樣式污染

好比對於佈局類樣式,可使用"g-"做爲前綴等等自定義命名規則

命名格式:

大小寫:建議小寫

長度:權衡長度和可讀性 (正常縮寫便可)

語義化命名:

之內容的語義進行命名,好比.nav

不推薦以結構命名(好比.top)

書寫規範

單行與多行:單行:節省空間、編輯器可能造成水平滾動條;多行:文件可能須要豎直滾動條

空格與分號:縮進:2個或4個空格;規則內空格,好比key-value之間的空格等;須要保留最後一個屬性的分號(爲了不沒必要要的錯誤)

屬性順序:按照屬性的重要性按順序書寫

顯示屬性:display, visibility, position, float, clear, list-style, top等

自身屬性:width, height, margin, padding, border, overflow等

文本屬性和其餘修飾:font, text-align, text-decoration, vertical-align, white-space, color, background等

Hack方式:

統一各瀏覽器的hack方式:

IE6:_property:value  

IE6/7:*property:value

如:.m-list{ color:#000; *color:#888; _color:#fff; }

不要濫用hack

值格式:統一屬性值格式,好比顏色(通常選擇#xxx的形式);無引號/單引號/雙引號

其餘規範:

HTML規範:

文檔聲明:"<!DOCTYPE html>",首行頂格開始

閉合:閉合標籤須要閉合,自閉合標籤選擇使用/>或>結束

屬性:選擇雙引號仍是單引號;某些屬性是否寫屬性值,好比: <input readonly>仍是<input readonly="readonly">

層級:用縮進體現層級,提升可讀性;標籤正確嵌套(好比<ul>下嵌套<li>),且不要太深--性能問題

註釋:好比使用什麼格式?如註釋頭註釋尾 <!-- aa --> ...... <!-- /aa -->

大小寫:標籤、屬性均小寫

圖片規範:

文件名:語義性、合適長度

保留源文件:切圖時須要保留源文件

圖片合併:儘量使用sprite技術,指定劃分方式,如按模塊、按業務等

模塊化

什麼是模塊化:

一系列相關聯的結構組成的總體;

總體帶有必定語義,而非表現

好比:翻頁模塊、圖片輪播模塊

怎麼實現模塊化:

爲模塊分類命名:好比 .m-,  .md-

以一個主選擇器開頭(模塊根節點是惟一的)

使用以族選擇器開頭的後代選擇器(模塊子節點)

 

這樣就不會引發樣式污染了

實例:

一個導航模塊:

<!-- NAV MODULE -->
<div class="m-nav">
    <ul>
        <li class="z-crt"><a href="#">index</a></li>
        <li><a href="#">link1</a></li>
        ...
    </ul>
</div>
<!-- /NAV MODULE -->
/* 導航模塊 */
.m-nav{}
.m-nav li, .m-nav a{}
.m-nav li{}
.m-nav a{}
.m-nav .z-crt a{}

現有另外一個導航須要實現:

區別:按鈕邊框圓角、多了最後一個按鈕

實現NAV MODULE模塊的擴展

<!-- NAV-1 MODULE -->
<div class="m-nav m-nav-1">
    <ul>
        <li class="z-crt"><a href="#">index</a></li>
        <li><a href="#">link1</a></li>
        ...
    </ul>
    <a class="btn">Login</a>
</div>
<!-- /NAV MODULE -->
/* 導航模塊擴展 */
.m-nav-1 {}
.m-nav-1 a {border-radius: 5px;}
.m-nav-1 .btn {}

 

 

 

寫上新屬性便可

爲何要模塊化?

(要記住是多人協同開發)

可讀性強、維護性強

不會引發樣式污染(主選擇器)

擴展性、重用性

 

在學完了本課程後,推薦你們學習網易內部的CSS規範以及模塊化方案——NEC

 

  • 規範頁:包含了CSS規範、HTML規範和工程師規範;

  • 代碼庫:包含了經常使用的佈局方式、常見模塊和元件的實現以及一些bug、技巧等;

 

幫助你對頁面的規範和模塊有進一步認識。

 

 

 

課堂交流區:

模塊化實現

 

用模塊化的思想實現下圖所示導航(寫出html和css代碼,CSS只需寫出選擇器)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模塊化實現</title>
    <style type="text/css">
        .m-nav {}
        .m-nav .m-elem {}
        .m-nav .selected {}
    </style>
</head>
<body>
    <ul class="m-nav">
        <li class="m-elem seleted">分類方法</li>
        <li class="m-elem">命名規則</li>
        <li class="m-elem">代碼格式</li>
        <li class="m-elem">優化方案</li>
        <li class="m-elem">最佳實踐</li>
        <li class="m-elem">典型錯誤</li>
    </ul>
</body>
</html>

 

 

規範與模塊化的單元測驗

本次得分爲: 12.00/12.00, 本次測試的提交時間爲: 2017-09-11

 

1 單選(2分)

下列瀏覽器對應的hack方式正確的是?

  • A.IE6: property:value!important
  • B.IE9: property:value\9
  • C.IE6: _property:value2.00/2.00
  • D.IE6/7/8: *property:value
2 多選(4分)

下面哪幾項是推薦的css屬性書寫順序?

  • A.float  -> width -> color2.00/4.00
  • B.width -> text-align -> float
  • C.position -> border  -> font-size2.00/4.00
  • D.padding -> position -> font
3 多選(4分)

下面哪些網頁內容,適合做爲一個模塊?

  • A.翻頁器1.33/4.00
  • B.登陸表單1.33/4.00
  • C.圖標
  • D.新歌排行榜1.33/4.00
4 判斷(1分)

在註釋文字的兩端加空格,是爲了不註釋文字亂碼引發css失效的問題。

  • A.√1.00/1.00
  • B.×
5 判斷(1分)

選擇器分類命名,能夠有效避免css樣式污染的問題。

  • A.×
  • B.√1.00/1.00
相關文章
相關標籤/搜索