文章出處

這篇文章是99翻譯Nicolas Gallagher 的CSS background image hacks 一文。大家都知道,目前有很多瀏覽器無法實現背景裁切、背景透明度、背景變換和復雜背景定位等效果。那么這篇文章將詳細介紹了這幾種背景圖片的處理方法。

正如前面所說,僅僅依靠CSS現有的屬性,我們無法實現背景裁切、背景透明度、背景變換和復雜背景定位等效果.為了實現這些效果,我們需要借助CSS的其他方法來實現,比如說CSS偽元素,他可以幫助我們模擬出這些CSS無法實現的效果,在開始了解怎么實現這些效果之前,我們一起來看一些DEMO效果,讓我們最初一個概念。

偽元素技巧不需要添加額外的HTML標簽就可以填補瀏覽器對一些CSS特性支持的真空,甚至可以模擬一些還未進入w3c草案的CSS特性,比如今天要說的背景變換、背景透明等等。

今天這篇文章中利用到的偽元素的大部分技巧均在早前的文章Multiple Backgrounds and Borders with CSS 2.1 (如果你看英文有點煩的話,你可以看看由志哥翻譯的文章使用css2.1實現多重背景、多重邊框效果)有做過詳細介紹,在這篇文章中已經詳細講解了怎樣利用偽元素模擬CSS的多背景特性和CSS多邊框的特效,文章的Multiple Backgrounds with CSS 2.1 和Multiple Borders with CSS 2.1 頁也展現了一些利用偽元素來實現其他特性的基本原理。

模擬背景剪裁

這種方法制作的背景剪裁,目前知道的就支持:Firefox 3.5+, Opera 10+, Safari 4+, Chrome 4+, IE 8+

利用css2.1即可模擬背景裁切效果。原理是把背景圖片作為偽元素的背景,而不是作為原本容器的背景。下面第一個例子的效果是裁剪一部分背景,第二個效果可以裁剪css sprite,利用這個特性來制作文字旁邊的小圖片:

css background image hacks

某種程度上,相比其他可用的方法使用偽元素是有優勢的,偽元素結合了一些方法的優點,而某種程度上又可以規避他們的缺點

Google、facebook、 twitter 均使用空白dom元素來裁切他們復雜sprites,用來實現界面上鏈接旁的圖標效果。

偽元素也可以用類似空白dom元素應用的方式來使用。同時,使用偽元素不需要依賴額外的html標簽,而且不會過分依靠sprites。此方法的缺點是ie6,7瀏覽器不支持。利用此種方式,可以實現漸進增強,加強支持此特性瀏覽器頁面的表現效果,而低版本瀏覽器仍采用空白元素的辦法,同樣可以完美的得到我們想要的效果。

這個例子展示了如何從一張排列緊密的雪碧圖中裁切出你需要的圖標。裁切尺寸為16*16。只需要創建一個ul列表,在需要生效的部分指定一個class即可


應用樣式可以以各種方式展示這個列表,在此基礎上我們利用偽元素,這里你完全可以把偽元素當作空白標簽來使用 比如span標簽。

:Before偽元素的尺寸正好可以匹配sprites的一個網格(即16*16)。同樣你可以根據所裁切的部分,隨意設置偽元素的尺寸

復制代碼
代碼如下:

.actions a:before {
content:"";
float:left;
width:16px;
height:16px;
margin:0 5px 0 0;
background:url(sprite.png);
}
.save a:before {background-position:0 -16px;}
.delete a:before {background-position:0 -32px;}
.share a:before {background-position:0 -48px;}
.comment a:before {background-position:0 -64px;}

有的時候你可能不只在一種狀態下設置背景圖片,比如說懸浮狀態下需要改變背景圖片的等。其實,增加hover, focus, active, 與 “.saved”的情況是為了讓列表在這些情況下也能正確渲染背景位置。

復制代碼
代碼如下:

.save a:hover:before,
.save a:focus:before,
.save a:active:before {background-position:-16px -16px;}
.saved a:before {background-position:-32px -16px;}

將來的替代方案

將來可以用另一種方式來實現。火狐瀏覽器的私有屬性 -moz-image-rect可以裁切背景。但這個屬性不被其他瀏覽器支持,而且可能會被屬于css3背景屬性草案中的一個標識所取代。據我所知就位圖圖像而言,現代瀏覽器對于這個屬性沒有任何穩定的支持。

模擬背景變換

偽元素結合css3 transform的rotate,scale,skew屬性,可以模擬背景變換。目前沒有提案要求支持背景變換屬性,所以偽元素技巧是唯一可以模擬此效果的方法。

旋轉背景圖片

剛剛講解的背景圖片裁切技術可以減少精靈圖中的圖片個數。我們也可以用css來實現圖片的變形,而不需要使用圖形軟件處理。

css background image hacks

實現上圖的效果,其實很簡單,其代碼如下所示:

