響應式 Web 設計應該避免的錯誤

英文原文:Mistakes to Avoid With Responsive Web Design

開發一個帶有響應式交互設計的網站變得非常有意義,因為其可以在不同的設備運行,因此,你可以節約針對不同平臺開發不同網站的成本。但是,要做最大限度相應的網頁設計,有些錯誤你應當避免。

不要優先為桌面版設計

開發者通常會犯的一個常見錯誤是,但他們設計網站時優先考慮桌面版,因為在這些人嚴重,將基于桌面版的網站轉變為針對其他設備的響應式web設計是件很輕松愉快的事情。但是,這個發生在計劃規劃階段的錯誤本身會變成一個非常巨大的問題。甚至會造成返工,當然,大量的錯誤也會蔓延出來。
然而,基于移動設備開發網站看起來會消耗一些時間并且在剛開始會有些困難。這是因為它迫使你在包含什么內容上做出取舍,并且以一種你不習慣的方式去思考。然而,這樣做會使得內容和設計整體上更優秀。粗略來講,你可以首先嘗試在比較小的設備上。一旦你在手機上做出了不錯的設計,適配到更大的屏幕上會變得很輕松。

導航欄菜單的麻煩

當為移動端進行設計時,導航欄設計的問題可能會成為你的一個禍根,所以不得不避免產生麻煩。不想是固定寬度的設計,響應式設計的導航應當根據設備類型進行確定(所以智能手機的導航菜單可能和平板電腦,當然還有桌面版的導航菜單互有差異)。
許多設計者會發覺他們自己被這樣一項任務搞的很崩潰——嘗試設計一個可以適應所有屏幕的導航菜單。在很多情況下,設計者奮力將水平列表菜單轉換為垂直列表菜單,尤其是在適配較小的手機屏幕時。然而,由于該導航欄并不是根據屏幕進行設計,這可能會導致一項很差的用戶體驗。

不應隱藏內容

響應式設計通常會有更少的空間展示圖片和內容,但是這并不意味著你的內容應當被忽略。你不得不采取一種方式重新安排內容,使其能夠保證易讀性。這個比較容易實現,可以通過創建導航鏈接并且使用錨,是用戶在一個頁面中能看到他們一直在尋找的內容。那些通過CSS布局控制內容隱藏的應當明白,這些內容依然會被加載,因此,你通過為用戶提供完整的觀看體驗也沒什么大不了。簡單而言,用戶不應該由于他們所使用的設備而遭受開發者的“懲罰”。

單獨的移動端網站地址

單獨為移動端網站分配一個地址整個就是一個災難,這摧毀了我們起初交互設計的目的,并且是可以論證的。當用戶在訪問網站時,重定向到移動端版本,結果是不得不浪費了很多寶貴的時間。此外,這也能非常嚴重地影響到你的搜索排名。但是,理所當然,使用不同的URL也有許多優勢。它可以確保你能夠架構具有更輕便頁面的移動端網站,并且能夠在智能設備上表現更好。該站點也能照顧到在特定平臺上的性能和表現。不幸的是,具有單獨移動端網站地址的消極影響遠大于積極影響。

糟糕的用戶體驗

你不能簡單的把桌面版的內容壓縮成移動版;這么做將會影響你的用戶的體驗,用戶可能會拋棄你的產品。在手機的有限空間內創建一個友好的界面是十分重要的。你可以采取一些措施,比如,使用一個下拉菜單代替桌面上的導航條,這樣會節省你的空間。如果你先設計的是移動端,那么這通常不會是一個令人頭疼的問題。

不要忽視跨情景的公約

當你在做一個響應式的設計,你不能只考慮臺式和移動手機設備,你還應該考慮到其它類型的設備。人們可能會通過內嵌瀏覽器的智能電視或機頂盒來訪問你的網站。在現在,甚至掌上電腦都有不同的類型。但是,這并不意味著你可以為所有的設備創建一個相同的用戶界面,你最好是為不同的設備創建不同的網站。你所需要做的是創建一個響應導航和一個用戶容易理解的設計。創建的這個導航可以清楚的保存設備的上下文環境。

不要忽視頁面的加載時間

隨著寬帶的普及,網頁開發者開始習慣在頁面上大量的使用相對來說較大的資源。然而,當我們使用手機時,我們的用戶使用的是較慢的2G和3G網絡。同樣的,那些保持minf國際的用戶,他們是按使用的帶寬量來付費的。
一個頁面在臺式機上很快的加載進來,但是,在手機上加載一個頁面會花費很長時間或者去使用額外的、昂貴的帶寬。更糟糕的是,當用戶被迫去等待頁面加載時,即使是幾秒鐘,他們會離開這個頁面,同時你就會失去了你的流量

不要為觸摸屏設備開發

今天大多數手持的設備使用的是觸摸屏,甚至是很多筆記本也開始使用觸摸屏了。因此,當你設計響應式設計時,很重要的一點是不要忽略掉處理觸摸的重要性。有以下兩個方面原因:第一,可點擊項,比如按鈕要考慮到用戶的手指的大小(不要讓用戶縮放點擊)。第二,你要正確的處理觸摸事件。這么做可以克服300ms的點擊事件延遲。

使用CSS3的@media來實現網頁自適應

如今,電腦顯示器的屏幕分辨率向越來越大發展,而手機等移動設備終端的分辨率卻不可能大到哪里去。越來越多的網站,開始讓自己的頁面自適合各種分辨率,在小分辨率下顯示基本的內容,在大分辨率下顯示全部功能,甚至是分多等級的多版本。
作為web前端開發人員需要知道并且會用這種知識。

css2的@media

css2里面雖然支持@media屬性,但是能實現的功能比較少,一般只用做打印的時候做特殊定義的CSS。
語法: @media sMedia { sRules }
說明:
sMedia :  指定設備名稱。請參閱附錄:設備類型
sRules :  樣式表定義
指定樣式表規則用于指定的設備類型。請參閱link對象的media屬性(特性)。
示例:

  1. // 設置顯示器用字體尺寸
  2. @media screen {
  3. BODY {fontsize:12pt;}
  4. }
  5. // 設置打印機用字體尺寸
  6. @mediaprint{
  7. @import“print.css”
  8. BODY {fontsize:8pt;}
  9. }

css3的@media

@media 屬性在CSS3里面已經演變成一種 media queries(媒體查詢/匹配)了,在CSS3里面,可以用查詢語句來匹配各種類型的屏幕。
語法:@media :?{ sRules }
取值:

  1. <sMedia>:指定設備名稱。請參閱附錄:設備類型
  2. {sRules}:樣式表定義。

說明:
判斷媒介(對象)類型來實現不同的展現。此特性讓CSS可以更精確作用于不同的媒介類型,同一媒介的不同條件(分辨率、色數等等).

