Skeleton源碼閱讀:一個極簡、響應式CSS庫

Skeleton是我在閱讀10 Best CSS Frameworks for Front-End Developers時發現的CSS庫,如下是文章對其的描述:css

Skeleton is so minimal that it doesn’t even call itself a CSS framework, library, or even module. It’s boilerplate, and contains only 400 lines of source code! Incredible? I think so, but to put things in perspective, Skeleton was designed for tiny or small projects that need little more than layouts and positioning.html

大體意思就是:Skeleton很是輕量,只有~400行代碼,主要用於小項目的佈局和定位。但這樣的描述其實並沒將Skeleton的所有特色囊括在內。如下是官方對本身的描述:git

A dead simple, responsive boilerplate.github

  • Light as a feather at ~400 lines & built with mobile in mind.
  • Styles designed to be a starting point, not a UI framework.
  • Quick to start with zero compiling or installing necessary.

翻譯一下就是:web

一個極簡、響應式CSS boilerplate。chrome

  • 輕量到只有~400行代碼 & 支持移動端
  • 設計的樣式能夠幫助你快速的構建頁面,但不會像UI framework那樣提供大而全的功能。
  • 無需編譯和安裝就可使用。

對Skeleton的介紹就到這裏了,詳細的內容你們能夠直接前往Skeleton官網查閱。廢話很少說,讓咱們來看源碼吧。bash

Skeleton源碼

Skeleton提供的全部樣式都在skeleton.css中,主要包含如下內容:app

  • Grid
  • Base Styles
  • Typography
  • Links
  • Buttons
  • Forms
  • Lists
  • Code
  • Tables
  • Spacing
  • Utilities
  • Clearing
  • Media Queries

其中Grid負責響應式的網格佈局;Base Styles、Typography、Links、Buttons、Forms、Lists、Code、Tables、Spacing負責重置相對應元素的默認樣式,button比較特殊,提供了兩套樣式;Utilities則提供了一些簡單的工具類;Clearing負責清除元素浮動;Media Queries不涉及任何樣式,只是給出了使用媒體查詢的建議。後續內容會按照這個順序依次講解,有值得說用法會給出代碼說明,沒有的也會列出源碼。ide

Grid

Skeleton Grid是一個12列、響應式、最大寬度960像素的網格系統。這部分代碼主要分三個部分:工具

  • 用於任何分辨率下的樣式
/* Grid
–––––––––––––––––––––––––––––––––––––––––––––––––– */
.container {
  position: relative;
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
  padding: 0 20px;
  box-sizing: border-box; }
.column,
.columns {
  width: 100%;
  float: left;
  box-sizing: border-box; }
複製代碼

代碼說明box-sizing是CSS3新增的屬性,用於改變CSS盒子模型計算寬高的方法。

  • 寬度大於400px時覆蓋和新增的樣式
/* For devices larger than 400px */
@media (min-width: 400px) {
  .container {
    width: 85%;
    padding: 0; }
}
複製代碼

代碼說明@media能夠針對不一樣的媒體類型定義不一樣的樣式,也能夠針對不一樣的屏幕尺寸設置不一樣的樣式,若是你須要設計響應式的頁面,@media 是很是有用的。

  • 寬度大於550px時覆蓋和新增的樣式
/* For devices larger than 550px */
@media (min-width: 550px) {
  .container {
    width: 80%; }
  .column,
  .columns {
    margin-left: 4%; }
  .column:first-child,
  .columns:first-child {
    margin-left: 0; }

  .one.column,
  .one.columns                    { width: 4.66666666667%; }
  .two.columns                    { width: 13.3333333333%; }
  .three.columns                  { width: 22%;            }
  .four.columns                   { width: 30.6666666667%; }
  .five.columns                   { width: 39.3333333333%; }
  .six.columns                    { width: 48%;            }
  .seven.columns                  { width: 56.6666666667%; }
  .eight.columns                  { width: 65.3333333333%; }
  .nine.columns                   { width: 74.0%;          }
  .ten.columns                    { width: 82.6666666667%; }
  .eleven.columns                 { width: 91.3333333333%; }
  .twelve.columns                 { width: 100%; margin-left: 0; }

  .one-third.column               { width: 30.6666666667%; }
  .two-thirds.column              { width: 65.3333333333%; }

  .one-half.column                { width: 48%; }

  /* Offsets */
  .offset-by-one.column,
  .offset-by-one.columns          { margin-left: 8.66666666667%; }
  .offset-by-two.column,
  .offset-by-two.columns          { margin-left: 17.3333333333%; }
  .offset-by-three.column,
  .offset-by-three.columns        { margin-left: 26%;            }
  .offset-by-four.column,
  .offset-by-four.columns         { margin-left: 34.6666666667%; }
  .offset-by-five.column,
  .offset-by-five.columns         { margin-left: 43.3333333333%; }
  .offset-by-six.column,
  .offset-by-six.columns          { margin-left: 52%;            }
  .offset-by-seven.column,
  .offset-by-seven.columns        { margin-left: 60.6666666667%; }
  .offset-by-eight.column,
  .offset-by-eight.columns        { margin-left: 69.3333333333%; }
  .offset-by-nine.column,
  .offset-by-nine.columns         { margin-left: 78.0%;          }
  .offset-by-ten.column,
  .offset-by-ten.columns          { margin-left: 86.6666666667%; }
  .offset-by-eleven.column,
  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }

  .offset-by-one-third.column,
  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }
  .offset-by-two-thirds.column,
  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }

  .offset-by-one-half.column,
  .offset-by-one-half.columns     { margin-left: 52%; }
}
複製代碼