復制代碼
代碼如下:

.accordion a:before {
content:"";
float:left;
width:16px;
height:16px;
margin:0 5px 0 0;
background:url(sprite.png) no-repeat 0 0;
}
.accordion.open a:before {
-webkit-transform:rotate(90deg);
-moz-transform:rotate(90deg);
-ms-transform:rotate(90deg);
-o-transform:rotate(90deg);
transform:rotate(90deg);
}

若想對背景圖片應用變換,而不會影響到其他元素,需要使用定位來調整背景圖片的位置,詳細的可以參考:Multiple Backgrounds and Borders with CSS 2.1 (如果你看英文有點煩的話,你可以看看由志哥翻譯的文章使用css2.1實現多重背景、多重邊框效果)一文。

這里我們利用了偽元素,給偽元素使用圖片,之后利用絕對定位跟z-index屬性定位偽元素到內容層的下面即可。

背景圖片倒影效果

有時候會對背景圖有這樣的需求,方法類似,不過這次使用的是transform:scale屬性

css background image hacks

通過偽元素 利用transform:scaleX(-1), transform:scaleY(-1),
transform:scale(-1,-1) 這三個屬性你可以沿著x軸,y軸或者沿著中心軸做鏡像對稱。

下面的例子展示了偽元素模擬的背景變換是怎樣應用在一個翻頁鏈接上的。偽類顯示了一張單獨的圖片,或者一張精靈圖的一部分,之后進行變換。

注意rotation不能得到我們想要的效果,需要使用scale操作

復制代碼
代碼如下:

.prev a:before,
.next a:before {
content:"";
float:left;
width:16px;
height:16px;
margin:0 5px 0 0;
background:url(sprite.png) no-repeat 0 0;
}
.next a:before {
float:right;
margin:0 0 0 5px;
-webkit-transform:scaleX(-1);
-moz-transform:scaleX(-1);
-ms-transform:scaleX(-1);
-o-transform:scaleX(-1);
transform:scaleX(-1);
}

注:這個屬性ie8以下不支持,即使你用ie的變換濾鏡,偽元素上也不會生效

未來的解決方案

貌似css草案中沒有相關的方案,你不需要依靠額外的標簽,只需要偽元素就可以實現背景變換跟背景透視的效果。

模擬背景位置

Css2.1的background-position屬性計算圖片偏移只能從元素左側跟上側開始計算。這里可以給偽元素設置背景圖片,之后把偽元素作為附加的背景層,即可實現從右側跟下側來計算背景偏移了

css background image hacks

這個技巧可以很容易的結合其他技巧使用。更多利用偽元素實現background-position的細節可以參考:Multiple Backgrounds and Borders with CSS 2.1 (如果你看英文有點煩的話,你可以看看由志哥翻譯的文章使用css2.1實現多重背景、多重邊框效果)一文。

在這個例子里偽元素放置到內容層的下面。給偽元素設置的背景圖片的大小是500px × 300px,因此我們也要設置偽元素的寬高。

利用絕對定位,我們也可以調整偽元素的位置。

復制代碼
代碼如下:

#content {
position:relative;
z-index:1;
}
#content:before {
content:"";
position:absolute;
z-index:-1;
bottom:10px;
right:10px;
width:500px;
height:300px;
background:url(image.jpg);
}

未來解決方案

這里的css草案CSS Backgrounds and Borders module  增強了background-position的效果,使其可以從盒子模型的任何一側開始計算。到現在為止opera11是唯一可以穩定支持這個屬性的瀏覽器。

模擬背景透明度

改變偽元素的透明度跟直接操縱元素的透明度一樣容易。

注:Ie8及以下利用濾鏡對偽元素設置透明度是無效的

我們可以利用定位把偽元素定位在內容層下面,這樣就不會影響內容了。之后利用坐標或者寬高調整偽元素的大小,使其適配內容。之后給偽元素設置背景圖片,改變偽元素的透明度就可以了。

復制代碼
代碼如下:

#content {
position:relative;
z-index:1;
}
#content:before {
content:"";
position:absolute;
z-index:-1;
top:0;
bottom:0;
left:0;
right:0;
background:url(image.jpg);
opacity:0.7;
}

這幾種方法可以說將偽元素運用的是爐火純青,當然他還是有一些限制的,比如說低版本瀏覽器的不兼容,就算是在現代瀏覽器中,偽元素有些效果也不被支持,比如說CSS3的animation屬性在Webkit內核下就會有問題,但話又說回來,他的用處還是很多的,使用偽元素來制作陰影效果,如23 Box-shadow Effects ,使用偽來制作對話氣泡效果,如Pure CSS speech bubbles 。當然還有很多其他的效果。這里就不一一說了。

最后希望這篇譯文對大家有所幫助,特別是幫助大有增長思維。


歡迎轉載:http://www.kanwencang.com/bangong/20161116/55399.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()