media_query:[only |not]?<media_type>[and]*
expression:(<media_feature>[:]?)
media_type: all | aural | braille | handheld |print| projection | screen | tty | tv | embossed
media_feature: width | min-width | max-width
| height | min-height | max-height
| device-width | min-device-width | max-device-width
| device-height | min-device-height | max-device-height
| device-aspect-ratio | min-device-aspect-ratio | max-device-aspect-ratio
| color | min-color | max-color
| color-index | min-color-index | max-color-index
| monochrome | min-monochrome | max-monochrome
| resolution | min-resolution | max-resolution
| scan | grid

解析
media_query:媒體查詢條件。包括了 only not and 這些經常在程序里面出現的邏輯判斷。
expression:表達式。媒體特征的匹配與否。
media_type:媒體的種類。包括了很多。
media_feature:媒體的特征。常用的是 min-width max-width 最小最大寬度的判斷。

DEMO(推薦在Chrome或者FIREFOX下打開,打開后,按快捷鍵“CTRL”+”+”,“CTRL”+”-”來縮放頁面):
使用CSS3的@media來實現網頁自適應的效果圖

CSS代碼

body{background:blue;}/*寬度500px-800px之間+高度100px-400px之間 藍色*/@media screen and(max-width:500px){body{background:green;}}/*寬度小于500px時 綠色*/@media screen and(min-width:800px){body{background:red;}}/*寬度大于800px時 紅色*/@media screen and(max-height:100px){body{background:yellow;}}/*高度小于100px時 黃色*/@media screen and(min-height:400px){body{background:pink;}}/*高度大于400px時 粉色*/

HTML代碼

效果演示,請縮小/擴大瀏覽器的窗口大小注意背景色的變化。邏輯如下:/*寬度500px-800px之間+高度100px-400px之間 藍色*//*寬度小于500px時 綠色*//*寬度大于800px時 紅色*//*高度小于100px時 黃色*//*高度大于400px時 粉色*/

demo演示地址:http://www.zjgsq.com/example?pid=1180

Bing的幾個嚴格限制成人內容顯示的國家

必應將某些國家/地區歸類為嚴格市場。在這些嚴格市場中,我們可能會限制成人內容的顯示(視當地的相關定義而定),而且由于當地習俗、規范和法律,我們可能將“安全搜索”設置限制為“嚴格”。設置為“嚴格”時,“安全搜索”對圖片、視頻和文字過濾色情搜索結果的顯示內容。限制為“嚴格”的市場包括:

  • 中國
  • 印度
  • 印度尼西亞
  • 朝鮮
  • 馬來西亞
  • 中東地區
  • 新加坡
  • 泰國
  • 土耳其

