CSS禪意

来源:http://www.cnblogs.com/balaixianren/archive/2016/04/08/5366229.html
-Advertisement-
Play Games

標題取自《css禪意花園》一書,還記得當年讀此書時的情景,真的是內容和書名一樣的優秀,就以此標題作為自己在該文的一種追求吧,儘管我的水平和見解都和Dave Shea相去甚遠。該文算是對前兩年寫頁面工作的總結吧,現在比較少關註css了,可能觀點有狹隘的地方,同時文中也有一定的思考和理解,也許並不一定特 ...


標題取自《css禪意花園》一書,還記得當年讀此書時的情景,真的是內容和書名一樣的優秀,就以此標題作為自己在該文的一種追求吧,儘管我的水平和見解都和Dave Shea相去甚遠。該文算是對前兩年寫頁面工作的總結吧,現在比較少關註css了,可能觀點有狹隘的地方,同時文中也有一定的思考和理解,也許並不一定特別適合初學者閱讀,本人時間有限,也沒辦法針對具體的知識點做深入的講解或提供代碼示例,所以在閱讀過程中如果有不理解的地方,歡迎提問並互相學習交流。

  當UI設計師給了你一張psd圖,在對它進行切圖,實現成靜態頁面併在瀏覽器上完美展現,這個過程需要用到html和css。本文就從這個過程入手,講講相關知識點。

開發前期準備

1. 提取圖片
  UI設計師往往只提供給前端人員一張完整的psd圖,甚至對於無用的圖層也不清除,這個時候前端就需要自己進行ps,提取所需的圖片,並保存到項目圖片庫中。從我個人體會而言,我是建議前端自己ps的,理由是:
  - web頁面需要根據業務和技術需求選取不同的圖片文件格式,而多數設計師並無法完全理解
  目前主流的圖片文件格式依然是jpg、gif、png,這三者的區別應用和這麼做的目的可以查看拙文三種圖像文件格式的選擇
  - web頁面需要考慮性能因素,對一些圖片進行sprites貼圖處理
  頁面圖片的請求數越多,載入就越慢,一些不規則和具有特定業務場景使用的圖片可以通過利用sprites技術來減少圖片請求數,進而提升性能。sprites圖片的製作可以使用一些軟體或線上生成,線上生成工具CSS Sprites Generator
  - 字體圖標的選擇
  應用字體圖標的好處是能夠通過css簡單地控製圖片的大小、顏色,如果是矢量圖標,還可以避免跨平臺頁面製作導致的圖片失真問題。缺點是市面上瀏覽器對字體圖標文件的格式支持不統一,得生成不同格式的文件來進行相容性處理。推薦一下由阿裡巴巴UX部門推出的矢量圖標管理網站Iconfont.cn,該網站有豐富的矢量圖標可以收藏,並可以在平臺上建立項目,實現項目圖標應用協作管理。具體應用可以參見該站點的文檔幫助。
  - img or background?
    · 從業務角度來說,業務類型的圖片適用img標簽,而裝飾類型的圖片適用background定位
    · 從seo角度看,需要提升搜索關鍵字效果的應該使用img標簽,反之可得
2. 相容瀏覽器版本的決策
  不同的產品有不同的目標客戶群,不同的目標客戶群決定項目開發需要註重的瀏覽器版本相容。相容性問題是因為瀏覽器內核不一致導致,而根本原因是因為在早期,沒有統一的標準和規範讓瀏覽器廠商來遵循。在編寫代碼開始前,應該向產品經理確認該項目需要相容的最低瀏覽器版本,這裡更多的是指IE瀏覽器。瀏覽器版本決定我們可以選擇哪些css選擇器,應用哪幾種佈局方式,規避哪些常見的相容性問題等等。
3. 響應式開發
  由於智能手機的普及以及網路越來越發達,目前移動端的開發愈發的重要。是針對不同的平臺分別定製不同的代碼,還是一套代碼適應多種平臺(即常說的響應式開發)?也是需要團隊考慮的方向。響應式開發在設計層面來說,需要考慮UI展示的不同,終端設備交互的差異,在技術層面來說,就是媒體查詢+液態圖片+流式佈局的綜合應用。

