博客園的人民不能夠自己自由地設計博客的靜態HTML頁面,除非你的作品得到博客園的審核通過,然后作為共享模版供廣大博客園人民選擇使用。但博客園已有的100多套模版里,大多能滿足靜態HTML頁面的選擇要求。另外,博客園的模版都有既定的CSS樣式,這一點也得考慮在內。綜合考量,進入博客管理設置,這里選擇一款叫做“LessIsMore”的模版。從下圖可以看出,這個模版作為自定義樣式的基礎還是很不錯的。
由於已經選好了一個有利於自定義樣式的模版,再結合瀏覽器的開發者工具,自定義頁面的配色總的來說還是比較容易的,但個別地方(如代碼塊內)的樣式都是在HTML頁面元素的style屬性里定義的,沒有類和ID屬性,由JavaScript自動生成,自定義樣式很困難,只能在不影響可訪問性的情況下,退而求其次。另外,我對有的地方字體、字體大小、背景顏色做了調整,有的地方添加了邊框和陰影效果,有的地方進行了 margin、padding 的微調。下面是具體的CSS代碼:
/*------CSS Code-----------------------------------*/ #navigator { background: #666; } #navList { font-size: 16px; } .blogStats { font-size: 12px; } #sideBar { width: 20%; border: none; padding: 0; } #sideBar h3 { padding-left: 8px; background-color: #666; } #sideBarMain { padding-left: 8px; } body { background-color: #333; color: #fff; font-size: 14px; } h1, h2, h3, h4, h5, h6, th, .feedbackCon, .blogStats { color: #fff; } #main { border: 1px solid #e5e5e5; } .day { margin: 20px 0px; } .postTitle { padding-left: 20px; font-size: 16px; border-bottom-color: #666; } .postBody, .postCon { padding: 0px 20px 10px; border-bottom: 1px solid #666; } .postDesc { padding-right: 20px; } a, .postCon a, .postBody a, .feedbackCon a { color: #0dd; } a:hover, a:active, a:focus { color: #ff8; text-decoration: none; } #navigator, #MySignature, .day, .post { border: 1px solid #e5e5e5; border-radius: 8px; box-shadow: 2px 2px 10px #aaa; } #navigator { border-radius: 8px 8px 0px 0px; } .post { border-right: none; border-top: none; border-radius: 0px 0px 8px 8px; padding-top: 1px; } .cnblogs_code, .cnblogs_code div { color: #000; font-family: consolas, monospace, sans-serif; }
3.布局
3.1 水平居中
整體水平居中最常用的方法是,將body內要居中的所有內容放在一個容器元素中,這個容器作為body的子元素,然后對這個容器進行水平居中。在選擇的“LessIsMore”模版中,id為home的div滿足這個容器的要求。下面是水平居中的CSS代碼:
body { /*其它主要瀏覽器不需要這個樣式, 但在IE6/7居中是必須的*/ text-align:center; } #home { /*margin: 0px auto;可以使內容在除IE6/7外的其它 主要瀏覽器內居中*/ margin: 0px auto; /*因為body的text-align:center;樣式具有繼承性, 所以要重置文本向左對齊*/ text-align:left; max-width:960px; }
3.2 導航條的改進
“LessIsMore”模版的導航條默認樣式是,將導航條內的每一項li進行左浮動,名為.blogStats的div進行右浮動,顯示設置導航條容器的div的高度來防止浮動造成的導航容器塌陷無高度。我覺得沒必要將li都進行左浮動,只需將其display:inline即可,然后將ul與名為.blogStats的div分別進行左浮動和右浮動即可。最后,最好清除浮動,使作為導航容器的div可以包裹住里面的內容。CSS代碼如下:
#navigator { height:auto; overflow:hidden; *zoom:1;} /*名為.blogStats的div在選擇的模板中已經進行了右浮動 不必再進行設置*/ #navList { float:left; } #navList li { display: inline; float: none; }
3.3.1 模版的默認實現
我發現博客園的很多皮膚模板以及廣大博客園人民使用或自定義的皮膚,要么主內容與側邊欄都是固定寬度,要么側邊欄固定寬度主內容自適應寬度。好像沒有側邊欄與主內容都是非固定寬度的,這樣很不利於頁面縮放。
#mainContent { width: 100%; margin-left: -250px; float: right; } #sideBar { width: 220px; float: left; } .forFlow { margin-left:266px; }
流體布局的核心是采用百分比定義列的寬度,在使用浮動實現多列布局的情況下,每列都要以百分比定義寬度(或者部分列使用百分比為單位的水平外邊距),只要所有列的總寬(這要考慮盒模型的總寬,而不僅僅是內容的寬度)不超過100%,頁面放大的時候不會出現水平滾動條,這正是我需要的結果。
啰嗦了這么多,其實實現的代碼很少,如下:
#sideBar { width: 20%; } #mainContent { margin-left: auto; width:78%; } .forFlow { margin:auto; }
4.1 為什么要響應式布局和媒體查詢
為什么要響應式布局和媒體查詢?因為自從智能手機和平板電腦發展起來以后,他們的屏幕雖然不大,但分辨率越來越高!這導致在這些設備上,網頁上的內容會看起來會很小,甚至看不清楚,不利於閱讀。雖然可以進行縮放,但總是讓用戶每當打開一個網頁都要縮放顯然是比較差的設計體驗。再者,多列布局的網頁在這些小屏幕設備上看起來很是細長,也是不利於閱讀的。下面是通過Opera Mobile Emulator模擬 ASUS Nexus 7 瀏覽我的博客在應用媒體查詢前后的對比:
下面是通過Opera Mobile Emulator模擬 Samsung Galaxy S III 瀏覽我的博客在應用媒體查詢前后的對比:
圖:左圖為應用媒體查詢前,右圖為應用媒體查詢后
通過對比,發現應用了媒體查詢后確實比之前顯示效果好很多。
響應式布局所依賴的核心技術是CSS媒體查詢。它可以通過@viewport規則定義視窗區域以設備的物理尺寸為基准,從而解決小屏幕高分辨率下頁面內容顯示小的問題。可惜的是,目前實現這一規則的瀏覽器不多,WP8上的IE10和較新版的Opera瀏覽器實現或部分實現了這個規則。對於Android和iOS等設備上的常用瀏覽器,需要通過HTML內的<meta>標簽來實現相同的目的。這個<meta>標簽的聲明如下:
<!--HTML Code--> <meta name="viewport" content="width=device-width, initial-scale=1.0">
對於我的博客布局,實現響應式布局的CSS代碼代碼很簡單,具體如下:
@-ms-viewport { width: device-width; } @media (max-width:990px) { #home{ margin:0 15px; } } @media (max-width:640px) { #sideBar, #mainContent{ width:100%;} .post{ border-left:none; } }
<script type="text/javascript"> $(document).ready(function () { var meta = document.createElement("meta"); meta.name = "viewport"; meta.content = "width=device-width, initial-scale=1.0"; $('head').prepend(meta); }); </script>
4.4 響應式布局的缺點與改進
使用4.3節介紹的方法實現了響應式布局,但響應式布局也有其缺點。當視窗區域寬度較小時,響應式整個頁面的兩列布局變成了一列,側邊欄被布局到博客的底部。若博客內容很長, 想到達側邊欄就需要多次翻頁。這也是不利於內容訪問的。
如何克服這一缺點呢?我們可以在頁面的頂部(或者其他方便的地方) 提供一個跳轉錨點鏈接,使點擊這個鏈接的時候,可以直接跳轉到側邊欄。要實現這個功能,一個簡單的方法是,先在博客園后台管理設置頁首代碼,添加一個鏈接,如:
<a id="jumpToAside" href="#asideAnchor">跳至側欄</a>
然后,在博客園后台管理設置公告代碼,添加一個鏈接,如:
<a id="asideAnchor" name="asideAnchor"></a>
這樣,就可以克服了響應式布局的缺點,快速地訪問側邊欄。我為自己的博客實現了這個功能(跳轉鏈接應用了一些CSS樣式),看到這篇文章的你如果使用的是支持媒體查詢的瀏覽器,請將瀏覽器的寬度縮小到一定程度,會看到頁面右上角出現了文本內容為“跳至邊欄”的鏈接,點擊它,就可以直接跳轉到側邊欄了。如果你使用的是智能手機的豎屏瀏覽這篇博客,通常也能看到這個跳轉鏈接。
5.總結
經我用Chrome、IE10、FireFox、IETester和Opera Mobile Emulator測試,重新修改設計的博客皮膚在在大多數設備與瀏覽器上的顯示效果都還是挺不錯的。至少布局上比很多的博客園默認皮膚要好。但是,如果你正使用IE6瀏覽器瀏覽本篇博客,你將會看到一個比較丑陋的界面,因為博文中使用了寬度比較大的圖片,而IE6不支持max-width屬性,大圖片打破了布局。但如果你用IE6瀏覽我其它沒有特別大寬度圖片的博文,界面就會好很多。至於博客皮膚的其它的設計元素如何就只能根據個人的喜好而定了。現在我所使用的這個皮膚就是自己在本文所要實現的,有條件有興趣的朋友可以通過手機或者平板電腦瀏覽我的博客測試下效果。也可以使用支持媒體查詢的PC瀏覽器進行頁面縮放改變窗口寬度來測試效果。
當然,此刻,你所看到的我的博客的當前皮膚(模版)樣式不一定與本文中所述相一致,因為我隨時有可能修改博客使用的樣式。