20個步驟呈現完美網站布局設計

  Claudio Guglieri 在紐約廣告公司 B-Reel 任職總監,他撰寫了本網站設計培訓指南,深圳網站建設貝爾利認為旨在幫助您了解設計網站布局的全過程。

  開始講述設計網站布局的主題之前,我想先分享自己多年從事設計工作中看到的一些常見錯誤,尤其是”網站設計培訓”中所述的實習生和新手們的通病。

  深圳網站建設貝爾利的本文羅列了打造完美網站布局的步驟,旨在涵蓋開始新項目前以及項目設計過程中的各項應知應會,適合數字廣告公司內就職的所有網站設計師新人閱讀。

  以下原則不僅包含各種設計細節,還提供了常規工作流程,從而幫助您出色地完成工作。遵循這些原則,您很快就能上手,設計出專業的網站布局。

  01. 先在紙上整理思緒

 initial sketch

  世界各處城市插圖系列簡筆

  此條顯然很重要,但是我經常發現一些設計師會跳過這步直接使用 Photoshop CS6 而不去思考他們需要解決的問題。設計的目的在于解決問題,而這些有待解決的問題無法通過漸變或陰影效果得到解決,而是需要完美的布局和清晰的結構。想一想內容、布局和功能,然后再開始上陰影效果。

  02. 從頂層框架草圖入手

 UX sketch

  草繪基本的框架將幫助你解決 UX 問題,并組織布局結構

  如果我要做一個項目的外觀和感覺,第一件事就是先建一個頂層框架,可解決所有設計問題。框架是指內容周圍的 UI,有助于執行操作并進行瀏覽。其中包括導航和各類組件,例如邊欄和底欄。

  如果你從這點著手設計,則設計主頁以外的部分時,布局內容將了然于心。

  03. 為 PSD 添加網格

 grid

  以 10 像素基線繪制的 978 網格示例

  這步操作非常簡單。在 Photoshop 中著手設計任何內容前,你需要創建一個合適的網格。這一步的道理眾所周知,如果你沒有這么做,我可以斷言,最后的設計總是無法盡善盡美。

  借助于網格,你能安排不同部分的布局結構;還能指導你按照特定屏幕尺寸要求進行設計,并能幫助你創建相應的模板,以便符合間距和其他設計問題。

  04. 選擇排版樣式

 typography

  根據常規經驗,一個網站布局中所用字型最好不要超過兩種

  了解不同的字型和配色是項目開發階段的工作。我建議一個網站中所用字型不要超過兩種,不過實際上,還需取決于你可用的色系。總之,所選字體需便于閱讀大量文字,且與標題和操作相映成趣。大膽使用大字體,并在使用字型時保持整體一致性和生動感。

  05. 選擇主題顏色

 colours

  使用有限的色階和色調以免產生視覺疲勞

  選完要使用的一系列字型后,你應開始研究 UI、背景和文本該用什么顏色。關于顏色,我建議在處理常規用戶界面是用色及色調需簡潔。

  根據元素功能在設計 UI 時保持一致性非常重要。想想 Facebook、Twitter、Quora 和 Vimeo 之類的網站布局。除 UI 外,插圖或圖形細節部分只要沒有干擾組件功能的話,在用色方面也沒什么限制。

  06. 劃分布局

 B-reel homepage

  網站結構越簡單,用戶瀏覽時就越方便

  網站各個部分都需要發揮各自的作用。對于用戶而言,每個部分都有各自存在的理由,并能得到相應的最終結果。布局需要幫助強調其內容著重顯示該部分最重要的信息。實際上,一個頁面并不需要太多調用按鈕,因此每個內容都應推動到最終”我可以在此實現什么目的”。

  思考一下,你可以為一個簡單的目標構想到的最簡單的布局,并開始添加所需組件。最后你會驚喜的發現簡潔也并非易事。

  07. 重新思考已建內容

 search button

  我們真的還需要一個搜索按鈕嗎?在大多數情況下,答案是不。

  作為設計人員,我們構建了用戶瀏覽互聯網的方式,需要采取多少步驟才能執行一個簡單的操作以及網站的復雜性都是由我們來決定的。我們一直都在遵循一些設計模式和慣例,因為它們切實有效,但有時候只是因為沒人有足夠的時間進行衡量或者重新思考。重新思考組件上已建的交互模式,并看看是否可以進行改進,這點至關重要。

  08. 自我挑戰

  我鼓勵每位設計人員不要墨守成規,而是在每個項目上進行自我挑戰。并非每個項目都要求創新,因此,需要我們自己決定是否要增加一些交互設計相關的內容。比如,各種自我挑戰可能包括使用新的網格系統、創建新的組件,或者甚至包括一些小挑戰,諸如避免混合模式或者避免使用特定的顏色。

  09. 注意細節

 game work in progress

  正在進行的游戲項目:細節視圖

  這條也算是老生常談了,但并非始終在成品中得到應用。根據項目的概念,”關注點”也會有所不同。

  可以注重小型交互、意想不到的動畫或審美感受,例如按鈕上的小漸變或是背景盒子周圍的微妙筆畫之類。但是總的來說,如果你樂在其中,這種感受非常重要,而且非常自然。

  10. 認真對待每個組件,就當參加設計比賽

 video component

  注重每個組件,一加一大于二

  我必須承認這并不是我首創的理論。過去曾在 Fantasy Interactive 上聽到這種說法,當時我就震驚了,這句話如此明確中肯。每個組件都需單獨設計,使其卓絕超凡。有時候,設計師會將一些部分歸為最不重要的內容,最終并不會對其引起重視。

  11. 提高設計作品清晰度

 blurry pixels

  避免出現像素模糊的現象,嘗試正確設置筆觸效果和背景之間的對比度或背景顏色

  除美學考量之外,有些共同的問題需要予以避免,從而創造出一個干凈正確的作品。嘗試提高設計清晰度時應注意以下幾點:梯度條帶、模糊的邊緣、字體渲染選項(部分字體取決于字體大小,最好在特定的渲染模式下查看)以及與背景融合的筆觸效果。

  以上列出了一些基本注意事項,但實際上需要注意的問題還有很多。務必以整體視角檢查設計,看看是不是都非常完美,然后再單獨分析每個組件還有什么問題。

  12. 整理 PSD

  如果你通過 Photoshop 進行設計,那么這點至關重要(結合網格使用)。無論項目有多大,有多少設計師參與其中,你都需要保證文件干凈。這樣就能保證不同部分都能輕松導出,從而提高設計流程的速度,并能處理與其他設計師共享的文件。

  13. 設計最好的情況,但為最壞的情況做準備

 Clear app

  謹記不同設備和尺寸大小上如何讓你的設計發揮作用

  作為設計師,我們的工作就是通過不同的限制解決問題。網頁設計過程中,會遇到各種限制,包括概念和技術問題以及內容相關的問題。

  我們需要創建一個網站,其不僅可以在理想狀態下運行,同時也可以在最糟糕的環境下運行。例如,用戶可使用相當小的屏幕查看網站,此時網站上的內容看起來支離破碎。

  但是,鑒于我們展示設計作品的目的,我個人強烈建議為其創建最佳環境。因此我們將要顯示最理想的內容量,同時以最佳瀏覽器尺寸進行展示,也就是用戶最常用的環境。

  14. 沉迷于設計,因愛生恨

  如果你鉆研設計,我保證你已經干過這種事。只要完成一項設計就會倍感自豪,設計已經成為生活的一部分了。還會截圖,與其他設備比較,將其設為桌面背景,甚至打印出來掛在墻上。

  整個過程中,我達到某個臨界點,最終產生厭惡;我開始發現各種缺點和錯誤,然后進行修改。不喜歡自己以前的設計是成熟的表現,也就是說,你最終發現自己的問題。

  15. 與客戶交流前避免浪費太多時間設計概念

  提交交互概念或設計外觀與體驗時,你需要確保你和客戶盡快同步。初始概念通過審核后,你可以稍作放松,然后開始設計。

  但是如果提交后初始概念后,并未深得客戶的歡心,你就應該收集各種反饋,以便第二次提交的概念方案能夠符合客戶的要求。

  16. 和你的開發者成為好友

 developer Rafael Mumme

  紐約廣告公司 HUGE 的 Rafael Mumme 就設計師如何更好地與開發者合作的提出的建議,請訪問 www.netmagazine.com/opinions/20-things-drive-web-developers-crazy

  開發者創意十足,而且熱愛自己的工作,和你一樣。但是他們并非總是在項目一開始就參與其中,而且大多時候,他們都是在概念設計敲定之后才開始參與設計的,因此他們的創意工作就遭到了抹殺。這種流程是錯誤的;一些非常優秀的想法都是開發團隊提出的。分享你的概念,你會驚喜地發現他們會把它變成更加美觀、更加便于設計。

  17. 展示:說明時請將受眾想象為四歲兒童

  展示作品和設計作品一樣重要。使用錯誤的展示方式,可能會埋沒優秀的設計或者使其慘遭淘汰。謹記,受眾第一次看到你的設計時,并不了解你了然于心的各個重點。

  18. 肯定自己的創意,但不要成為其奴隸

  了解何時宣傳自己的創意,或是了解團隊或客戶何時會產生分歧,這里存在一個小小的臨界點。作為設計師,你需要堅信自己的設計,但是你也應樂于接受他人意見,快速改變自己的創意以及展開后續調整。不要忘記條條大路通羅馬。

  19. 開發過程中跟進設計

  如果您在廣告公司中工作,你必須明白,雖然你剛剛完成的一個項目已經投入開發,你不得不參加另一個新項目的設計,這是家常便飯。大家普遍認為 PSD 和樣式表提交后就萬事大吉了,這是不對的,其實一切還剛剛開始。

  如果你真的關心自己的設計和交互理念是否完全貫徹,可以實時與開發者友人溝通,并盡量提供幫助,以便達到至臻至美的效果。

  20. 逐步正在設計的作品

 style sheets

  與大家分享樣式表和正在設計的組件

  作為設計團隊的一員,我們不僅希望看到最終的成品,同時也想看一看正在設計的作品。有時候,出于種種原因,項目最優秀的部分可能會被忽略,然后一直存放在歸檔文件夾中。項目完成并獲得客戶/制作方認可后,可以著手進行改善,如有可能,可以創建案例研究,分析設計中的作品以及最終并未采用的作品。這有助于幫助拓寬團隊知識,同時你也能收集寶貴的反饋意見。

如何用HTML5和CSS3搭建網站留言到郵箱的PHP程序

HTML5, CSS3 and PHP Contact FormPersonally, I feel it is important to be aware of the [positive] impact HTML5 will have on forms and the way they will function in years to come. Realistically, we can’t implement all of the new features today, but you don’t want to be lagging behind the rest of the industry when these features finally become widely supported.

Having said that, this tutorial will be focusing on the new HTML5 features that are already supported by all the major browsers, or that at least employ graceful degradation for the browsers that are still trying to play catch up.

View DemoView CSS