HTML

  Html的設計初衷是讓用戶能在瀏覽器上更好的地瀏覽文字,所以會有h1~h6標簽用來區別不同標題級別、ul和ol來定義列表種類、p用來表示段落。不同的標簽會有不同的預設樣式,後者會讓頁面在瀏覽器上展示出層次感,便於閱讀。

  Html的標簽各有所用,所以開發者在編寫html代碼的時候,也應該從這一方面入手,讓標簽做正確的事情,個人認為這也就是語義化提出的初衷。一個html頁面,可以從下麵幾個方面實現語義化:
  - 讓標簽做它該做的事情
  - 儘可能少的代碼嵌套
  一部分開發者寫的代碼結構嵌套很深,有的時候並不是沒有認識到弊端,而是不得已而為之。原因就是對css應用得不夠熟練。比如一行文字前面加個小圖標這樣的場景,實現方式有很多種:
  · 給文字設置padding-left,用背景圖定位的方式
  · 給文字標簽添加:before偽元素選擇器,存放圖標,定位之
  · 增加一個空標簽來設置圖片樣式
  顯然,最後一種方式是種反模式,不建議使用。
  - 去除冗餘的標簽屬性
  在保證前面兩個原則的情況下,通常我們只需要對一個業務模塊的最外層標簽定義一個鉤子(id或者class等等),然後結合css強大的選擇器,就可以避免需要給每個標簽添加識別屬性,進而書寫css的尷尬
  - 添加有意義的屬性
  有時候給一些特定標簽添加屬性能夠讓頁面更加友好,並有利於seo。比如給img標簽添加alt屬性、給a標簽添加title屬性等。
  - 校驗
  查看一個網頁結構是否合理,一個好的辦法就是把樣式表去除,然後在瀏覽器上查看,理論而言可讀性好的頁面,結構就是合理的

CSS

  隨著web的發展,簡單的html已經不能滿足人們的審美需求,於是css應勢而出,css的機制就是通過link或style方式,告知瀏覽器,瀏覽器解析css規則,並和相對應的標簽元素進行綁定,找到相對應的標簽就靠seletor。

1. 選擇器
  Selector一直在增加,查找功能越來越強大,為的就是適應越來越豐富的web應用開發,相信隨著時間的推移,還會有更多的選擇器出現。從基礎選擇器到偽類和屬性選擇器,合理地進行選擇才能寫出優雅的代碼,這是基本功,得多寫多練。
2. 繼承和層疊
  Css的另一機制。繼承實現了樣式的共用,常見的如color、font屬性,最終目的是保證開發的合理性,想想如果需要為每個標簽都寫一遍字體定義是一件多麼可怕的事情。我認為層疊的機制是依賴於繼承的,如果沒有繼承,也就不需要層疊存在了。css通過選擇器的優先順序來告知瀏覽器怎麼樣應用樣式,確定優先順序有一個計分原則specificity,除了計分原則,還有很多特殊性需要知道,比如important、多個相同選擇器的聲明、樣式表的種類以及它們的優先順序關係等等。層疊的本質是為瞭解決樣式復用問題,一個可復用的樣式(可以理解為基礎樣式)的選擇器如果越多,那麼層疊覆蓋的選擇器就越複雜,所以在寫css的時候,減少選擇器嵌套是個不錯的準則,特別是在出現了像sass和less這樣的預編譯工具,很容易就寫出了多層選擇器,影響了瀏覽器的解析速度。
3. Reset樣式
  正如前面html說的,html有許多標簽預設就有樣式,比如a、p、ul等,不同的瀏覽器在賦予這些標簽樣式的時候,並不統一,這就會造成初始化頁面展示不一致,還有情況如列表標簽ul、ol,預設樣式太過單一,往往滿足不了業務需求,所以這就需要在一開始的時候就對預設樣式進行重置。不是所有的樣式都需要重置,一個站點,往往只需要對一些常用的標簽且有預設樣式的進行重置,像bootstrap那樣大而全的UI庫,因為得兼顧許多應用的場景,所以會列出許多需要重置的標簽,但是一般的站點確實是不需要的,精簡是css應該追求的一個方向。
4. Box Model
  Css佈局依賴於兩個方面,元素和定位。不管是行內元素或塊元素,在頁面上的展示都是一個個矩形框,因此就有了框模型的概念。框模型是css的基礎,在應用過程中,得註意行內元素的垂直margin無法生效,而同一個bfc內的塊級元素的margin會發生摺疊現象,框的內容寬度在沒有width的情況下的取值原理。如果可以的話,瞭解IE低版本混雜模式下盒子的展示方式,以及box-sizing的用法就可以了
