在網頁上面的所有元件,其實都可以看作一個方塊,每個元件其實應該都有個看不見的框與看不見的內部留白、外部留白等部份。 以 W3C 的官方文件來說,如下圖所示,會有這麼多奇怪 的名詞,包括 margin, border, padding 與 width 喔!
根據上圖的樣式,稍微來定義一下這些 CSS 方塊屬性的意義,請看上圖的 LM, LB, LP, Content, RP, RB, RM 的部份:
所以,若以整個方塊的總寬度來說,他應該要具有 LM+LB+LP+width+RP+RB+RM 才對!所以在設定方塊的寬度時,不要以為他跟週邊其他元素無關, 其實還有 margin 這個東西喔!所以整個方塊最外層其實是那個看不到的粗虛線才是最遠的留白邊界 (但是,沒有顯示出來,所以稱為外部留白啊! 讀者需要自行想像有個看不到的邊界的存在,這樣才好理解。)
至於經常使用於方塊模型的 CSS 屬性有底下這些:所有的區塊標記,包括 p, h1, blockquote, pre 等等,都可以使用上述的屬性。如果你想要進行的是排版方面的設計,而不是與『語意』有關的資訊, 那可以使用 <div> 來設計即可!
讀者可以先不要設定任何屬性,查看原本的網頁格式後,再加上這些屬性,查閱一下彼此的差異性,會比較有感覺。當然,還有很多可以使用的屬性, 可以慢慢處理處理。
例題 5.1.A 提到的是方塊左側留白,那如果整體寬度佔用 85% 的寬度,然後要讓這個方塊置中呢?其實針對『區塊標記(一定要是區塊標記才會生效)』的 margin 設計中, 你可以讓左、右兩邊 margin 自動平均分配 (auto) 即可讓方塊置中了!不要使用 <center> 喔!
所以說,方塊的置中請參考 margin 的設定,而方塊內的文件置中,則使用的是 text-align 喔!並不相同。
在 CSS3 當中,對於框線的特效中,加入了曲線的功能!同時,也有加入陰影的特效喔!
方塊的陰影 (box-shadow) 可以用在滑鼠移入時的吸睛效果,不過也不要漫無目的的加入,太多特效有時會讓你的文章重點消失!那就不好了。 此外,元素出現的順序是有差別的,所以你需要先 border: xxx 之後,才加上 border-left: xxx,如此一來,左側的粗框才不會被覆蓋!
讀者們如果曾經考過早期的丙級網頁設計,裡面有些題目會要你疊代圖片,有一張有框的底圖,然後讓你將圖片放在這個底圖框後,在予以儲存成新照片。現在我們可以使用底圖配合圖檔來完成即可。但是,有個問題,那就是框的寬、高經常會變動,因此固定的那張底圖無法適用在所有的方塊內。那怎辦? 沒關係,CSS3 提供了 border-image 來給大家使用。
基本上,你應該要先製作出一個九宮格樣式的圖示,最好是去背的圖示,所以可能得要用 PNG 的圖示比較妥當。底下就是一個九宮格圖片的範本, 圓形的部份預設會作為方塊的四個角,而菱形的部份則預設會是框線的形式。
簡易的 photoimpact 去背方式:
上圖的影像尺寸為 90px X 90px,也就是說,拆成九宮格的話,那麼每個九宮格內的小格子就會是 30px X 30px 了!此外,既然你要將框線做個裝飾, 那麼自然需要有『框線的厚度設定』才行!通常框線厚度也得要設定個 15px 以上吧!好了,那麼 border-image 有哪些可用的屬性呢? 會用到的大概有底下這些:
上述的題目中,你可以自行調整 border-image-slice 以及 border-image-repeat,以了解各種設定值之間的差異喔!
一般來說,方塊都是屬於 block 元素,因此整個方塊會佔滿整體瀏覽的寬度。即使你設定了身為 block 元素的方塊寬度,那左、右側的空間, 還是會以留白來作為做後的判斷,而不會填充其他的元素。那該如何處理讓兩個方塊平行出現呢?最簡單的方法,就是透過 display: inline-block 即可!
上面這個範例中,最後雖然可以讓方塊合在同一個水平線上,但因為方塊寬度使用的是百分比單位,所以當你拉動瀏覽器視窗時, 可能會出現照片超出框線的問題~另外,預設的方塊對齊方式,是靠近底部對齊,而不是靠近上方對齊, 所以就會出現畫面中的狀態。那為啥底部的線段沒有對齊呢?這是因為圖片裡面最終並沒有使用 p ,因此沒有一行的留白, 而文字裡面使用 p ,因此就會有一行的留白,就導致感覺上底部沒有對齊的假象。
以上個例題為例,如果我想要讓排版不會跑掉,該如何是好?基本上,你可以嘗試這樣做:
方塊的陰影 (box-shadow) 可以用在滑鼠移入時的吸睛效果,不過也不要漫無目的的加入,太多特效有時會讓你的文章重點消失!那就不好了。 此外,元素出現的順序是有差別的,所以你需要先 border: xxx 之後,才加上 border-left: xxx,如此一來,左側的粗框才不會被覆蓋!
讀者們應該會覺得很奇怪,一般版面的排版中,都是從左由右,從上而下的對齊排版才對,怎麼上面兩個例題都是最底下對齊呢?這點剛剛有講過原因了, 因為同一直線上面的物件預設是底部對齊的關係。那如果想要靠上對齊呢?最簡單的方法,就是透過 vertical-align 這個玩意兒即可,他會讓你的對齊變成以上方邊界為對齊的角度。
請注意,沒有 vertical-align 時,排版預設為 baseline 的排版,若是需要搭配 vertical-align 來向上對齊時,你得要注意,這個設定值是影響『被設定的方塊本身』, 與上層父元素的關係是,會讓被設定的元件對齊到父元素的最上方喔! 所以,如果 unit05-2-2.html 想要做成靠上方對齊,應該是要增加那一個設定值在哪個方塊內呢?
方塊的陰影 (box-shadow) 可以用在滑鼠移入時的吸睛效果,不過也不要漫無目的的加入,太多特效有時會讓你的文章重點消失!那就不好了。 此外,元素出現的順序是有差別的,所以你需要先 border: xxx 之後,才加上 border-left: xxx,如此一來,左側的粗框才不會被覆蓋!
如果你對於使用 vertical-align 並不是很滿意,那麼你可以使用讓方塊漂浮 (float) 的方式來處理喔!所謂的漂浮,就是讓子元素在父元素上面浮動, 而不會跟隨文字出現的順序來排版的意思。因此,這個漂浮的子元素,將會把其他元件『推開』的感覺。基本上, float 可以有的屬性值有:
很多網頁都以此方式來進行兩欄或三欄排版的對齊。只不過有個問題,那就是,如果你的父元素有類似底色或底圖的樣式時, 那麼這些父元素樣式很可能會不見!原因是因為你的子元素漂浮起來,則父元素的總高就不會考慮這個子元素的影響。以本例題為例, 父元素裡面只有這兩個子元素,這兩個子元素又全部都漂浮起來,因此父元素的內容就是空的!所以,高度當然就不見了!這經常會造成些許問題。怎麼辦呢?可以透過 overflow 這個溢流屬性來處理喔!
我們在本堂課前幾個小節提到過內部留白與外部留白,那外部留白 (margin) 的正值是可以往外推,舉例來說,當你的 margin-left 是正值, 代表你的方塊會被往右推。往右合理啊~因為原本網頁的元件就是從左到右的。那如果你的方塊想要往左移動呢?這時可以將 margin-left 設定為負值, 此時方塊就會往左推~只是,方塊可能就會『覆蓋掉左側的元素』喔!
在網頁的預設情況下,如果有元素互相重疊的話,那麼後出現的將會覆蓋較早出現的元素。如果你想要改變這種順序的話,可以加上 z-index 這個屬性。 不過, z-index 要能真實生效,得要加上 position 這個屬性才行。關於 position 等等再來說明,現在你只要加上 position: relative 這個設定就好。
正常的情況下,後面出現的元素會覆蓋掉前面出現的元素。可以透過 z-index 來修改圖層的顯示順序!
我們知道,在網頁的正常情況底下,所有的區塊元素 (block) 都會佔滿整個橫列空間,即使你給的寬度變小,小到右側可以容納系一個元素,但是, 正常情況下,區塊元素就是會自己佔用一整個橫列區塊,所以新的區塊還是會在下一行出現,不會出現在你給的小寬度的那個元件的右邊。
如果需要修訂這個問題,隨意改變區塊或方塊出現的位置時,就得要考量到這個區塊與週邊或父元素或瀏覽器之間的關係了。這時你就得要透過 position (位置) 這個屬性的協助:
會加入 position 就是希望自己能夠調整版面的,因此就會需要上、下、左、右各個方向的留白距離。不過不同的屬性值參考座標是不同的!如同上面的說明, 參考座標簡略說明如下:
當然我們知道任何物件的原點在瀏覽器的環境下,就是左上角那一點~。讓我們來玩一玩這個位置產生的效果!同時透過底下的練習了解一下網路線等級的意義喔!
上面的練習是一個簡易的三欄排版的實做方式,只要將框線拿掉,就可以作為一個排版的樣式了。不過這不是本節課的重點,本節課的重點在討論 position 的用法喔! 現在讓我們來了解一下相對於目前這個正常位置的版面移動方式,就是 relative 的移動方式:
由上面這個練習我們可以知道 relative 的動作是僅有自己的位置會變動,就不會影響到原本的元素的排版!所以只有自己要變動時, 或者是你已經知道既有的版面配置型態時,若有更動某個特定的元素,就用 relative 吧!
在某些父元素的方塊已經有固定寬、高的情況底下,你想要讓特定元素依據你的特殊需求出現在任意的地方時,建議使用依據父元素原點為參考座標的絕對位置 (absolute) 來處理比較妥當!舉例來說,如果 box1, box2, box3 是互相稍微重疊的情況,那可以這樣做:
你會發現對於子元素出現的位置來說,子元素可以跳脫父元素的牢籠,而且不會讓父元素管制~除非父元素指定了 visibility 或者是 overflow..., 否則子元素可以出現在任何你想要它出現的地方了。這對於下拉式選單的製作相當有幫助!尤其可以跳脫父元素的框架。不過,如果要用到下拉式選單的時候, 記得可能要給予 z-index 的圖層大一點,否則選單容易被後面出現的元素擋住喔!
如果你想要在畫面的正中央最下方處增加一個寬高為 70 像素 X 30 像素的方框,這個方框裡面出現 Top 的字樣,且連結到本頁的最上方, 這個方塊永遠都存在畫面中,可以怎麼做呢?這時就得要使用 fixed 的位置囉!
許多網站會有一些特殊功能的方塊放置在某些特定的角落,例如上面例題的回到頁首的功能,就可以使用 fixed。像是 FB 的導覽列, 或者是頁尾宣告列,都是使用 fixed 固定的呢!但是你不要隨意使用這個項目喔!因為你的客戶群不見得喜歡畫面被擋住! 以上題為例,中央部份如果有文字,就會被擋住啦!
這一個小節我們從 float 到 margin 到使用 position 的方式來進行排版,那麼,哪一種方式最適合呢?其實還是因各種版面配置的問題,而有不同的選擇:
總之,記得,某些按鈕、選單的設計情況下,使用的可能是 absolute 或 fixed,若是一般欄位的排版,大概就是 relative 與 float 來協同處理即可。 如果需要欄位整體寬度固定,就使用 width, height 搭配像素,如果欄位寬度是可變動的,那使用 min-width, min-height 搭配百分比或像素, 應該就可以完成你所需要的版面型態了。
由於某些特定版面規劃的關係,你可能只會用到某個固定寬高的空間 (父元素空間受限),但是這個空間要塞入的東西太多 (子元素物件太多), 在網頁預設的情況下,所有的子元素物件會跑出父元素的框框之外,這個情況就稱為溢出 (overflow)。在 overflow 屬性的預設值為 visible, 意思就是可以在父元素外頭被瞧見的意思。那 overflow 還有哪些屬性值?
讓我們以底下的例子來說明一下 overflow 的用法:
單純加上 boxall 的寬、高的框線之後,你會發現到最外框的 page 類別竟然高度也減小了!然後,文字竟然可以超出框線之外, 這就是預設的 overflow: visible 的屬性值關係。若分別在 box1, box2, box3 上面加上不同的 overflow 之後,就可以了解到差異囉! 那個 hidden 最是有趣!可以將多出來的資料隱藏,也不會出現拉條~就是讓你看不見囉!
讀者應該常常會在一些研討會的網站上面看到很多圓形的大頭貼圖示,您應該不會想說,那個圓形圖是用圖形編輯軟體去編輯的吧?當然不需要啊!只要提供預設大頭照的照片,搭配 CSS 的方塊就可以達成這個目的了!
首先來想想,怎麼創造出一個圓形方塊呢?假設有個 300x300 像素的方塊,你要讓這個方塊變成圓形怎麼做? 很簡單啊!給了方塊寬、高之後,讓四個角都呈現圓形即可~那半徑設定多少?當然就是 150 像素啊!剛好是 300x300 的中心點! 非常簡單!
<div class="bighead"> <img src="images/圖片名稱.jpg" /> </div>
未來,只要將 .bighead 以及 .bighead img 的設定放入 overall.css 當中,那你就可以直接透過上面的方式來呼叫圓形大頭照了!當然, 後續你要加上什麼特效就自己決定囉!
承接上個例題,我們知道超出框線的部份可以透過 overflow 來進行是否要呈現在網頁上的處理。那如果你就是要將正常顯示的東西暫時隱藏呢? 可以怎麼做呢?基本上,有兩種作法喔!
display: none 與 visibility: hidden 都是隱藏,有什麼不同呢?這在本質上不太一樣喔!display: none 代表『這個元素不要出現在網頁上』的意思, 亦即該空間會變成不存在,因此後面出現的元件會使用到這個空間喔!那麼 visibility: hidden 呢?元素所在的空間會被保留下來,只是內容元素會被隱藏而已, 這兩個意義大不相同啊!
如果是使用在類似 fixed 或 absolute 這種與週邊的元素位置無關的屬性設定時,那麼這兩個設定差異就不會差太多~不過因為 visibility 未來可以搭配動畫特效, display: none 則單純方塊出現,無法設計某些特別的特效,因此建議還是使用 visibility 比較好。當然,如果是要整個父元素都不見, 那當然就是使用 display: none 較佳!
你可以透過 :hover 滑鼠特效,搭配 visibility 先將答案隱藏後,就可以讓使用者在不同的畫面中查看答案了! 其實上面的設計可能還沒有完整符合你的需求,讀者們可以發揮自己的創意,修改成各式各樣的展示喔!包括滑鼠指到 A, B, C 上面才顯示答案, 而不是移動滑鼠到下方的方塊上!
visibility 指的是整個元素是否需要隱藏,而 overflow 則指的是『超出父元素的資料部份』而已,兩者並不相同!因此, 例題 5.4.A 使用的是 overflow (因為還是有部份資料需要輸出),而例題 5.4.C 則是使用 visibility,因為要先隱藏答案才好!