1. The Design

First of all, this is not a Photoshop tutorial. I have designed the look of the form, but we’re going to be focusing on replicating it using the latest coding techniques and making it function correctly.

Contact From Design

2. The HTML5 Markup

Now we have a design to work towards, we’re going to form the structure of the contact form using HTML5. Firstly, open up a new PHP file and save it as index.php. Now, because we need to use PHP to make the form function, you will need access to a web server in order to test your code. Ideally, you could?set up your own machine as a server using Xampp; alternatively, if you have some online hosting space, you could use that, however this method means you will have to re-upload the files whenever you want to test them.

Doctype

Okay, now we’ve got our blank PHP document, let’s start with the appropriate doctype, which is a lot simpler in HTML5 than previous versions to say the least!

<!DOCTYPE HTML>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Contact Form</title>
</head>

<body>
</body>

</html>

Yep, that’s right. There’s no horrible combination of letters and numbers to remember for the HTML5 doctype. Just simply;?<!DOCTYPE HTML>.

Just to compare, here’s the doctype for XHTML;?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">.

I get the feeling we have a clear winner here? I think this sets the precedent for HTML5, as many of the new tags and attributes represent a simplified method of doing the things that used to take twice the amount of code or several lines of JavaScript.

Structure

The next step is to code the basic structure of the page, so we need to take a look at the design and divide it into logical sections.

Contact Form sections

So, we have a header section, a content section and a footer section. All very simple right? Yes, but with HTML5, it’s even simpler. And much more semantic too.

<!DOCTYPE HTML>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Contact Form</title>
</head>

<body>

    <header class="body">
    </header>

    <section class="body">
    </section>

    <footer class="body">
    </footer>

</body>

</html>

That’s right. No divs. HTML5 has introduced new tags that actually have real meaning and purpose, much more semantic than simply using divs all over the place. I’ve also given each of these elements a class of ‘body’ to show that they are part of the main content body and can be styled as such. You could of course achieve this with a?div?wrapper, but with only a few main body elements, it’s just as easy to assign classes in this case.

The Form

It’s about time we got onto the Contact Form, right? Obviously, the markup for the form will go within the main?<section>?tags.

<form>
        
    <label>Name</label>
    <input name="name" placeholder="Type Here">
            
    <label>Email</label>
    <input name="email" type="email" placeholder="Type Here">
            
    <label>Message</label>
    <textarea name="message" placeholder="Type Here"></textarea>
            
    <input id="submit" name="submit" type="submit" value="Submit">
        
</form>

So that’s the form markup, now to explain a few things.

Input Tag

You may have noticed that the input tags work slightly differently to XHTML, where they are closed using the forward-slash character;?<input />. In HTML5, this tag has again, been simplified to just?<input>.

Input Name

All of the?<input>?tags also have the?name?attribute declared. This comes into play later on when we create the PHP script that will handle the form data.

Input Type

The?type?attribute has seen some?major improvement?in the transition from XHTML to HTML5. Unfortunately, most of the new?<input>?types can’t realistically be used as of yet due to minimal support, but it’s nice to know that they will make our jobs a lot easier in years to come.

There are however, certain?<input>?types that we can use, and see the benefits of right now – however small these benefits might be. I have included?type="email"?in this tutorial, because there is no downside to employing it – there are only positives. It may not be anything mind-blowing, but it’s worth implementing, as any browsers that don’t support this new input type, simply recognise it as?type="text". And on the iPhone, this?<input>?type causes a modified keyboard to appear when the email field is selected, which includes a reduced space bar and the @ symbol takes centre focus.

iPhone Email Keyboard

Placeholder Attribute

<input>?attributes are another area of?major innovation?in HTML5, allowing developers to achieve things that were previously only possible through the use of several lines of JavaScript. The particular one we’re using is the?placeholder?attribute, which is reasonably well supported in the most recent browser releases. It allows you to assign a value to a text field, which when selected, disappears and, if no text has been entered, will reappear again when de-selected. I’ve used this idea for a long time now, but it’s always used some bulky, ugly JavaScript code to make it work.

HTML5 Placeholder

3. The CSS

After having wrote the markup for the page, this is the result…

Contact Form un-styled

Not very pretty is it? This is where we can use some CSS to spruce things up a bit and make it look closer to the original design. Firstly, let’s give the form a more familiar feel by making it read top to bottom rather than left to right.

label {
    display:block;
    margin-top:20px;
    letter-spacing:2px;
}

Giving the?label?elements a property and value of?display:block;?allows them to behave like a block level element, thus forcing the text boxes down onto the next line. I’ve also applied a couple of other self-explanatory properties for spacing and aesthetic purposes.

Contact Form

Next, we need to centre the page and the form, and we’re going to style the?<input>?boxes, after which we will really start to see the page transform.

/* Centre the page */
.body {
    display:block;
    margin:0 auto;
    width:576px;
}

/* Centre the form within the page */
form {
    margin:0 auto;
    width:459px;
}

/* Style the text boxes */
input, textarea {
	width:439px;
	height:27px;
	background:#efefef;
	border:1px solid #dedede;
	padding:10px;
	margin-top:3px;
	font-size:0.9em;
	color:#3a3a3a;
}

textarea {
	height:213px;
	background:url(images/textarea-bg.jpg) right no-repeat #efefef;
}

All of the above is pretty standard CSS; applying a width to the elements with the?.body?class as well as?margin:0 auto;?will centre the page, and the same technique centres the form within the page.

The?input?and?textarea?elements share many of the same CSS values, but there are a couple of properties that differentiate the main message text box from the text fields. Obviously thetextarea?requires much more height, but we’re also applying a very subtle background image to this element. To do this we simply state the image source and position it correctly by setting the other background values to?right?and?no-repeat.

Contact Form Input Boxes

Okay, now we can add the finishing touches to the text boxes with a bit of CSS3.

input, textarea {
    width:439px;
    height:27px;
    background:#efefef;
    border:1px solid #dedede;
    padding:10px;
    margin-top:3px;
    font-size:0.9em;
    color:#3a3a3a;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radius:5px;
}

You can see that we have added three new lines to our CSS which will render rounded corners in all major browsers… except of course for Internet Explorer 8 and below. The standard?border-radius?property will work in Opera, the?-webkit?prefix works for Chrome and Safari and the?-moz?prefix renders rounded corners in Firefox.

Rounded Corners

One last thing to address regarding the text boxes is to assign them a very subtle?:focusstate in order to provide some visual feedback to the users actions. This, once again, couldn’t be simpler.

input:focus, textarea:focus {
    border:1px solid #97d6eb;
}

You can see that we have just given the?<input>?and?<textarea>?elements a subtle blue border when they are currently selected.

Focus State

Finally, we’re going to create our custom submit button. The submit button is an?<input>element, so we gave it its own?id="submit"?in order to override some of the CSS we had already assigned to?<input>?elements, as shown below.