5. BFC的原理
  對css的佈局有比較深入研究的朋友們或許能理解,BFC就是css各種佈局屬性綜合應用的大雜燴。它提出的目的就是在於總結一套規則,告訴大家當碰到使用相關屬性的情況下,元素會有怎樣的表現,以及元素和兄弟元素或父元素,或兄弟元素的子元素乃至層級之間優先順序關係等等。這些相關屬性可以從清除浮動的方式中去獲取:
  - overflow屬性除了visible的取值
  - display屬性line-block, table-caption等
  - float屬性非none值
  - position屬性absolute和fixed值
  當元素有了上面屬性之一,就會形成一個獨立的容器。
6. CSS和CSS3
  Css3提供了許多可供實際場景應用的屬性,但是我始終覺得它更像是武俠里說的只是武功應用的法門,如果要讓武學有個質的飛越,還是得把css一些很基礎的東西學扎實,比如我前面5點所寫的,但是不限於。
7. SASS
  用sass來寫css體驗還是不錯的,用得好的話會有做css架構的感覺,這是因為它的功能決定的。比如它支持變數定義,嵌套,導入樣式表,函數定義並可傳參,樣式組合重用以及簡單地計算功能。如果用得不好,它的功能就發揮不出來,比如定義了變數,只引用了一次,其他地方還是像寫css那樣,另外像mixins和extend也要多考慮去定義使用,而嵌套,應該考慮合理的區間。

結語

  洋洋灑灑寫了這麼多字,花了不少時間,腦細胞死了不少。文中雖然沒有舉例說明,但是每一段文字的下筆我都是先在腦海中先想象了應用場景,靠著自己的語言闡述出來。希望這篇文章能給在前端界面開發有過一定經驗的朋友帶來一些思想上的交流,不足之處還望指教。


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

-Advertisement-
Play Games
更多相關文章
  • 關於浮動,最主要的就是解決浮動在IE6、7下要做的相容問題。例如:雙邊距bug,圖片下的空隙問題等等。後面要和定位帶來的相容問題一起總結一下好了~~~ 塊的特征 1、預設獨占一行 2、沒有寬度時,預設撐滿一排(即父元素有多寬它就是多寬) 3、支持所有css命令 行內元素的特征 1、同排可以繼續跟同類 ...
  • 最近做的一個h5活動因為嵌入視頻而發現了好多以前從未發現的問題,在測試的時候不同系統不同版本不同環境等多多少少都出現了些問題,搞得我也是焦頭爛額的,不過好在最終問題都解決了,自己也學到了好多東西,為了方便以後用到參考,所以就記下來咯。現在有一個感悟就是當問題來臨的時候不要覺得沮喪不要抱怨而要積極面對 ...
  • 一、Jquery常用的過濾選擇器如下所示: 1、:first,選取第一個元素,比如$("div:first")選取第一個div元素 2、:last,選取最後一個元素,比如$("div:last")選取最後一個div元素 3、:not(選擇器),選取不滿足“選擇器”條件的元素,比如$("div:not ...
  • 一些常用的表單驗證的代碼 註冊驗證: <script language="JavaScript" src="js/jquery-1.9.1.min.js" type="text/javascript"></script> //驗證表單 function vailForm(){ var form = ...
  • 隨著瀏覽器的升級,CSS3已經可以投入實際應用了。 <!-- /div --><!-- div id="more" class="asset-more" --> 但是,不同的瀏覽器有不同的CSS3實現,相容性是一個大問題。上周的YDN介紹了CSS3 Please網站,該網站總結了一些常用功能的寫法。 ...
  • 時間到了2015年6月18日,ES6正式發佈了,到了ES6,前面的各種模擬類寫法都可以丟掉了,它帶來了關鍵字 class,extends,super。 ES6的寫類方式 以上定義了一個類,constructor 是構造器,這點和 Java 不同,Java的構造器名和類名相同。 和 Java 多象啊, ...
  • 大家可以通過谷歌瀏覽器以網易網站做為範例,通過網站頂部的導航菜單欄來查看relative和aboulute的區別 CSS的很多其他屬性大多容易理解,比如字體,文本,背景等。有些CSS書籍也會對 這些簡單的屬性進行大張旗鼓的介紹,而偏偏忽略了對一些難纏的屬性講解,有避重就輕的嫌疑。CSS中主要難以理解 ...
  • 在jQuery1.9版本中,已經去掉了live和delegate方法,從而將on方法的地位進一步提升。 jQuery如此推崇on方法,必有其牛逼的地方。那麼我們就有必要瞭解這個on,併在代碼中利用它,從而優化代碼和提高性能。 註:在jQuery1.7後,on方法就可以全面綁定任何事件了。 .on( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...