代碼說明:column和columns的區別在於英語的單複數。

Base Styles

Bse Styles部分主要定義了頁面默認的字體樣式。

/* Base Styles
–––––––––––––––––––––––––––––––––––––––––––––––––– */
/* NOTE
html is set to 62.5% so that all the REM measurements throughout Skeleton
are based on 10px sizing. So basically 1.5rem = 15px :) */
html {
  font-size: 62.5%; }
body {
  font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
  line-height: 1.6;
  font-weight: 400;
  font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: #222; }
複製代碼

代碼說明

  • 將html的font-size設爲62.5%是爲了將1rem換算成10px,默認狀況下1rem=16px。
  • Raleway是谷歌提供的免費字體。

Typography

Typography部分主要定義了h1-h6字體、上下外邊框的樣式。

/* Typography
–––––––––––––––––––––––––––––––––––––––––––––––––– */
h1, h2, h3, h4, h5, h6 {
  margin-top: 0;
  margin-bottom: 2rem;
  font-weight: 300; }
h1 { font-size: 4.0rem; line-height: 1.2;  letter-spacing: -.1rem;}
h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
h3 { font-size: 3.0rem; line-height: 1.3;  letter-spacing: -.1rem; }
h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
h5 { font-size: 1.8rem; line-height: 1.5;  letter-spacing: -.05rem; }
h6 { font-size: 1.5rem; line-height: 1.6;  letter-spacing: 0; }

/* Larger than phablet */
@media (min-width: 550px) {
  h1 { font-size: 5.0rem; }
  h2 { font-size: 4.2rem; }
  h3 { font-size: 3.6rem; }
  h4 { font-size: 3.0rem; }
  h5 { font-size: 2.4rem; }
  h6 { font-size: 1.5rem; }
}

p {
  margin-top: 0; }
複製代碼

代碼說明

  • rem單位相較於em單位更推薦使用。
  • 我的認爲Base Styles的內容應該移到Typography中,p標籤外邊距的設置應該移到Spacing部分。

Link

Link部分定義了a標籤的樣式

/* Links
–––––––––––––––––––––––––––––––––––––––––––––––––– */
a {
  color: #1EAEDB; }
a:hover {
  color: #0FA0CE; }
複製代碼

Buttons

Buttons部分定義了按鈕的樣式

/* Buttons
–––––––––––––––––––––––––––––––––––––––––––––––––– */
.button,
button,
input[type="submit"],
input[type="reset"],
input[type="button"] {
  display: inline-block;
  height: 38px;
  padding: 0 30px;
  color: #555;
  text-align: center;
  font-size: 11px;
  font-weight: 600;
  line-height: 38px;
  letter-spacing: .1rem;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  background-color: transparent;
  border-radius: 4px;
  border: 1px solid #bbb;
  cursor: pointer;
  box-sizing: border-box; }
.button:hover,
button:hover,
input[type="submit"]:hover,
input[type="reset"]:hover,
input[type="button"]:hover,
.button:focus,
button:focus,
input[type="submit"]:focus,
input[type="reset"]:focus,
input[type="button"]:focus {
  color: #333;
  border-color: #888;
  outline: 0; }
.button.button-primary,
button.button-primary,
input[type="submit"].button-primary,
input[type="reset"].button-primary,
input[type="button"].button-primary {
  color: #FFF;
  background-color: #33C3F0;
  border-color: #33C3F0; }
.button.button-primary:hover,
button.button-primary:hover,
input[type="submit"].button-primary:hover,
input[type="reset"].button-primary:hover,
input[type="button"].button-primary:hover,
.button.button-primary:focus,
button.button-primary:focus,
input[type="submit"].button-primary:focus,
input[type="reset"].button-primary:focus,
input[type="button"].button-primary:focus {
  color: #FFF;
  background-color: #1EAEDB;
  border-color: #1EAEDB; }
複製代碼

Forms

Forms部分定義了表單相關標籤的樣式。

/* Forms
–––––––––––––––––––––––––––––––––––––––––––––––––– */
input[type="email"],
input[type="number"],
input[type="search"],
input[type="text"],
input[type="tel"],
input[type="url"],
input[type="password"],
textarea,
select {
  height: 38px;
  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
  background-color: #fff;
  border: 1px solid #D1D1D1;
  border-radius: 4px;
  box-shadow: none;
  box-sizing: border-box; }
/* Removes awkward default styles on some inputs for iOS */
input[type="email"],
input[type="number"],
input[type="search"],
input[type="text"],
input[type="tel"],
input[type="url"],
input[type="password"],
textarea {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; }
textarea {
  min-height: 65px;
  padding-top: 6px;
  padding-bottom: 6px; }
input[type="email"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="text"]:focus,
input[type="tel"]:focus,
input[type="url"]:focus,
input[type="password"]:focus,
textarea:focus,
select:focus {
  border: 1px solid #33C3F0;
  outline: 0; }
label,
legend {
  display: block;
  margin-bottom: .5rem;
  font-weight: 600; }
fieldset {
  padding: 0;
  border-width: 0; }
input[type="checkbox"],
input[type="radio"] {
  display: inline; }
label > .label-body {
  display: inline-block;
  margin-left: .5rem;
  font-weight: normal; }
複製代碼

Lists

Lists部分定義了列表相關標籤的樣式。

/* Lists
–––––––––––––––––––––––––––––––––––––––––––––––––– */
ul {
 list-style: circle inside; }
ol {
 list-style: decimal inside; }
ol, ul {
 padding-left: 0;
 margin-top: 0; }
ul ul,
ul ol,
ol ol,
ol ul {
 margin: 1.5rem 0 1.5rem 3rem;
 font-size: 90%; }
li {
 margin-bottom: 1rem; }
複製代碼

Code

Code部分定義了code標籤相關的樣式。

/* Code
–––––––––––––––––––––––––––––––––––––––––––––––––– */
code {
  padding: .2rem .5rem;
  margin: 0 .2rem;
  font-size: 90%;
  white-space: nowrap;
  background: #F1F1F1;
  border: 1px solid #E1E1E1;
  border-radius: 4px; }
pre > code {
  display: block;
  padding: 1rem 1.5rem;
  white-space: pre; }
複製代碼

Tables

Tables部分定義了表格相關標籤的樣式。

/* Tables
–––––––––––––––––––––––––––––––––––––––––––––––––– */
th,
td {
  padding: 12px 15px;
  text-align: left;
  border-bottom: 1px solid #E1E1E1; }
th:first-child,
td:first-child {
  padding-left: 0; }
th:last-child,
td:last-child {
  padding-right: 0; }
複製代碼

Spacing

Spacing部分定義了大多數標籤的外邊距。

/* Spacing
–––––––––––––––––––––––––––––––––––––––––––––––––– */
button,
.button {
  margin-bottom: 1rem; }
input,
textarea,
select,
fieldset {
  margin-bottom: 1.5rem; }
pre,
blockquote,
dl,
figure,
table,
p,
ul,
ol,
form {
  margin-bottom: 2.5rem; }
複製代碼

代碼說明:本部份內容是我我的認爲劃分最不明確的部分,理論上這個部分應該負責全部元素的內外邊距,實際上卻只是修改了一些元素的margin-bottom。

Utilities

Utilities部分定義了一些工具類

/* Utilities
–––––––––––––––––––––––––––––––––––––––––––––––––– */
.u-full-width {
  width: 100%;
  box-sizing: border-box; }
.u-max-full-width {
  max-width: 100%;
  box-sizing: border-box; }
.u-pull-right {
  float: right; }
.u-pull-left {
  float: left; }
複製代碼

Clearing

Clearing部分負責元素的浮動效果。

/* Clearing
–––––––––––––––––––––––––––––––––––––––––––––––––– */

/* Self Clearing Goodness */
.container:after,
.row:after,
.u-cf {
  content: "";
  display: table;
  clear: both; }
複製代碼

Media Queries

Media Queries部分給出了媒體查詢的最佳實踐。

/* Media Queries
–––––––––––––––––––––––––––––––––––––––––––––––––– */
/*
Note: The best way to structure the use of media queries is to create the queries
near the relevant code. For example, if you wanted to change the styles for buttons
on small devices, paste the mobile query code up in the buttons section and style it
there.
*/

/* Larger than mobile */
@media (min-width: 400px) {}

/* Larger than phablet (also point when grid becomes active) */
@media (min-width: 550px) {}

/* Larger than tablet */
@media (min-width: 750px) {}

/* Larger than desktop */
@media (min-width: 1000px) {}

/* Larger than Desktop HD */
@media (min-width: 1200px) {}
複製代碼

最後

以上就是本次源碼閱讀的所有內容了,儘管大部份內容就是源碼自己,可是絕對沒有水文章的意思,之因此把源碼粘貼過來是但願讀者能夠在一篇文章中看到本文的全貌。最後,我來談一下閱讀源碼對我本人的收穫:

  • 學習到了新的CSS屬性;
  • 學習到如何支持響應式;
  • 學習到如何組織CSS樣式。

感謝各位的閱讀,歡迎你們留言,點贊,關注。

相關文章
相關標籤/搜索