#submit {
    width:127px;
    height:38px;
    background:url(images/submit.jpg);
    text-indent:-9999px;
    border:none;
    margin-top:20px;
    cursor:pointer;
}

	#submit:hover {
	    opacity:.9;
	}

Firstly, we assign the appropriate width and height of the button, before setting its background image to the button we created in the design. The?text-indent:-9999px;?line is a little trick to hide the actual ‘Submit’ text from the button and simply display the background image.

Finally, we assign the button a?:hover?state, within which we’ve utilised another little aspect of CSS3 in the form of the?opacity?property, which is widely supported across the major browsers, except from… yep, you’ve guessed it.

Submit Button

4. Making the form function with PHP

First things first, we need to revisit the HTML so we can add a couple of bits that will allow the form to communicate with the PHP script.

<form method="post" action="index.php">
        
    <label>Name</label>
    <input name="name" placeholder="Type Here">
            
    <label>Email</label>
    <input name="email" type="email" placeholder="Type Here">
            
    <label>Message</label>
    <textarea name="message" placeholder="Type Here"></textarea>
            
    <input id="submit" name="submit" type="submit" value="Submit">
        
</form>

So what’s been added? Take a look at the opening?<form>?tag. We’ve added two new attributes;?method?and?action.

The?method="post"?attribute provides the PHP script with a method of extracting the values from the form, so the script can then do what it wants with those values. Theaction="index.php"?attribute simply tells us the location of the PHP script; in this case, because it’s only a few lines of code, we’re going to insert it just above the form in our index.php file. So when the form is submitted, it will go to index.php and find the script.

Take another look at the HTML above and you will see that each of the form elements have the?name?attribute. The PHP uses this attribute to extract the data from each of the form elements. Let’s look at how it does this…

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
?>

If you’ve never used PHP before, it might look a bit confusing – but it’s actually really simple. The?$_POST?part is a built in PHP function which is used to collect data from a form that usesmethod="post"?like ours does. The part that immediately follows this function,?['name']must correspond to the?name?attribute from the form input; in the first instance,?name="name"!

So, this will collect whatever data has been entered into the name field – now we need something to store that data in. This is where?variables?come into play. In this case,?$name?is the variable that we will use to store the data from the name field. We can then do the same for the email and message fields. Simple!

Now, we’re going to add a few more variables that the form requires in order to function.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = '[email protected]'; 
    $subject = 'Hello';
?>

These new variables determine the destination of the email, the subject field and where the email has come from. In the next step, we will be storing all of the data from the form in one variable in order to simplify things a little.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = '[email protected]'; 
    $subject = 'Hello';

    $body = "From: $name\n E-Mail: $email\n Message:\n $message";
?>

You can see from the above snippet that we have taken the variables we declared previously and have now stored them all in one variable called?$body, which will be the actual content of the email.

It’s almost time to use the?mail()?function to actually send the email! But first, we need to explain how this function is only performed when the form is submitted and not every time the user loads index.php.

<?php
if ($_POST['submit']) {
    /* Anything that goes in here is only performed if the form is submitted */
}
?>

Basically, any code inside the above?if?statement will only be performed once the submit button has been pressed. Again, the?['submit']?part must correspond to the?name?of the submit button in your form.

Now we can go ahead and use the?mail()?function.

<?php
if ($_POST['submit']) {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}
?>

The?mail()?function is a built in PHP function that actually performs the task of sending the email to the appropriate recipient. The above code uses an?if?statement, which basically states that if the mail function is performed correctly, then tell the user the message has been sent; if the mail function didn’t perform correctly, then notify the user that there has been a problem.

Now, if you test the form on your server you should find that it works correctly! The best way to ensure the form is working is to upload it to an online server and set the recipient email address as an email hosted on the same server.

Note that you can place this script wherever you want the confirmation message to appear. For example, if you want the message to appear above the form as it does in the demo, then you simply place the PHP script directly above the form, NOT in a separate PHP file.

Spam Prevention

Before we finish off, we’re going to look at a very simple method of spam prevention. To begin this process we must once again revisit the HTML and add in one more?<input>element to our form. We’re going to insert this element just before the submit button.

<label>*What is 2+2? (Anti-spam)</label>
<input name="human" placeholder="Type Here">

Now back to the PHP, we need to use the POST method to extract whatever the user has entered into this field. Because we gave the element a name of “human”, we add the following line to our PHP;?$human = $_POST['human'];.

Remember the PHP?if?statement we used to carry out functions only once the form had been submitted? Well we’re going to need to slightly modify that statement now.

<?php
if ($_POST['submit'] && $human == '4') {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}
?>

The statement now requires that the value of ‘human’ (the response to the anti-spam question) must be ‘4′ in order for the mail function to be carried out. Now we need to add one last bit of code to let the user know if they have answered the anti-spam question incorrectly.

<?php
if ($_POST['submit'] && $human == '4') {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
} else if ($_POST['submit'] && $human != '4') {
    echo '<p>You answered the anti-spam question incorrectly!</p>';
}
?>

We have added to our?if?statement by using?else if, which in this case states that if the form has been submitted?and?the answer to the anti-spam question was?not?‘4′, then do not perform the?mail()?function and notify the user that their answer was wrong.

And that… is that! The Final PHP code can be found below and links to the demo and the CSS file can be found even further below. Thanks for reading. If you read it all – good effort! And let me know how you got on by leaving a comment below.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = '[email protected]'; 
    $subject = 'Hello';
    $human = $_POST['human'];
			
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";
				
    if ($_POST['submit'] && $human == '4') {				 
        if (mail ($to, $subject, $body, $from)) { 
	    echo '<p>Your message has been sent!</p>';
	} else { 
	    echo '<p>Something went wrong, go back and try again!</p>'; 
	} 
    } else if ($_POST['submit'] && $human != '4') {
	echo '<p>You answered the anti-spam question incorrectly!</p>';
    }
?>

View DemoView CSS

Update

One or two people have asked about making the form work with required fields. Here’s the script you’d need if the name and email fields in my example were both required fields…

if ($_POST['submit']) {
    if ($name != '' && $email != '') {
        if ($human == '4') {				 
            if (mail ($to, $subject, $body, $from)) { 
	        echo '<p>Your message has been sent!</p>';
	    } else { 
	        echo '<p>Something went wrong, go back and try again!</p>'; 
	    } 
	} else if ($_POST['submit'] && $human != '4') {
	    echo '<p>You answered the anti-spam question incorrectly!</p>';
	}
    } else {
        echo '<p>You need to fill in all required fields!!</p>';
    }
}

And?here’s how it would work!

國內比較常用的幾個CSS框架

前端CSS框架目前越來越多,各大小互聯網公司也都推出了自己的解決方案并開源免費給大家使用!國外的以Bootstrap、foundation、960GS等為首的解決方案受到眾多前端人士的熱捧!Yahoo也推出了Pure,配合YUI3,堪稱完美。

