難解的 CSS 排版:認識對齊(下)

本文為參加第 11 屆「iT 邦幫忙鐵人賽」系列文章,會優先在部落格發文,再貼到 iT 邦幫忙~。
如果文章對您有幫助,歡迎到 iT 邦幫忙給我一個訂閱與肯定 ^___^。
好久沒寫文了,也希望自己可以堅持 30 天,加油(握拳

昨天講了text-align以及vertical-align這兩個常見的對齊語法,但他們可以對齊的範圍都比較小,偏向對齊元件,而非版面。
如果要讓版面置中,或是再更複雜的一些排版,我們還可以有更多選擇。

版面置中的好幫手: margin

這個應該很多人都用到爛掉了,但有的朋友可能不太懂原理,在此簡單介紹一下。

我們在切一個大版面時,如果要讓他左右置中,現在普遍最快的方法是使用以下語法:

CSS

然後版面就可以置中了。

margin: 0 auto;margin: 0 auto 0 auto; 的簡寫,表示上下邊界為 0 ,左右為auto表示自己均分。margin會去判斷.container的寬度以及螢幕的寬度,相減之後除以二就是左右邊界的數值了。

至於該如何得到.container的寬度呢?就是必須要在 CSS 寫上寬度,如果沒寫寬度是不會有效果的。

margin大到版面,小到元件,只要有指定元素的寬度,幾乎都可以用這個方法左右置中。

CSS

更多的 margin

☞ 圖片一樣可以使用margin: 0 auto;置中
margin可以讓版面置中,但沒辦法讓文字置中唷。


讓 padding 幫你實現簡單的垂直置中

如果說margin是負責版面,那padding就是負責裡面的元素了。

我們可以利用padding將 Box Model 往外推的特性做到置中的效果,只要上下數值一樣就可以囉。

CSS

選單文字垂直置中的首選 line-height

▼ 假設今天要製作一個類似這樣的選單,文字需要垂直置中,同時又有限定元素的高度。

因為有限定高度,所以我們沒辦法用padding去推 Box Model;另外一個原因是,如果選單再複雜一點,padding通常都另有用途。

所以假設今天需求是:

  • 有限定元素高度
  • 文字需垂直置中
  • 文字非常單純只有一行

在上述的情況下,可以直接用line-height解決,只要讓line-heightheight高度相同即可

CSS

用 position 讓你的版面水平垂直置中

position的解法,我之前在部落格有寫過了,所以容我直接跳過~
有興趣的朋友可以直接參考這一篇文章:用 css 讓區塊水平垂直置中


用 transform 做出與 position 類似的置中效果

transformposition類似,都是直接將 Box Model 推移到特定的位置上,達到置中的效果。

使用position可以再利用margin去推算要定位的位置,但前提是你必須要知道元素的寬跟高,才有辦法回推。但使用positiontransform就不用特別設定寬跟高,非常的方便

CSS

難解的 CSS 排版:認識對齊(上)

我一直很想寫這系列的文章,一來是 CSS 博大精深,有太多難解的觀念在裡頭。二來是常常要切很多重複卻又複雜的版型,所以想要系統化這些資訊,供日後快速查閱。

因此,這系列算是我自己的筆記,也算是經驗分享吧!也希望能幫到各位 m(_ _)m

廢話不多說,直接上重點 XD。

(閱讀全文…)

CSS Grid 語法筆記

這篇不算教學,只是將 CSS Grid 的語法做個紀錄,所以沒有前言,也不會介紹 CSS Grid 是什麼。如果你已經知道 CSS Grid 的作用,也歡迎參考以下筆記,也許可以幫助你更了解相關語法。

從 Gird 開始

前置作業:將 div 的 display 設為 grid,接著定義 Grid 的寬度(columns)與間距(gap)

HTML
CSS

grid-column-gap 以及 grid-row-gap 可以合併為 grid-gap

CSS

▼ 網頁示意圖

假使要設定 CSS Grid 的高度,可以再加上:

CSS

▼ 網頁示意圖

在這個範例中,row 有 4 行,可是我們只設定了 1 & 2 行,沒有設定高度的會以元素高度為高度(auto-height)。

☞ 可以用grid-auto-rows設定 auto-height 的最小高度。

☞ 注意

  • 沒有grid-auto-columns這種語法。
  • 沒有grid-auto這種簡寫。

新的單位:fr

fr 是因應 CSS Grid 而產生的新單位,全名是 fraction (分數),這個分數不是 score 那個分數,而是數學分子 + 分母的那個分數。

我們可以用 fr 去設定 CSS Grid 的相對寬度,以達到 RWD 的縮放效果。如果是跟前面範例一樣使用px,縮放的時候是不會有 RWD 的(這大家應該都很清楚了)

grid-template-columns 的單位改掉:

CSS
  • 編號 1,4,7,10:占 1/4
  • 編號 2,5,8:占 2/4
  • 編號 3,6,9:占 1/4

▼ 網頁示意圖

這時候縮放就會有 RWD 效果囉~。

另外也可以混搭單位:

CSS

重覆 Grid 的設定

如果 Grid 的寬度有一個固定的模式,可以用 repeat() 這個語法把它們合併,類似迴圈的感覺。

假設原本這樣寫:

CSS

可以看出來三個為一組,1fr 2fr 2fr是一直重覆的,所以改寫如下:

CSS

▼ 網頁示意圖

最左邊跟最右邊的 Grid 如果不會重覆,可以接在repeat的前後:

CSS

Grid 的排序

使用 grid-auto-flow 進行 Grid 的排序,預設屬性為 row (橫向排列)。

如果改用 column,Grid 就會變成縱向排列 (可以注意數字編號):

CSS

▼ 網頁示意圖

此外也可以指定某一個div進行排序

CSS

如果沒有指定order的順序,預設就是order: 0,而我們現在指定第三個 div 為order: 1,所以第三個 div 的排序會跑到最後面。

☞ 承上,現在是縱向排列,所以 div 排列的順序是用「縱向」來看的喔。

▼ 網頁示意圖

接下來就可以用order:N任意調整排序囉!

CSS

▼ 網頁示意圖

以上就是 Grid 的相關筆記。

部落格改版之後,是用 Grid + Flexbox 來排版的,有興趣的朋友可以自行扒皮 XD

CSS Flexbox 介紹與解析

老實說我到現在都還沒開始用 flex 做網站,最大的原因就是 IE 相容問題,不過這也不能當作不學習的原因,畢竟這行就是要不斷的學習新知識😂,而且剛好在某次前端課程中有同學問我能否介紹 flex,所以想想,乾脆就寫一篇文章吧!不僅是幫自己做個筆記,以後也可以當作課堂上的補充講義~。

▼ flex 相容一覽圖 / caniuse.com

什麼是 Flexbox

簡單來說,Flexbox 是一種 CSS 的排版語法,就跟我們以往用的 position, float, display…一樣,只是 Flexbox 是 CSS3 的新語法,所以才有瀏覽器相容的問題。

Flexbox 相關屬性與值

我覺得 Flexbox 較難上手的原因,就是他的屬性跟值太多了,不像 float 很單純的只有 left, right, none 這三種,但當然好處就是彈性非常大,幾乎很多複雜的排版都可以靠 Flexbox 輕鬆解決。

在這邊也參考了 W3C 的網站,列出所有 flexbox 的屬性跟值給大家參考,至於詳細的介紹還是可以看 W3C 關於 Flexbox 的文件喔!

屬性屬性介紹可用的值預設值影響
flex-flow將 flex-direction 以及 flex-wrap 合併寫在一起flex-direction |flex-wrapflex containers
flex-direction
排列方向
rowrowflex containers
row-reverse
column
column-reverse
flex-wrap
換行nowrapnowrapflex containers
wrap
wrap-resverse
order
調整元素排列的順序<整數>0
flex
將 flex-grow、flex-shrink 以及 flex-basis 合併寫在一起flex-grow|flex-shrink|flex-basisflex items
flex-grow
<數字>0flex items
flex-shrink<數字>1flex items
flex-basis<寬度>autoflex items
justify-content
水平對齊設定flex-startflex-startflex containers
flex-end
center
space-between
space-around
align-items
垂直對齊 (元素單行排列)flex-startstretchflex containers
flex-end
center
baseline
stretch
align-selfflex-startautoflex items
flex-end
center
baseline
strech
align-content
垂直對齊 (元素排列超過兩行以上)flex-startstretch多行 flex containers
flex-end
center
space-between
space-around
stretch

常用的 Flexbox 排版語法

要使用 flex 前,必須先在該容器指定:

CSS

而特別有趣的是,就連行內元素都可以用 flex 唷:

CSS

接下來,我們用一小段 HTML 語法表示 Flexbox 的架構:

HTML

承上,這個很常見的巢狀排版恰恰能表達flex的兩大主角:flex-container以及flex-item,前者表示的是一個巨大的容器(container),後者則是各個獨立的項目(item)。

flex的屬性,有的會影響的是容器,有的則影響項目。如果不太清楚屬性影響的是哪一塊,可以回到前一頁看表格的「影響」欄位做參考。


基本的 Flexbox 排版

flex-direction

我們先介紹最簡單的左右版面,以往直接用float: left解決,那麼換成flex的話可以這麼寫:

CSS
  • Flexbox 是 Box Model 的一種表現形式,以前我們用display去改變每個元素的 Box Model,在此也是一樣,我們要在flex-container先設定display: flex,確保自己以及裡面的子元素 Box Model 都會轉成flex的設定。
  • flex-direction表示 flex 的水平排列方向,第一頁的 Flexbox 屬性表上有提到,flex-direction必須放在 flex container 的父層架構下,而不是 flex item 這個子層,所以這句話寫在.flex-container裡,如果你把它放在.flex-item會發現沒作用。(再次提醒:對照屬性表會更加清楚該放在哪裡喔。)

最後我們來把flex-direction所有的值都寫一遍吧!

See the Pen QEGbMm by MUKi (@mukiwu) on CodePen.

在值裡面,用到的rowcolumn,一個是水平排列、一個是垂直排列;而reverse是反轉的意思,稍微對照一下上面的範例應該不難了解唷!


flex-wrap

接下來再加一個新的語法flex-wrap,這個同樣要放在.flex-container裡面,wrap是斷行的意思,可以利用這個語法決定是否要換行。

設定nowrap表示即使有多少區塊,也必須都放在同一行內(會自動分配寬度)。設定wrap則是會依照內容或寬度自動換行。

See the Pen oLYjqG by MUKi (@mukiwu) on CodePen.

flex是三個屬性的合併縮寫:flex-grow, flex-shrink, flex-basis,可以看作是 FLexbox 的核心設定。 註:flex 的這些屬性影響的是 flex items。


flex-grow

我們都知道,區塊預設的寬度是元素內容的寬度,如下圖所示 ▼

如果想要調整寬度,一般可以用width設定,但也能用flex-grow唷!flex-grow的預設值為 0,表示寬度就是元素內容的寬。而從 1開始,數字愈大,占的寬度比例也會愈大。

CSS

範例圖如下所示 ▼


flex-shrink

flex-shrinkflex-grow相反,是表示當父元素寬度空間不足時,子元素壓縮的比例。預設值為 1,但設為 0 同樣表示不壓縮,數字愈大,被壓縮的幅度就愈大。

CSS

範例圖如下所示 ▼


flex-basis

可以在flex-basis設定寬度或高度,設定好後會自動分配該區塊的寬度或高度。

CSS

假設父元素寬度是500px,我在裡面設了兩個子元素分別為200px以及600px,他會依照比例分別給予子元素寬度,如圖所示 ▼

以上這三個語法因為有比較多的彈性,所以可以用在製作 RWD 網站上。


flex

最後,再次提到flex這個語法,是用來合併以上三個屬性,規格為:

CSS

flex 還有兩個更簡短的縮寫:

CSS

以上關於flex的範例程式碼,請參考:http://codepen.io/mukiwu/pen/qNRJPv


Flexbox 還有一些屬性沒有提到,因為我有點累了,所以暫時解說到這邊。但我覺得剩下的都是比較簡單而且很容易上手的語法,所以等待以後有空補完 XDD。

Flex 版面實例介紹

版面垂直置中

幾千萬年以來傷透腦筋的垂直置中,超級適合用flex解的喔!在這邊我們會用到兩個屬性:

  • justify-content
  • align-items

而這兩個屬性我前面通通都、沒、說(炸),但真的很簡單,所以直接上程式碼啦!

CSS

範例請參考 codepen:


動態三欄式

除了用flex-grow動態調整他們的大小外,還用了order調整版面的順序


不同的圖片 / 區塊排列

這種排版變化比較多一點,但不知道怎麼稱呼它,所以直接看範例比較清楚 XDDD。

一樣是大量運用到flex屬性做調整,在這個例子中,flex-basis尤其為最重要,當然還有一些對齊的語法也不能少。以下是有用到的語法:

  • flex-wrap
  • flex-basis
  • justify-content

以上三種排版,是我目前想到可能比較有趣,或是比較實際的例子 XD,如果有特別想要了解某些版面換成flex該怎麼寫的話,也可以留言給我唷!

原生 CSS 的預處理器:Myth 介紹與使用

昨天閱讀 CSS Secret 時,作者提到了 Myth 這套預處理器,所以研究了一下如何搭配 gulp 作到自動化編譯(compile),以及如何結合 compass 作到 double 自動化 XDD。

Myth 介紹

免不俗的,先來介紹 Myth 吧!他跟 SASS, LESS 有點像又不太像,相同的地方在於他們都是 CSS 的預處理器,不同的是,SASS & LESS 有自己的規則跟語法(例如 mixin, extend)是原生 CSS 不支援的,而 Myth 的所有語法都是原生 CSS 的 spec,就算不用 Myth 編譯也可以在瀏覽器正常瀏覽。

但是,因為瀏覽器還沒有全面支援各種原生 CSS 的 spec,例如之前介紹過的 CSS 變數,所以我們可以利用 Myth 編譯 CSS,假使以後這些 spec 都開放支援了,直接把 Myth 摘除也不會有影響,非常方便!

有哪些原生的 CSS 需要編譯呢?其實功能不多,只有四個 XDD,我直接擷取 Myth 網站的圖片如下:

Variable 與 Math

再次強調,想瞭解 CSS Variable 可參考我之前寫的文章:CSS 原生變數介紹,不過 Myth 沒辦法支援 CSS Variable 所有功能,像是強大的「繼承」功能就無法支援。

我們都知道,所謂「編譯」就是將 CSS 語法寫死,不管是 SASS, LESS, 或是 Myth,即使在寫的時候靈活度很高,但是編譯出來的語法就是固定的。而 CSS variable 是原生的 CSS 語法,跳過編譯這個階段,可以讓語法更加靈活,尤其是前面提到的繼承功能 (這邊扯遠了,有興趣就看我那篇文章啦 XD)

Math 就是calc()語法的應用。

calc()是原生 CSS 裡很強大的一個「活用」語法,他本身是不需要再次被編譯的,但因為calc()可以加入變數作運算,因為牽扯到變數,所以我們需要編譯他們。

Color 與 Prefixes

未來color()也能像 SASS 一樣有lighten()這一類的數值調整,有興趣閱讀 spec 的朋友可以參考 W3C 的 draft:Modifying Colors: the color-mod() function

最後是針對瀏覽器添加的 prefix,以 Compass 為例,我們會寫:

CSS

以編譯成:

CSS

但 Myth 不需要加上@include這一類的函式,我們只要寫一行transition: color .2s;,就可以編譯成相容瀏覽器的語法。

以上就是 Myth 提供的四個核心語法。

如果你有興趣玩玩原生 CSS 的最新函式,也許可以考慮使用 Myth 幫你編譯唷!


安裝與使用 Myth,並搭配 gulp 自動化編譯

請先安裝 myth 這個套件,請使用 npm 套件管理:

Shell

他的使用方法很簡單~,假設我們在 input.css 寫好檔案,想把它編譯成 output.css,只要使用myth指令即可:

Shell

當然,每次要這樣輸入還蠻累的,所以可以搭配 gulp-myth 自動化工具。他除了支援 gulp 之外也有支援 grunt,不過我比較喜歡用 gulp,所以只提供 gulp 的設定方法 XD,如果你自己有在用 grunt,想必如何設定對你也不是難事啦😊 ~

專案目錄結構

先假設我們的專案目錄結構如下:

Plain Text

我們會在 dev/ 底下開發 CSS 檔案,最後希望透過 Myth 幫我們編譯到 build/ 目錄下。

⚒ 先安裝 gulp-myth

Shell

⚒ 新建 gulpfile.js 檔案

JS
gulpfile.js

最後到 terminal 執行gulp就大功告成啦!只要寫好 CSS,就可以透過 gulp 自動幫你編譯成另外一個 CSS,並存放至 build/ 目錄底下唷!


利用 gulp 結合 Compass 與 Myth

Myth 的存在並不是為了取代各種預處理器,透過前面的介紹,希望各位能理解它們存在的意義。Myth 的網站也清楚地提到:

You can still use variables and math functions, just like you do in preprocessors.

所以接下來讓我們試著把這兩個預處理器合在一起吧 ~

我自己使用的預處理器是 Compass,所以等等一樣只以 Compass 做例子,然後這次的目錄結構更改如下:

Plain Text

ps. 記得要先compass create啊 XDDD

⚒ 先安裝 gulp-compass

Shell

⚒ gulpfile.js 設定如下

JS
gulpfile.js

最後同樣到 terminal 執行gulp就完成了。利用 gulp 自動化工具,會先將 scss 檔案編譯完成,再交給 myth 編譯,最後再覆蓋到 stylesheets/ 目錄下。

以上兩種方法提供給各位參考,有興趣使用 Myth 的朋友也可以玩玩看唷~


昨天在看某篇技術文章時,看到最後心有慼慼焉,節錄如下:

大家大可不必過分在意一點點的 CSS 細節,CSS對於產品的商業價值有,但是到了一定階段以後,實際上就有限,或者說很難直觀的體現,或者說性價比就不高了。

以現在瀏覽器的渲染性能以及我們實際的開發需求,就算有差異,有價值嗎,肯定沒有!

大環境如此浮躁,你會發現,自己遇到的困境並不是技術成長遇到了瓶頸,而是根據不需要你這方面進一步的技術成長,來,幹點收益更明顯的事情!

我想,很多前輩技術博客斷掉了,怕也是人在職場,身不由己!

我能不能走出一條不一樣的路呢?

玩這些新的技術到底對現在的工作 / 生活有沒有幫助?其實想想還蠻哀傷的 XDD

不過我又想起了自己寫部落格的初衷,原本就不是要給誰誰誰看,也不是為了流量或是各種附加利益,畢竟我要賺錢我就轉行去寫 美妝 / 3C / 生活了 😂,我之所以想寫這些東西,純粹是為了記錄,畢竟大腦容量有限,我所能做的就是利用紙筆、利用打字幫我記錄下來。如果哪天我忘記了,至少還有這些記錄可以翻閱。

這就是我的初衷,直到現在依然不變,所以轉而想想,也不用怕別人需不需要,不違本心而已 XDD

扯遠了,哈,總之有任何問題都歡迎一起交流討論,針對 gulp 有更好的寫法也歡迎告訴我喔!

inline element 與 padding 的二三事

前兩天在台大上課時,剛好提到 display 的各種形態,然後很嗨森的告訴同學,如果你設定任一元素(element)為 display: inline 時,padding-top 以及 padding-bottom 是不會有作用的唷 😆 😆 😆

結果!!就在我邊說邊示範的這個 moment 時!!!!!

他居然 work 惹 🙀 🙀 🙀 🙀 🙀 🙀

當下整個尷尬的無以復加 XD,所以回家找了一些針對 inline element 的說明,然後順便糾正一下自己的觀念 T皿T

OK,以上內心小劇場 + 碎碎唸完畢,讓我們開始認真吸收一下觀念吧~


我在 Head First HTML with CSS & XHTML 找到了一段針對 inline element 的說明,這段內容敘述非常清楚,可以瞬間導正自己的觀念,所以分享給大家:

You can add padding to the top and bottom of inline element, but the padding doesn’t affect the spacing of the other inline elements around it, so the padding will overlap other inline elements

Head First HTML with CSS & XHTML

簡單來說,inline element 的確可以使用 padding-top 以及 padding-bottom的語法,但 padding 不會推擠周圍的 inline elements,反而會覆蓋其他的 inline elements

不太懂也沒關係,我們就直接來看範例囉~

以 padding-bottom 為例

第一段是以p作範例(display:block),第二段是span(dispaly:inline)。在同樣使用padding-bottom: 1em的設定下,來看一下他們有什麼差別吧!

就我們認知的 HTML element 都是以「堆疊」模式排列而成,所以透過範例可以發現,正常情況我們設定元素的下間距時,他下方的所有元素會因此被往下推擠;但如果將元素的型態改為 inline 時,他下方的元素不會被推擠,反而會讓下方的元素把自己給蓋住。

以 padding-top 為例

我們再來看一個更明顯的例子,現在我把 padding-bottom 改為 padding-top ,看看會發生什麼事情。

如同剛剛說的,元素型態為 inline 時,設定padding-top並不會讓自己的往下推移,而是會覆蓋掉前面的元素。

你可以試著把我在 HTML 寫的這段語法加上 class 變成<span class="padding">

那麼你會發現,同樣的他不會讓自己往下推移,而是會蓋掉前面的元素:

也因此,雖然 inline elements 可以吃到 padding-top 以及 padding-bottom 的設定,但卻不會讓其他元素跟著被推移,造成排版上的一些困擾。我想這就是大家不常使用的原因,導致我只記得結論就是不用 top 跟 bottom XDDD。

如果你之前上過我的課,或是跟我一樣有這種觀念的朋友,希望閱讀這篇文章後可以一起把這個觀念修正過來唷😁

SASS, LESS 退散,原生 CSS 可以使用變數啦!

今天要跟大家分享一個新的 CSS 語法:變數。而且這個變數是原生的 CSS 就有的語法,不是其他預處理器例如 SASS, LESS… 的功能喔!

一想到以後可以使用 CSS 寫變數就超級興奮的😊~,但正因為這是 CSS 的新功能,想當然要考慮的第一個問題就是「瀏覽器的相容度」,透過 Can I Use 查詢後,可以發現支援度真是滿江紅啊 XDDD (紅色=不支援,綠色=支援) 2019.08 更新:現在各大瀏覽器對 CSS 變數的支援度已經慢慢在增加囉!

但因為這功能實在是太實用了,即使支援度不好,我還是想介紹給各位,希望未來所有瀏覽器都能支援,就可以輕鬆地運用在網站上囉!Chrome 跟 Firefox 都有支援 CSS 變數的語法,歡迎使用這兩個瀏覽器觀看效果。

CSS 變數的基本語法

如同我們使用各種預處理器設定變數般,首先要命名變數與設定值,接下來在適當的地方呼叫該變數。

以下是一段簡單的範例語法:

CSS

把握幾個原則:

  • :root命名變數,我們也可以在任意的選擇器內命名變數,後面會提到該怎麼寫,以及怎麼使用。
  • --main-color是變數名字,#369是該變數的值。
  • 承上,變數命名的規則為:開頭必須是兩個破折號 --
  • 在要呼叫變數的選擇器裡面,使用var()呼叫該變數,可以把它想成 function。
  • 變數的大小寫是兩個不同的變數,例:--main-color--Main-Color是不同的變數喔。

變數的命名規則看起來有點麻煩,有一些開發者曾經回饋:「為什麼不用$foo呢?」,而針對這個討論,他們的回應是,不排除這個需求,未來可能會允許使用$作為命名規則,相關的閱讀可以參考這篇文章

CSS 變數繼承觀念

前面有提到,除了可以將變數寫在:root外,還能寫在任意的選擇器,以下是範例語法:

CSS
HTML

也可以從 CodePen 看到實際效果 (記得確認瀏覽器有支援喔)

我們在通用選擇器( * )使用--bg-color語法,照理說,所有的 HTML 都會套用:root的設定。

但同時,我們又特別為h3以及#main設定了不同的背景顏色,因此,當我們的 HTML 有使用這兩個標籤時,他就會自動套用這兩個標籤設定的變數顏色囉!

也因此我們了解到,變數可以因應不同的狀況而更改它的數值 (這不就是變數的精髓嗎 XDDD),我們還能利用這種特性設計 RWD 網站:

CSS

▼ 變數的另外一個特性:可以互相 assign 來 assign 去,也能在 CSS 變數中實現喔!

CSS

這時候呼叫--font-color,他的顏色就是 #369


var() function 結構

var()的完整結構如下:

CSS

cutsom-property-name 是我們呼叫的變數,例如前面使用的--bg-color。我們也能在 declaration-value 設定其他的值,避免自定義的屬性無效時產生錯誤。如果寫成邏輯方程式大概就是:

JS

這種寫法有一種高檔的名詞叫做 fallback,如果你有機會閱讀 W3C 官方文件,會發現他們用 fallback 稱呼該處理。

declaration-value要用「逗號」去分隔多個數值,例如var(--bg-color, #369, black);。但如果要處理例如marginpadding的 fallback 時,請注意他們原本的值就沒有逗號,所以不需加逗號,例:var(--padding, 10px 20px);

如用 CSS 語法表示 fallback 應用,請看以下範例:

CSS

至於這個東西可以怎麼用呢?我暫時也不太懂 XDDD,不過看了一些 CSS Variables 的介紹後,有人提到可以用來作為元件的樣式設定,例如用 fallback 設定元件初始樣式,變數則是當作元件的 hook。

以下做了一個簡單的範例給大家參考,希望可以給大家更多的靈感囉:

CSS
HTML


常見的 var() 錯誤寫法

使用 var() 時,有一些要特別注意的地方

1. var() 的位置

var() 只能設定值,不能作為屬性的變數,以下是錯誤寫法:

CSS

2. var() 不能直接合併單位

CSS

上述寫法並不等於marign-top: 20px,如果我們要這樣設定,必須改用calc()幫我們計算數值。

利用 calc() 計算數值

以前面提到的 margin-top: 20px 為例子,我們可以改寫為:

CSS

calc()是個很好用的計算工具,更多的介紹可以參考 W3C 的 calc() 文件


利用 JavaScript 讀寫 CSS 變數

最後,我們也可以使用 JS 來讀寫 CSS 變數的設定。

  • 讀取:getPropertyValue()
  • 寫入:setProperty()

請直接看以下語法與範例介紹:

JS

使用 Codepen 觀看效果時,記得把第 8 行的註解打開以看不同的效果:


已經很習慣使用預處理器的朋友,可能會對 CSS 變數有所疑問:「我用 SASS 或 LESS 不就好了嗎?」

當然,這些預處理器推出的原意,就是為了補足 CSS 本身的不足,如果今天原生的 CSS 提供了變數的功能,我還是很樂意去了解以及使用,如果一味使用預處理器而不去管原生的 CSS 推出了什麼改變,不覺得有點本末倒置嗎 XDDD。

另外在 W3C 文件裡,也有提到 CSS 變數其實有很多變化,例如以下這段語法:

CSS

雖然我不知道這段語法該怎麼運用,但是從文件看來,這段語法應該是正確且可以跟 JavaScript 有所連結的。這樣看來 CSS 變數真的可以延伸出很多有趣的東西,這些改變都令我非常期待 XD。

也能參考 Google Developers 有趣的一段敘述

While this would not be useful as a variable, as it would be invalid in any normal property, it could potentially be read and acted upon with JavaScript at runtime. This means custom properties have the potential to unlock all kinds of interesting techniques not currently possible with today’s CSS preprocessors. So if you’re thinking 「yawn I have SASS so who cares…」 then take a second look! These are not the variables you’re used to working with.
CSS Variables: Why Should You Care?

以上,希望大家會喜歡這次的介紹囉,有任何問題都可以留言給我 ❤️

參考資料:

用 Bootstrap 3 製作高度相同的 div (column)

排版網頁時,常常會碰到的一個需求,就是希望左右欄位的高度可以相同。而讓欄位的高度相同已經不是什麼新奇的事了,所以今天要分享的是,當你使用 Bootstrap Grid 製作網頁時,該如何將這個效果套用在 Bootstrap 裡。

會想分享這樣的內容,也是因為之前在上 RWD 入門與實戰時,有同學問過這樣的問題。所以就寫成一篇文章分享給大家囉!


使用 flex 讓 column 高度相同

第一個最簡單的方法,就是使用 display: flex 讓所有欄位的高度相同。但 flex 有一個令人哀傷的事實:他不支援 IE9 以下的瀏覽器。但我想 flex 一定是未來排版的主流,所以一樣分享給大家。

你可以從範例語法的 Before 以及 After 看到前後差異。

而我只有在row裡面加上一行語法,即可做到該效果:

CSS

正常情況下,Bootstrap 一行最多容納 12 columns,但如果使用display: flex,同一個rowcol-*總數超過了 12,他們一樣會維持在同一行內,寬度也會自動均分。這是除了瀏覽器相容外,還需要特別注意的一件事。

使用 table 讓 column 高度相同

古早以前如果希望欄位的高度相同,用table不失為一個好方法,雖然現在我們不再使用表格做排版,但依然可以使用display: table將所有標籤的型態作轉換。

此外display: table的瀏覽器支援度很好,雖然語法較多,但是考量到 IE9 以下的兼容的話,推薦大家使用該方法。

Bootstrap 有 row 以及 column 的設定,所以在結構上很適合加入display: table,不需要再給予多餘的 DIV:

CSS

☞ 補充

  • 使用display: table之後,寬度會等於行內元素(inline elements),因此記得要加上width: 100%;讓寬度等於父層的寬度。
  • 記得在col-*將所有浮動給移除(float: none),不然display: table不會有作用。

以上兩種方法好記又方便,如果搭配 Bootstrap,也不需要增加額外的 DIV 標籤,希望大家會喜歡囉~

codyhouse 的 tooltip 線上教學筆記與心得

剛剛收到一封 codyhouse 的線上課程通知,這一期他們推廣的是 CSS animation 應用,好奇點進去後發現有一堂課程是免費的,所以就打開來聽聽看啦 ~

▼ 有 play 可以選的 tooltip 就是這期的免費課程啦

花了半小時聽完後覺得受益良多,雖然講者的口音有點重,但可以把影片字幕打開,也可以直接看程式碼,聽完之後也是對其他付費課程有所心動 XD,非常棒的行銷手法呢,先試聽一堂課喜歡再買 😀

因為他的 youtube 影片連結是公開的,所以我也放一份在我的 blog 裡面,以下是自己聽完做的一些筆記跟重點,很多語法我自己也已實作了,所以看到國外講師也是這樣寫覺得很開心 😊

總之我覺得不錯的語法都會重點摘錄出來給大家參考,希望對你們有所幫助 🌹

筆記與心得

  • aria-hidden:HTML5 語意,用於屏幕閱讀器的,幫助殘障人士更好的訪問網站。(參考來源)
  • 萬年水平垂直置中的另一種方法:
CSS
  • 文字如果要垂直置中,可以將height以及line-height設定成一樣的高度,但文字必須維持一行才有用。
  • 如果不希望hover影響隱藏的元素,可以改用visibility: hidden將元素隱藏,這樣滑鼠移過之後也不會啟動hover效果
  • visibility可以用在transition,但display不行
  • 假設元素的寬度是50px可以善用calc(50% - 25px)將元素置中
  • 利用偽元素製作三角形:
CSS

偶爾聽聽外國人的線上課程也很棒,可以學到很多不一樣的寫法以及詮釋的方法,codyhouse 的範例跟教學品質都很棒,有興趣可以連回他們的網站看更多資料唷: https://codyhouse.co/

讓 Facebook 社交小工具(Page Plugin)能有 RWD 的效果


Facebook 的 Page Plugin (原先的 like box)預設沒有提供 RWD 的效果,如果希望小工具也可以用 RWD 效果的話,可以在 CSS 加入以下程式碼:

CSS

語法來源:http://stackoverflow.com/questions/10656038/how-to-make-the-facebook-like-box-responsive

從 CSS sprite 進化到 SVG sprite

很久沒寫文章了,今天想跟大家分享 CSS sprite、Web icon font,以及 SVG sprite 這幾個東西的使用經驗。

這三個東西,雖然看似毫無關聯,但隱隱約約還是有種「進化」的感覺,如果你還在使用 CSS sprite 的技術,歡迎參考一下這篇文章,試著玩玩 Icon font 或 SVG sprite,瞭解並感受一下他們的特別之處吧 😄

CSS Sprite

當我們瞭解到每讀取一張圖,就會佔用一個 HTTP 需求時,我們改用 CSS sprite。
我們將所有網站會用到的 icon,全部集合起來放在同一張圖片裡,利用 class 再搭配 background-position 幫圖片做定位,就做到了 CSS sprite 的技術啦。

圖片取自 smashingmagazine

雖然可以有效減少 HTTP 需求,但他終究是圖片,只要把網站等比放大,圖片就可能會失真。在現今螢幕解析度提高,以及 RWD 網站盛行的環境下,用 CSS sprite 要面對的可能就是這種失真的小瑕疵。

另外一個比較惱人的困擾,就是要把所有的 icon 排在同一張圖片,再自己算出定位,其實很麻煩。雖然可以使用 compass 這樣的 CSS 預處理器幫忙,但也不是所有人都用 compass 啊 😊。


Web Icon Font

因為種種的因素,我們改用了另外一個技術:Web Icon Font (以下簡稱 icon font),我們利用一些字體文件,將文字轉成圖片。好處是解決了「失真」的困擾,因為即使放大縮小,它的本質還是文字,文字放大縮小是不會失真的,可以保持它原有的清晰度。

但困擾來了,正因為他是文字,所以必須乖乖遵守文字的規範,我們常碰到的問題就是在「鋸齒」與「抗拒齒」之間徘徊,通常瀏覽器都會替文字進行抗拒齒的優化,以免放大閱讀文字時,會有凹凸不平的鋸齒狀,有的時候,某些圖標我們需要這些鋸齒,但另外一些圖片我們需要抗鋸齒,線段類的圖案、圓弧狀的圖案 … 等等,會依照不同的樣式有不同的需求。

而且除了瀏覽器外,不同系統 (WIN, iOS)針對文字的抗拒齒演算法也不同,如果真的要錙銖必較的去調校,應該會調整的天荒地老。

當然,這篇文章不是要一味地告訴大家 Icon Font 的缺點,畢竟我自己也還在用 Icon Font XDD。

這種細微的的改變,一般肉眼看不太出來,而且在解析度較高的裝置觀看,這問題才會比較明顯。如果真的發生類似的問題,我們可以用font-smooth去調整:

CSS
CSS

但誠如 MDN 說的: this is non-standard and should not be used. (他們不是標準格式,不推薦使用在專案上)。

因此,如果真的有這類問題需要解決,我們可以改使用 SVG sprite。 Icon font 還有其他不方便的地方,例如受到font-size, line-height..等等字型屬性的限制。一次要載入上百張 Icon font 的字型檔,但實際上用到的只是那幾張小圖,浪費了讀取的時間。最後還有一點是各家的 Icon font 整合不易.. 等。 當然還是有一些網站服務可以解決部分問題,所以這邊只是把會碰到的狀況列出來,就不再細談了。


SVG sprite

在介紹 Icon font 文末提到有「網站服務」可解決部分問題,而這個網站也是我要介紹給大家的,就是 IcoMoon,他是一個整合眾家 Icon font 的網站,此外也支援 SVG 匯出。

該如何使用它?這邊不再贅述,我們只談 SVG sprite 的功能。

怎麼使用 SVG

在講 SVG sprite 之前,還是先簡單講一下什麼是 SVG 吧 XDDD。其實對我而言,SVG 的定義很簡單,就是用程式碼畫圖,這句話傳達了兩個意思:一、你必須要寫程式碼;二、他是不會失真的向量圖。

透過以上範例,你會發現這張圖片所有的線段(<path></path>)都是寫在 HTML 裡面,然後再利用 CSS 屬性去修改它的顏色、大小… 等樣式。

每一張圖片都有一個自己的<path></path>或者<circle></circle> … 這樣的屬性,通常會寫在網頁的最上方,再利用<use xlink:href="#icon-video-camera"></use>呼叫他。

雖然使用 SVG 可以有效解決解析度、鋸齒 … 等等這些問題,但參考我們上述語法,應該會發現,如果要載入多張不同的圖片,程式碼會拖得很長。為了解決這個問題,我們可以改用 SVG sprite,也就是將所有圖片存在 SVG 檔案,再從 HTML 呼叫他。

SVG sprite 實作

以 IcoMoon 網站為例,先選好你要的圖片,在匯出 SVG 之前勾選 Include Tiles (CSS Sprite)

解壓縮之後,找到sprite/目錄,裡面有一個sprite.svg,原理就跟 sprite.png 一樣,會把所有圖案排列整齊,差別在於它是向量圖,放大縮小都不會失真。

接下來只要在 HTML 載入這張 SVG 檔案,並且透過ID去呼叫對應的 icon 就可以了。

HTML

xlink:href的地方,就輸入這個 svg 檔案的相對路徑,後面再寫 ID 即可,跟 CSS sprite 相比是不是簡單很多呢。我們不需要再寫background-position去調整他的位子,往後要新增其他的 icon,直接打開 sprite.svg 編輯就可以啦!

因為 svg 目前不支援絕對路徑,所以我沒辦法直接放在 codepen 讓大家看,因此另外做了一份頁面,請參考 🌍 範例網頁觀看效果,也歡迎使用 dev tools 玩玩看。

➡️ 範例:SVG sprite HTML demo

使用 IcoMoon 的 SVG sprite 注意事項

因為 IcoMoon 可以直接提供我們 SVG 的 path 程式碼,而且可以個別匯出,所以我用 IcoMoon 舉例。但如果你以後想用 IcoMoon 做 SVG sprite,請特別注意一件事情,就是你可能需要自行修改它的 SVG 檔案。

什麼意思呢?因為 IcoMoon 把 icon 的顏色、大小都寫死在 SVG 檔案裡,而且我覺得不是很好管理。

icon-facebook為例,IcoMoon 是這樣寫的:

HTML

以下是我修改後的語法:

HTML

你可以發現我改用 <symbol></symbol> 管理 icon,並且移除了他們固定的樣式。

如果不把 IcoMoon 寫的樣式移除,我們將無法用 CSS 控制這些樣式,所以請特別記住這一點!

我也有把 IcoMoon 跟我修改後的 SVG 檔案放到網站上,大家可以自行打開原始碼比對。

以上跟大家介紹 SVG sprite 的使用方法,以及該怎麼管理。希望對大家有所幫助囉

用 css 讓區塊水平垂直置中

有時候我們需要做個前導頁或是簡單的名片形象頁,在內容不多的情況下,可能需要讓 DIV 垂直以及水平置中;除了 DIV 外,甚至連文字也需要垂直與水平置中。

就如同下圖範例,這是一個很簡單的名片形象頁,深灰色底是一個 DIV。可以看到除了 DIV 之外,文字也是垂直水平置中。

另外當你移動畫面時,他也會固定在畫面中央,不會因為視窗縮放而有任何跑版情況。(線上 DEMO 網址:http://codepen.io/mukiwu/full/Iuncz/

看起來很難的效果,其實只要短短幾行語法就能達成。就讓我們一步一步的拆解吧 🙂


DIV 垂直水平置中

先跟大家分享一張非常清楚的圖解,取自 Smashing Magazine 的大作。

(圖片來源:smashingmagazine

如圖所示,不管該元素(DIV)多大,我們都可以先用position: absolute 讓元素放在中央。

CSS

但事情可沒那麼簡單,利用absolute調整位子的基準,是從該元素的「左上角」開始算起。所以如果在 X 以及 Y 軸各設 50%,是針對元素左上角(紅色點)的 50%


▼ 因此該元素(DIV)位子會掉到淺灰色區塊的地方,但是紅點剛好在畫面正中央。

我們必須要再給予元素明確的高與寬,利用margin-top以及margin-left把元素往回推。往回推的數值就是(高/2)以及(寬/2)。如果高是300px,就往回推150px,依此類推。

最後垂直置中的程式碼會如下所示:

CSS

文字垂直水平置中

想讓文字水平置中,只要寫text-align:center就可以囉!算是置中規則裡最簡單的一種。

而垂直置中卻沒那麼直覺,單純寫上vertical-align:middle,瀏覽器是不會鳥你的。

垂直置中有很多種解法,今天跟大家分享其中一種,透過display改變元素的形態,進而讓垂直置中有用。

HTML 必須要有一組二層的巢狀結構:

HTML

利用 CSS 修改display

CSS

使用這種方法就可以讓文字垂直置中囉 ~。

延伸閱讀:In the Woods 有提供更多種垂直置中的解法,好處與壞處也寫得很詳細,可以參考看看。

最後你也可以將兩種垂直置中的效果合併在一起,完整的程式碼請參考我的 DEMO:http://codepen.io/mukiwu/full/Iuncz/