CSS中變換背景保持內容的實現方案

在CSS中經常會用到對一個元素進行變換(Transform)但希望元素的內容保持不變的效果;但當我們對元素進行變換時,得到的效果是:不但背景被變換了,而且內容也被變換了;示例如下:

以skewX()變換為例,假設有以下元素:
HTML結構:

<p>
    我是內容
</p>

css樣式:

p {
    display: inline-block;
    border-color: red;
    border-width:1px;
    border-style: solid;
}

效果:

示例效果.png

如果對這個元素使用skewX()變換,則會得到如下效果:
CSS樣式:

transform: skewX(45deg);

效果:

示例效果-變換.png

從效果中可以看出,不僅元素的背景被變換了,而且里面的內容也被變換了,然而,在很多場景下我們只希望變換背景,內容保持不變;

若要解決這個問題,也有多種方案可選(推薦方案3喲),如下:

方案1:外套元素

原理:

在變換時,為了把背景樣式與元素內容分離,可以把目標元素嵌入在一個容器元素內,比如div元素,然后把目標元素的背景樣式移動到容器元素上,使容器元素僅負責背景樣式(稱僅負責樣式的元素為樣式元素),目標元素僅負責內容;然后對樣式元素進行變換,再對目標元素進行反向變換,這樣便實現了變換了背景樣式,而又還原了內容;

原理演示:

  1. 給目標元素添加一個容器元素作為樣式元素;
    ** HTML結構:**

    <div>
        <p>
            我是內容
        </p>
    </div>
    
  2. 把目標元素的背景樣式移動到容器元素上;
    示例效果:

    外套元素.png

    注意:
    虛線框只是用來標識元素的存在,并不表示元素的樣式;

  3. 對容器元素應用變換;
    CSS樣式:

    transform: skewX(45deg);
    

    示例效果:

    外套元素-變換.png

  4. 對目標元素應用反向變換;
    CSS樣式:

    transform: skewX(-45deg);
    

    示例效果:

    外套元素-糾正.png

此方案優點:

  1. 原理直觀,易理解;
  2. 可以實現任意多樣式及內容的分離;
  3. 需要對目標內容再進行反向變換;(有此變換操作是不可逆的,所以反向變換會可能不能還原效果;)

此方案缺點:

  1. 添加了較多冗余的元素;

方案2:內嵌元素

原理:

與外套元素的方案類似,只是把樣式元素插入到了目標元素里面,作為了目標元素的子元素;這樣,在對樣式元素進行變換時,不會影響到目標元素的內容,從而不用使用反向變換;

原理演示:

  1. 給目標元素添加一個子元素作為樣式元素;
    ** HTML結構:**

    <p>
        <span></span>
        我是內容
    </p>
    
  2. 把目標元素的背景樣式移動到樣式元素上;
    示例效果:

    內嵌元素.png

    注意:

    1. 虛線框只是用來標識元素的存在,并不表示元素的樣式;
    2. 如果樣式元素遮擋了目標元素的內容,則需要給樣式元素設置合適的層疊級別z-index;
  3. 對樣式元素應用變換;
    CSS樣式:

    transform: skewX(45deg);
    

    示例效果:

    內嵌元素-變換.png

此方案優點:

  1. 原理直觀,易理解;
  2. 可以實現任意多樣式及內容的分離;
  3. 不用對目標內容再進行反向變換;

此方案缺點:

  1. 添加了較多冗余的元素;

方案3:前后偽元素

原理:

與內嵌元素方案的原理一樣,所不同的是:本方案采用偽元素::before或者::after來作為樣式元素,而不是另外插入額外的元素;

原理演示:

以::before偽元素為例:

  1. 把目標元素的樣式應用到其偽元素::before上;
    ** CSS樣式:**

    p::before {
        border-color: red;
        border-width:1px;
        border-style: solid;
    }
    
  2. 調整::before偽元素的盒子使其與目標元素盒子重疊;
    因為在::before和::after偽元素選擇器中必須定義content屬性,所以需要為::before選擇器中設置值為空字符串的content屬性;
    另外,因為瀏覽器會為這2個偽元素選擇器分別生成相應的盒子,并且這些盒子是作為元素的非主盒子,所以為了不影響主盒子(目標元素的內容)的布局,需要:

    1. 讓偽元素脫離正常文檔流;
    2. 讓目標元素的主盒子成偽元素盒子的包含塊;

    所以需要

    1. 給目標元素設置樣式position: relative;
    2. 給偽元素::before設置樣式:
    position: absolute;
    width: 100%;
    height: 100%;
    

    最終,示例代碼如下:
    ** HTML結構:**

    <p>
     我是內容
    </p>
    

    CSS樣式:

    p {
        display: inline-block;
        position: relative;   /*為::before偽元素生成包含*/
    }
    p::before {
        content: '';
        position: absolute;  /*脫離文檔流*/
        width: 100%;
        height: 100%;
        
        /*目標元素的樣式*/
        border-color: red;
        border-width:1px;
        border-style: solid;
    }
    

    示例效果:

    偽元素.png

    注意:

    1. 虛線框只是用來標識元素的存在,并不表示元素的樣式;
    2. 如果樣式元素遮擋了目標元素的內容,則需要給樣式元素設置合適的層疊級別z-index;
  3. 對::before偽元素應用變換;
    CSS樣式:

    transform: skewX(45deg);
    

    示例效果:

    偽元素-變換.png

此方案優點:

  1. 原理直觀,易理解;
  2. 不用對目標內容再進行反向變換;
  3. 不用添加冗余元素;

此方案缺點:

  1. 只能把樣式及內容分離成2個獨立的部分,不對分成3個或者更多的獨立部分;

相關文章:CSS中特殊效果的實現方案

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,779評論 1 92
  • 本文轉載自:眾成翻譯譯者:為之漫筆鏈接:http://www.zcfy.cc/article/239原文:http...
    極樂君閱讀 7,392評論 1 62
  • 一:在制作一個Web應用或Web站點的過程中,你是如何考慮他的UI、安全性、高性能、SEO、可維護性以及技術因素的...
    Arno_z閱讀 1,200評論 0 1
  • 又叫馬兒跑 又叫馬兒不吃草
    林下生風閱讀 1,267評論 7 15
  • "目錄號: HY-14184A GPCR/G Protein- Macitentan丁基類似物是Macitenta...
    莫小楓閱讀 120評論 0 0