國內淘寶推出了JS庫Kissy和相應的CSS框架,網易給我們帶來了JS庫NEJ和CSS框架NEC。

NEC特色功能(Nice+Easy=Better)

  • 讀規范,讓你的代碼更具智慧和美麗的方法
  • 用框架,選擇一份合適的HTML和CSS基礎代碼
  • 找代碼,在這里找到她,或給你啟發,或她就是你的
  • 裝插件,幫助你快速有效的使用代碼庫

NEC官網:http://nec.netease.com/

NEJ官網http://nej.netease.com/

Pure中文版

Pure的網站:http://purecss.io/

http://pure-site.ap01.aws.af.cm

 

Google reCAPTCHA 驗證碼

您肯定上過論壇吧?幾乎所有正規的論壇都要求注冊時輸入驗證碼,這是為了防止亂發垃圾廣告的家伙用注冊機來惡意注冊。這個源自美國卡內基-梅隆大學的發明被稱為CAPTCHA(用于區分人類與電腦的全自動圖靈測試),因為注冊者需要辨識圖片上七歪八扭的文字,而這項工作只有真正的人類才能完成。

它其實是 Google 提供的 reCAPTCHA 服務(link),可以免費申請和使用。

關于 reCAPTCHA 驗證碼

驗證碼大家每天都會見到,可是你會想到當你每次不耐煩的輸入一個單詞的時候都為人類做出了一點貢獻嗎?

驗證碼(CAPTCHA)或者叫做全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart),使我們上網的人每天都可以見到的,而它的作用除了防止垃圾注冊或者評論以外還有別的嗎?來自Google的reCAPTCHA(上圖)告訴我們,你其實還可以為人類做貢獻。

題外話:現在OCR的閱讀效率實在是不高,下面這張圖就可以說明問題。
關于 reCAPTCHA 驗證碼

它的情景是這樣的,有一天,某臺機器掃描了一本書,想把它轉成電子版:
關于 reCAPTCHA 驗證碼

處理出來是這樣子的:

The Hreckinridge’ and Lane Democrats, having taken courage at the recent eastern advises, are [xxxxxxxxxx] energetically for the campaign: Several prominent Democrats who at first favoredDonoLea, are coming out. for the other aide, apparently under the [xxxxxxxx] of Federal [xxxxxxxxx]. An address to the National Democracy of ,1ifornia, urging the party to supportHaeeslipslDas, has recently been published, which manifestlybss strengthened that aide of the [xxxxxxxxx]: It is signed by 65 Democrats, many of whom occupy respectab e and prominent positions in the party, 22 of them are Federal office-holders,[xxxxx] more are recipients of Federal patronage, and the others represent a mass of politicians giving the document [xxxx][xxxxxx] mTheDcu8las Democrats are also active The Irish and German vote will mostly go with ths# branch of the party, but it is[xxxxxxxxx] to [xxxxxxxx] [xxxxx] [xxxx] [xx] the stronger. Thus far 17 IT newspapers have declared for DonGres, 13 for Base$- IaaIDGS and 9 remain non-committal, with even chances of going either way. Under these circumstances the Republicans entertain not unjustifiable hopes that the Democratic divisions may be so equal,- ly balanced as to give the State [xx] LIaCOLV.Same very [xxxxxxx] Bell and Everett meetings have been held in different parts of the State, bat thus far that party does not exhibit much rank sad ale air en.

這個是原書質量比較差的:
關于 reCAPTCHA 驗證碼

看到這個,電腦就傻眼了,吐出來一堆這種東西:

