主頁 > 企業開發 > 巧用 display: contents 增強頁面語意

巧用 display: contents 增強頁面語意

2020-09-14 10:50:55 企業開發

display: contents 是一個比較陌生的屬性,雖然屬于 display 這個基本上是最常見的 CSS 屬性,但是 contents 這個取值基本不會用到,但是它早在 2016 年就已經得到了 Firefox 的支持,

本文將深入一下這個有意思的屬性值,

基本用法

根據 W3C 對 display: contents 的定義,

The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes and text runs as normal. For the purposes of box generation and layout, the element must be treated as if it had been replaced in the element tree by its contents (including both its source-document children and its pseudo-elements, such as ::before and ::after pseudo-elements, which are generated before/after the element’s children as normal).

簡單翻譯一下即是,將設定了該屬性值的元素本身將不會產生任何盒子,但是它的從保留其子代元素的正常展示,

看個簡單的例子,有如下簡單三層結構:

<div >
    <div >
        <div ></div>
    </div>
</div>

簡單的 CSS 如下:

.container {
    width: 200px;
    height: 200px;
    background: #bbb;
}

.wrap {
    border: 2px solid red;
    padding: 20px;
    box-sizing: border-box;
}

.inner {
    border: 2px solid green;
    padding: 20px;
    box-sizing: border-box;
}

表現如下:

image

這個非常好理解,但是如果,我們給中間層的容器添加上 display: contents,再看看效果:

<div >
    <div  style="display: contents">
        <div ></div>
    </div>
</div> 

image

可以看到,沒有了中間層的 border: 2px solid red 的紅色邊框,整個 .wrap div 好像不存在一樣,但是它的子元素卻是正常的渲染了,

重點,設定了display: contents的元素本身不會被渲染,但是其子元素能夠正常被渲染,

這個屬性我一直在思考有什么非常適合的使用點,

總結來說,這個屬性適用于那些充當遮罩(wrapper)的元素,這些元素本身沒有什么作用,可以被忽略的一些布局場景,

 

充當無語意的包裹框

最近寫 React、Vue 的時候,發現這個屬性在寫 JSX 的時候能有很好的作用,并且也非常符合這個屬性本身的定位,

我們在寫 React、RN 時,經常需要輸出一段模板,

return (
    <div >
        <h2>Title</h2>
        <div>...</div>
    </div>
)

我們只是想輸出 .wrap div 內的內容,但是由于框架要求,輸出的 JSX 模板必須包含在一個父元素之下,所以不得已,需要添加一個 .wrap 進行包裹,但是這個 .wrap 本身是沒有任何樣式的,

如果輸出的元素是要放在其他 display: flexdisplay: grid 容器之下,加了一層無意義的 .wrap 之后,整個布局又需要重新進行調整,麻煩,

一種方法是使用框架提供的容器 <React.Fragment>,它不會向頁面插入任何多余節點,

在 Vue 中類似的是 <template> 元素, <template> 也是不會被渲染在 DOM 樹中,查看頁面結構也無法看到,但是 display: contents 是存在于頁面結構中的,只是沒有生成任何盒子,

這個多出來的父元素其實是沒必要的,這個時候,我們也可以添加上 display: contents,像是這樣:

return (
    <div  style="display: contents">
        <h2>Title</h2>
        <div>...</div>
    </div>
)

這樣,它既起到了包裹的作用,但是在實際渲染中,這個 div 其實沒有生成任何盒子,一舉兩得,并且像一些 flex 布局、grid 布局,也不會受到影響,

Codepen Demo -- display: contents | display: flex 的穿透影響

 

讓代碼更加符合語意化

考慮這個非常實際的場景,現在我們的頁面上充斥了大量的可點擊按鈕,或者點擊觸發相應功能的文字等元素,但是,從語意上而言,它們應該是一個一個的 <button>,但是實際上,更多時候我們都是使用了 <p>、<div>、<a> 等標簽進行了模擬,給他們加上了相應的點擊事情而已,

像是下面這樣,雖然沒什么問題,但是相對而言不那么符合語意化:

<p >
    Button
</p>
<p >
    Click Me
</p>
.button {
    width: 120px;
    line-height: 64px;
    text-align: center;
    background-color: #ddd;
    border: 2px solid #666;
}

 

我們不使用 <button> 的原因有很多,<button> 相對 div 而言沒那么好控制,且會引入很多默認樣式,但是,有了 display: contents,我們可以讓我們的代碼既符合語意化,同時不需要去解決 <button> 帶來的一些樣式問題:

<p >
    <button style="display: contents">
        Button
    </button>
</p>
<p >
    <button style="display: contents">
        Click Me
    </button>
</p>

添加了 <button style="display: contents">Click Me</button> 的包裹,不會對樣式帶來什么影響,button 也不會實際渲染在頁面結構中,但是頁面的結構語意上好了不少,

CodePen Demo -- Button with display: contents

對于對頁面結構、語意化有強迫癥的一些同學而言,靈活運用這個屬性可以解決很多問題,

  

在替換元素及表單元素中一些有意思的現象

display: contents 并非在所有元素下的表現都一致,

對于可替換元素及大部分表單元素,使用 display: contents 的作用類似于 display: none

也就是說對于一些常見的可替換元素、表單元素:

  • <br>
  • <canvas>
  • <object>
  • <audio>
  • <iframe>
  • <img>
  • <video>
  • <frame>
  • <input>
  • <textarea>
  • <select>

作用了 display: contents 相當于使用了 display: none ,元素的整個框和內容都沒有繪制在頁面上,

<button> 的一些異同

與其他表單元素不一樣,正常而言,添加了 display: contents 相當于被隱藏,不會被渲染,但是實際運用程序中發現,<button></button> 如果包裹了內容,其一些可繼承樣式還是會被子內容繼承,這個實際使用的程序中需要注意一下,

 

對 A11Y 的影響

在一些外文檔案中有一些討論是關于 display: contents 的使用會影響到頁面的可訪問性,例如作用了 display: contents 的容器及串列,會對頁面的可訪問性帶來一些意外結果,

  • [css-a11y][css-display] display: contents; strips semantic role from elements

這個我看暫時沒有明確的結論,如果你的頁面對可訪問性的要求很高,具體使用的此屬性的話也是需要注意一下這一點,

 

CSS 中類似的一些影響布局的屬性

CSS 本身其實也在一直在努力,增加了各種屬性去讓我們在布局上有更多的空間與控制權,總而言之給我的感受是讓 CSS 更加的像是一個完整的工程而不僅僅只是展現樣式,

類似的一些有意思的屬性:

  • CSS新特性contain,控制頁面的重繪與重排

 

CAN I USE

看看兼容性,

 image

不算太慘淡,但也不算全面普及,考慮用在一些漸進增強的場景當中,

 

參考

  • How display: contents; Works
  • CSS的display:contents
  • Display: Contents Is Not a CSS Reset

 

最后

好了,本文到此結束,希望對你有幫助 :)

更多精彩 CSS 技術文章匯總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏,

更多精彩有趣的 CSS 效果,歡迎來這里看看 CSS 靈感 -- 在這里找到寫 CSS 的靈感,

如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/34096.html

標籤:Html/Css

上一篇:BFC是個啥?

下一篇:3.柵格系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more