‘ letz-1- rrk fit: 1′ . on its to Vc ,rt, cann into tlm yc H_ tcr,la, .n. ‘l l; , arc ti:( h of thc 1″,ats that to ltc rc: ,;. , I; ., l: rel!;n. tani., , ./olio, IJuteilu, . 1!’i./_ ;lr”n. Iiam! Jr.r. F’l,nr_.Z.._%i;;, ,, : rt-Irn: am/ tf.rri.:, t?m steamer as a tr nW r. Uu ,tin;t, c ac?1 1″,at firm/ a t;nn, accor.liu; to .t rn. ‘Cl.w r. wu ru lm:nui MistinW /y in u;th, -. ink ;:,k as to “what w ax 1111, :111(I vle:iR a of ;: (,am( into, mnr r-, tm if tlm wo r( uu.i n:’ of t?u : la?:Iv. \ ‘c : ol in thc , ucr:atic , , Tlau :; will h:aw tu-li.r \. ’1′Im yap?tts Il ,,n an,/ I, ,rr:l. r, (,t tf,is r:ity, start witli it, with lu:rtic: ol \ 1- e:l.k.

看得懂嗎?反正我是看不懂。驗證碼的出現,就是為了改變這種情況的。這張圖可以很好的解釋它的工作原理:
關于 reCAPTCHA 驗證碼

1、我們首先掃描了一本有一大堆單詞的書
2、我們找出不能被電腦識別的單詞,這些單詞有可能是不同的字體。當然了,損壞程度也與書籍年代以及掃描質量有關。
3、為了讓這些驗證碼更安全,我們會讓它更扭曲并且在上面加入橫線。
4、一個驗證碼是有兩個這樣的單詞組成的。

有了它的幫助,第二張圖片上面的文字就會變得清楚多了(不過還是有一點小錯誤):

The New-York State yacht Squadron, on its annual cruise to Newport came into the harbor yesterday afternoon. The following are the names of the boats that came to anchor here: Jessie, gera loliv erelun Annie, Mannering, Julia, Bonita, Magic wut, Rambler, floumblie, Henrietta, Sea-Drift and Maria, with the steamer America as a tender. On anchoring each boat fired a gun, according to custom. The reports were heard distinctly in the city, causing considerable inquiry as to “what was up,” and quite a number of sanguine individuals came into our office to inquire if the guns were not annunciatory signals of the successful laying of the Atlantic Cable. We invariably replied in the negative. The squadron will leave to-day for Newport. The yachts Washington and buub r of this city, start with it, with parties of New Haven people.

有的人可能要問了,既然機器都看不明白那他怎么判斷你輸對了還是錯了呢?我一開始也有這樣的問題,Google是這樣解釋的:
兩個驗證碼里面有一個是正確的,被人審核過的,而另一個是不正確的,機器讀不出來的。當你把那個正確的輸對以后我們就會默認另外一個也是對的,這樣,你每輸入一次驗證碼,就為人類的知識寶庫里增加了一個單詞。

了解和申請 reCAPTCHA :www.google.com/recaptcha

dedecms安全配置整理,防止網站被黑必看!

網上有很多CMS開源程序,發現很多朋友或做醫院的都用到DEDECMS,之前我也使用過,不過后來被掛過幾次馬,就覺得DEDE也不什么好,不過做垃圾站的話,排名效果還是不錯的,至少對百度的收錄和排名都比較友好。任何一款開源程序都存在或多或少的漏洞,只是沒被別人發現而已。自己不能開發這么強大的系統,只能拿現成的來改了。很多所謂的“黑客”都是用工具來掃描入侵,厲害點的人是不屑來黑我們的小網站的,所以我們一般做好安全防護就可以了。以下是我收集整理的內容:
第一:安裝的時候數據庫的表前綴,最好改一下,不用dedecms默認的前綴dede_,可以改成ljs_,隨便一個名稱即可。
第二:后臺登錄開啟驗證碼功能,將默認管理員admin刪除,改成一個自己專用的,復雜點的賬號。
第三:裝好程序后務必刪除install目錄
第四:將dedecms后臺管理默認目錄名dede改掉。
第五:用不到的功能一概關閉,比如會員、評論等,如果沒有必要通通在后臺關閉。
第六:以下一些是可以刪除的目錄:
member會員功能
special專題功能
company企業模塊
plus\guestbook留言板第
第七:管理地址使用noindex和nofollow標記,防止搜索引擎抓路讓一些人通過社工獲取管理地址和程序版本號。
以下是可以刪除的文件:
管理目錄下的這些文件是后臺文件管理器,屬于多余功能,而且最影響安全
file_manage_control.php file_manage_main.php file_manage_view.php media_add.php media_edit.php media_main.php
再有:
不需要SQL命令運行器的將dede/sys_sql_query.php 文件刪除。
不需要tag功能請將根目錄下的tag.php刪除。不需要頂客請將根目錄下的digg.php與diggindex.php刪除。
第八:多關注dedecms官方發布的安全補丁,及時打上補丁。
第九:下載發布功能(管理目錄下soft__xxx_xxx.php),不用的話可以刪掉,這個也比較容易上傳小馬的.
第十:DedeCms官網出的萬能安全防護代碼http://bbs.dedecms.com/read.php?tid=15538,我發在文章后面,官網的要會員才能看.
第十一:最安全的方式:本地發布html,然后上傳到空間。不包含任何動態內容,理論上最安全,不過維護相對來說比較麻煩。
第十二:還是得經常檢查自己的網站,被掛黑鏈是小事,被掛木馬或刪程序就很慘了,運氣不好的話,排名也會跟著掉。所以還得記得時常備份數據.

轉自:http://blog.sina.com.cn/s/blog_bada4e1c01017urr.html

30個最常用css選擇器解析

你也許已經掌握了id、class、后臺選擇器這些基本的css選擇器。但這遠遠不是css的全部。下面向大家系統的解析css中30個最常用的選擇器,包括我們最頭痛的瀏覽器兼容性問題。掌握了它們,才能真正領略css的巨大靈活性。
1. *

* {
margin: 0;
padding: 0;
}

星狀選擇符會在頁面上的每一個元素上起作用。web設計者經常用它將頁面中所有元素的margin和padding設置為0。 *選擇符也可以在子選擇器中使用。

#container * {
border: 1px solid black;
}

上面的代碼中會應用于id為container元素的所有子元素中。 除非必要,我不建議在頁面中過的的使用星狀選擇符,因為他的作用域太大,相當耗瀏覽器資源。 兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
2. #X

#container {
width: 960px;
margin: auto;
}

井號作用域有相應id的元素。id是我們最常用的css選擇器之一。id選擇器的優勢是精準,高優先級(優先級基數為100,遠高于class的10),作為javascript腳本鉤子的不二選擇,同樣缺點也很明顯優先級過高,重用性差,所以在使用id選擇器前,我們最好問下自己,真的到了非用id選擇器的地步? 兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
3. .X

.error {
color: red;
}

這是一個class(類)選擇器。class選擇器與id選擇器的不同是class選擇器能作用于期望樣式化的一組元素。 兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
4. X Y

li a {
text-decoration: none;
}

這也是我們最常用的一種選擇器——后代選擇器。用于選取X元素下子元素Y,要留意的點是,這種方式的選擇器將選取其下所有匹配的子元素,無視層級,所以有的情況是不宜使用的,比如上述的代碼去掉li下的所有a的下劃線,但li里面還有個ul,我不希望ul下的li的a去掉下劃線。使用此后代選擇器的時候要考慮是否希望某樣式對所有子孫元素都起作用。這種后代選擇器還有個作用,就是創建類似命名空間的作用。比如上述代碼樣式的作用域明顯為li。 兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
5. X

a { color: red; }
ul { margin-left: 0; }

標簽選擇器。使用標簽選擇器作用于作用域范圍內的所有對應標簽。優先級僅僅比*高。 兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
6. X:visited和X:link

a:link { color: red; }
a:visted { color: purple; }

使用:link偽類作用于未點擊過的鏈接標簽。:hover偽類作用于點擊過的鏈接。 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
7. X+Y

ul + p {
color: red;
}

相鄰選擇器,上述代碼中就會匹配在ul后面的第一個p,將段落內的文字顏色設置為紅色。(只匹配第一個元素) 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
8. X>Y

div#container > ul {
border: 1px solid black;
}

  • List Item
    • Child
  • List Item
  • List Item
  • List Item

子選擇器。與后代選擇器X Y不同的是,子選擇器只對X下的直接子級Y起作用。在上面的css和html例子中,div#container>ul僅對container中最近一級的ul起作用。從理論上來講X > Y是值得提倡選擇器,可惜IE6不支持。 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
9. X ~ Y

ul ~ p {
color: red;
}

相鄰選擇器,與前面提到的X+Y不同的是,X~Y匹配與X相同級別的所有Y元素,而X+Y只匹配第一個。 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
10. X[title]

a[title] {
color: green;
}

屬性選擇器。比如上述代碼匹配的是帶有title屬性的鏈接元素。

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
11. X[title=”foo”]

a[href=”http://css9.net”] {
color: #1f6053;
}

屬性選擇器。 上面的代碼匹配所有擁有href屬性,且href為http://css9.net的所有鏈接。

這個功能很好,但是多少又有些局限。如果我們希望匹配href包含css9.net的所有鏈接該怎么做呢?看下一個選擇器。 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
12. X[title*=”css9.net”]

a[href*=”css9.net”] {
color: #1f6053;
}

屬性選擇器。正如我們想要的,上面代碼匹配的是href中包含”css9.net”的所有鏈接。

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
13. X[href^=”http”]

a[href^=”http”] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}

屬性選擇器。上面代碼匹配的是href中所有以http開頭的鏈接。 兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
13. X[href$=”.jpg”]

a[href^=”http”] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}

屬性選擇器。在屬性選擇器中使用$,用于匹配結尾為特定字符串的元素。在上面代碼中匹配的是所有鏈接到擴展名為.jpg圖片的鏈接。(注意,這里僅僅是.jpg圖片,如果要作用于所有圖片鏈接該怎么做呢,看下一個選擇器。)

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
14. X[data-*=”foo”]

在上一個選擇器中提到如何匹配所有圖片鏈接。如果使用X[href$=”.jpg”]實現,需要這樣做:

a[href$=”.jpg”],
a[href$=”.jpeg”],
a[href$=”.png”],
a[href$=”.gif”] {
color: red;
}

看上去比較麻煩。另一個解決辦法是為所有的圖片鏈接加一個特定的屬性,例如‘data-file’

html代碼

圖片鏈接

css代碼如下:

a[data-filetype=”image”] {
color: red;
}

這樣所有鏈接到圖片的鏈接字體顏色為紅色。

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
15. X[foo~=”bar”]

屬性選擇器。屬性選擇器中的波浪線符號可以讓我們匹配屬性值中用空格分隔的多個值中的一個。看下面例子:

html代碼

Click Me, Fool

css代碼

a[data-info~=”external”] {
color: red;
}
a[data-info~=”image”] {
border: 1px solid black;
}

在上面例子中,匹配data-info屬性中包含“external”鏈接的字體顏色為紅色。匹配data-info屬性中包含“image”的鏈接設置黑色邊框。

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
17. X:checked

checked偽類用來匹配處于選定狀態的界面元素,如radio、checkbox。

input[type=radio]:checked {
border: 1px solid black;
}

上面代碼中匹配的是所有處于選定狀態的單選radio,設置1px的黑色邊框。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
18. X:after和X:before

這兩個偽類與content結合用于在元素的前面或者后面追加內容,看一個簡單的例子:

h1:after {content:url(/i/logo.gif)}

上面的代碼實現了在h1標題的后面顯示一張圖片。

我們也經常用它來實現清除浮動,寫法如下:

.clearfix:after {
content: “”;
display: block;
clear: both;
visibility: hidden;
font-size: 0;
height: 0;
}
.clearfix {
*display: inline-block;
_height: 1%;
}

19. X:hover

div:hover {
background: #e3e3e3;
}

:hover偽類設定當鼠標劃過時元素的樣式。上面代碼中設定了div劃過時的背景色。

需要注意的是,在ie 6中,:hover只能用于鏈接元素。

這里分享一個經驗,在設定鏈接劃過時出現下滑線時,使用border-bottom會比text-decoration顯得更漂亮些。代碼如下:

a:hover {
border-bottom: 1px solid black;
}

兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera
20. X:not(selector)

div:not(#container) {
color: blue;
}

否定偽類選擇器用來在匹配元素時排除某些元素。在上面的例子中,設定除了id為container的div元素字體顏色為blue。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
21. X::pseudoElement

::偽類用于給元素片段添加樣式。比如一個段落的第一個字母或者第一行。需要注意的是,這個::偽類只能用于塊狀元素。

下面的代碼設定了段落中第一個字母的樣式:

p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right: 2px;
}

下面的代碼中設定了段落中第一行的樣式:

p::first-line {
font-weight: bold;
font-size: 1.2em;
}

兼容瀏覽器:IE6+、Firefox、Chrome、Safari、Opera

(IE6竟然支持,有些意外啊。)
22. X:nth-child(n)

li:nth-child(3) {
color: red;
}

這個偽類用于設定一個序列元素(比如li、tr)中的第n個元素(從1開始算起)的樣式。在上面例子中,設定第三個列表元素li的字體顏色為紅色。

看一個更靈活的用法,在下面例子中設定第偶數個元素的樣式,可以用它來實現隔行換色:

tr:nth-child(2n) {
background-color: gray;
}

兼容瀏覽器:IE9+、Firefox、Chrome、Safari
23. X:nth-last-child(n)

li:nth-last-child(2) {
color: red;
}

與X:nth-child(n)功能類似,不同的是它從一個序列的最后一個元素開始算起。上面例子中設定倒數第二個列表元素的字體顏色。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
24. X:nth-of-type(n)

ul:nth-of-type(3) {
border: 1px solid black;
}

與X:nth-child(n)功能類似,不同的是它匹配的不是某個序列元素,而是元素類型。例如上面的代碼設置頁面中出現的第三個無序列表ul的邊框。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari
25. X:nth-last-of-type(n)

ul:nth-last-of-type(3) { border: 1px solid black; }

與X:nth-of-type(n)功能類似,不同的是它從元素最后一次出現開始算起。上面例子中設定倒數第三個無序列表的邊框

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
26. X:first-child

:first-child偽類用于匹配一個序列的第一個元素。我們經常用它來實現一個序列的第一個元素或最后一個元素的上(下)邊框,如:

ul:nth-last-of-type(3) {
border: 1px solid black;
}

兼容瀏覽器:IE7+、Firefox、Chrome、Safari、Opera
27. X:last-child

ul > li:last-child {
border-bottom:none;
}

與:first-child類似,它匹配的是序列中的最后一個元素。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
28. X:only-child

div p:only-child {
color: red;
}

這個偽類用的比較少。在上面例子中匹配的是div下有且僅有一個的p,也就是說,如果div內有多個p,將不匹配。

My paragraph here.

Two paragraphs total.

Two paragraphs total.

在上面代碼中第一個div中的段落p將會被匹配,而第二個div中的p則不會。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
29. X:only-of-type

li:only-of-type {
font-weight: bold;
}

這個偽類匹配的是,在它上級容器下只有它一個子元素,它沒有鄰居元素。例如上面代碼匹配僅有一個列表項的列表元素。

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera
30. X:first-of-type

:first-of-type偽類與:nth-of-type(1)效果相同,匹配出現的第一個元素。我們來看個例子:

My paragraph here.

  • List Item 1
  • List Item 2
  • List Item 3
  • List Item 4

在上面的html代碼中,如果我們希望僅匹配List Item 2列表項該如何做呢:

方案一:

ul:first-of-type > li:nth-child(2) {
font-weight: bold;
}

方案二:

p + ul li:last-child {
font-weight: bold;
}

方案三:

ul:first-of-type li:nth-last-child(1) {
font-weight: bold;
}

兼容瀏覽器:IE9+、Firefox、Chrome、Safari、Opera。
總結:

如果你正在使用老版本的瀏覽器,如IE 6,在使用上面css選擇器時一定要注意它是否兼容。不過,這不應成為阻止我們學習使用它的理由。在設計時,你可以參考瀏覽器兼容性列表,也可以通過腳本手段讓老版本的瀏覽器也支持它們。

另一點,我們在使用javascript類庫的選擇器時,例如jquery,要盡可能的使用這些原生的css3選擇器,因為類庫的選擇器引擎會通過瀏覽器內置解析它們,這樣會獲得更快的速度。

原文:http://net.tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-must-memorize/

3d字谜总汇