CSS display 屬性詳解

来源:https://www.cnblogs.com/pxtxws/archive/2018/04/06/8729074.html
-Advertisement-
Play Games

display的所有屬性 下麵就display的重要屬性進行講解,並配合一些相關的例子 基本屬性 display: none none 是 CSS 1 就提出來的屬性,將元素設置為none的時候既不會占據空間,也無法顯示,相當於該元素不存在。 該屬性可以用來改善重排與重繪,同時我也經常用它來做模態窗 ...


display的所有屬性

{/* CSS 1 */
display: none;
display: inline;
display: block;
display: list-item;
/* CSS 2.1 */
display: inline-block;
display: table;
display: inline-table;
display: table-cell;
display: table-column;
display: table-column-group;
display: table-footer-group;
display: table-header-group;
display: table-row;
display: table-row-group;
display: table-caption;
/* CSS 2.1 */
/* CSS 3 */
display: inline-list-item;
display: flex;
display: box;
display: inline-flex;
display: grid;
display: inline-grid;
display: ruby;
display: ruby-base;
display: ruby-text;
display: ruby-base-container;
display: ruby-text-container;
/* CSS 3 */
/* Experimental values */
display: contents;
display: run-in;
/* Experimental values */
/* Global values */
display: inherit;
display: initial;
display: unset;}

下麵就display的重要屬性進行講解,並配合一些相關的例子

基本屬性

display: none

none 是 CSS 1 就提出來的屬性,將元素設置為none的時候既不會占據空間,也無法顯示,相當於該元素不存在。

該屬性可以用來改善重排與重繪,同時我也經常用它來做模態窗等效果。

display: inline

inline也是 CSS 1 提出的屬性,它主要用來設置行內元素屬性,設置了該屬性之後設置高度、寬度都無效,同時text-align屬性設置也無效,但是設置了line-height會讓inline元素居中


同時從上圖可以看到兩個inline標簽之間出現了奇怪的間隔,改間隔的原因是div換行產生的換行空白,解決辦法

  • 將兩個inline標簽寫到一行

<body>
  <div class="test">123</div><div class="test">123</div>
</body>
  • 或者使用一點技巧

<div class="main">
    <div class="test">zhan</div>
    <div class="test">123</div>
  </div>

<style>
html{
  -webkit-text-size-adjust:none;/* 使用webkit的私有屬性,讓字體大小不受設備終端的調整,可定義字體大小小於12px */
}
.main{
  font-size:0;
  *word-spacing:-1px;/* 使用word-spacing 修複 IE6、7 中始終存在的 1px 空隙,減少單詞間的空白(即字間隔) */
}
.test{
  display:inline;
  width: 10000px;
  height:10000px;
  border:1px solid;
  font-size:12px;
  letter-spacing: normal;/* 設置字母、字間距為0 */ 
  word-spacing: normal; /* 設置單詞、欄位間距為0 */
}
</style>

實測chome49瀏覽器只用設置父元素的font-size為0即可。
目前有很多原生的元素都是inline的,span、a、label、input、 img、 strong 和em就是典型的行內元素元素。
鏈接:http://www.css88.com/archives...

display: block

設置元素為塊狀元素,如果不指定寬高,預設會繼承父元素的寬度,並且獨占一行,即使寬度有剩餘也會獨占一行,高度一般以子元素撐開的高度為準,當然也可以自己設置寬度和高度。

在設計的過程中有時需要設計一個div寬高都是整個屏幕,整個時候寬度很好設置,可是高度一般很難設置,因為頁面一般都是可以滾動的,所以高度一般可變,所以這個時候可以使用一個小技巧,如下。

 <div class="main">
  </div>
<style>
html{
  height: 100%;
}
body{
  height: 100%;
  padding: 0;
  margin:0;
}
.main{
  background: red;
  width: 100%;
  height: 100%;
}
</style>

基本原理:div繼承的是父元素body的高度,body是繼承html的高度,html是繼承的瀏覽器屏幕的高度。

display: list-item

此屬性預設會把元素作為列表顯示,要完全模仿列表的話還需要加上 list-style-position,list-style-type

<div>
  <span>111111</span>
  <span>222222</span>
  <span>333333</span>
</div>

<style>
div{
  padding-left:30px;
}
span{ 
  display:list-item;
  list-style:disc outside none;
}
</style>

效果圖如下:

通過上面樣式設置,就能仿出一個類似的列表,一定要在div上加padding,因為預設的列表之前的·在box外面

display: inline-block

inline-block為 CSS 2.1 新增的屬性。 inline-block既具有block的寬高特性又具有inline的同行元素特性。 通過inline-block結合text-align: justify 還可以實現固定寬高的列表兩端對齊佈局,如下例子:

<div class="main">
  <div class="col col1">111111</div>
  <div class="col col2">222222</div>
  <div class="col col3">333333</div>
  <div class="col col1">111111</div>
  <div class="col col2">222222</div>
  <div class="col col3">333333</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
</div>

<style>
body{
  margin:0;
  padding:0; 
}
.main{
  text-align:justify;
}
.col{ 
  display: inline-block;
  margin-top:10px;
  width:100px;
  height: 100px;
  text-align: center;
  line-height: 100px;
  color: #fff;
}
.col1{
  background: red;
}
.col2{
  background: green;
}
.col3{
  background: blue;
}
.fix{
  height:0; 
  padding:0; 
  overflow:hidden;
}
</style>

效果圖如下:


text-align: justify 屬性會使行內元素兩端對齊,但是要求這些行內元素總寬度至少占滿一行,所以在總寬度不足一行的時候這個屬性沒用,因此在最後需要加上一些占位符。
詳情可以查看 張鑫旭老師的博客
Tip: inline-block會形成一個BFC

display: table

table 此元素會作為塊級表格來顯示(類似table),表格前後帶有換行符。CSS表格能夠解決所有那些我們在使用絕對定位和浮動定位進行多列佈局時所遇到的問題。例如,display:table的CSS聲明能夠讓一個HTML元素和它的子節點像table元素一樣。使用基於表格的CSS佈局,使我們能夠輕鬆定義一個單元格的邊界、背景等樣式, 而不會產生因為使用了table那樣的製表標簽所導致的語義化問題。

利用table的特性,我們能夠輕易的實現三欄佈局,並且能夠相容IE8,如下是使用table屬性,實現三欄佈局的例子:

<div class="main">
  <div class="tr tr1">
    <div class="td">head1</div>
    <div class="td">head2</div>
    <div class="td">head3</div>
  </div>
  <div class="tr tr2">
    <div class="td">123</div>
    <div class="td">123</div>
    <div class="td">123</div>
  </div>
</div>

<style>
.main{
  display: table;
  width:100%;
  border-collapse: collapse;/*為表格設置合併邊框模型:*/
}
.tr{
  display: table-row;
  border-color: inherit;
}
.tr1 .td{
  height:50px;
  vertical-align: middle;
}
.td{
  display: table-cell;
  border: 1px solid;
}
.td:nth-of-type(1){
  width: 100px;
}
.td:nth-of-type(3){
  width: 100px;
}
</style>

效果如下圖:

CSS2.1表格模型中的元素,可能不會全部包含在除HTML之外的文檔語言中。這時,那些“丟失”的元素會被模擬出來,從而使得表格模型能夠正常工作。所有的表格元素將會自動在自身周圍生成所需的匿名table對象,使其符合table/inline-table、table-row、table-cell的三層嵌套關係。

所以在一般情況下我們也可以不寫外面的table-row元素以及table元素。

display: inline-list-item

我在MDN上面看到有這個屬性,但是我實際嘗試發現這個屬性是不能使用的,在 http://caniuse.com/#search=in... 上面也沒有找到這個元素的相容性,所以應該是不能使用的,支持度全無

display: flex

flex是一種彈性佈局屬性
註意,設為Flex佈局以後,子元素的float、clearvertical-align屬性將失效。
主要屬性有兩大類:容器屬性和項目的屬性

容器屬性

  • flex-direction: 屬性決定主軸的方向(即項目的排列方向)。

  • flex-wrap: 預設情況下,項目都排在一條線(又稱”軸線”)上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。

  • flex-flow: 屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,預設值為row nowrap

  • justify-content: 屬性定義了項目在主軸上的對齊方式。

  • align-items: 屬性定義項目在交叉軸上如何對齊。

  • align-content: 屬性定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。

項目屬性

  • order: 定義項目的排列順序。數值越小,排列越靠前,預設為0。

  • flex-grow: 定義項目的放大比例,預設為0,即如果存在剩餘空間,也不放大。

  • flex-shrink: 屬性定義了項目的縮小比例,預設為1,即如果空間不足,該項目將縮小。

  • flex-basis: 屬性定義了在分配多餘空間之前,項目占據的主軸空間(main
    size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的預設值為auto,即項目的本來大小。

  • flex: 屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,預設值為0 1 auto。後兩個屬性可選。

  • align-self:
    屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。預設值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch

以上關於flex的基礎知識基本是從阮一峰老師那copy過來的,有興趣的同學,可以到阮一峰老師的博客深入閱讀
http://www.ruanyifeng.com/blo...
http://www.ruanyifeng.com/blo...

實例:實現一個固定寬度但內容可變的列表

目前我有一個需求,有一個列表頁,左側固定,右側固定,總寬度固定,但是左側的內容可能會增加,右側的內容也可能會增加,要求平時一行展示,增加的時候兩行展示,左側兩行,右側還是一行,並且都居中。

先上效果圖,不然可能會迷糊:

為了實現上述效果,代碼如下

 <div class="main">
    <ul>
      <li>
        <span class="col1">累積的分為:123</span>
        <div class="col2">
          <span>123</span>
          <span>x 10</span>
          <button>submit</button>
        </div>
      </li>
      <li>
        <span class="col1">累積的分為:1234</span>
        <div class="col2">
          <img src="http://7xltvd.com1.z0.glb.clouddn.com/css1.png" alt="">
          <span class="col2-span">x 10</span>
          <button>submit</button>
        </div>
      </li>
    </ul>
  </div>
<style>
.main{
  height: 200px;
  width: 300px;
  border: 1px solid;
}
ul{
  padding: 0px;
  margin-top: 10px;
}
li{
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 0;
  margin-bottom: 10px;
  border: 1px solid;
}
button{
  height: 20px;
  vertical-align: middle;
  border:0;
  background: green;
  outline:none;
}
img{
  width:30px;
  vertical-align: middle;
}
.col2-span{
  vertical-align: middle;
}
.col1{
  width: 130px;
  padding-left:8px;
}
.col2{
  padding-right: 8px;
  vertical-align: middle;
}
</style>

display: -webkit-box

由於某X5瀏覽器某些版本還不支持最新版的flex佈局,所以為了保證良好的運行,建議還是使用display: boxbox和flex佈局的主要差別如下:

容器屬性

  • display: box 該顯示樣式的新值可將此元素及其直系子代加入彈性框模型中。Flexbox 模型只適用於直系子代。

  • box-orient 值:horizontal | vertical | inherit
    框的子代是如何排列的?還有兩個值:inline-axis(真正的預設值)和 block-axis,但是它們分別映射到水平和垂直方向。

  • box-pack 值:start | end | center | justify 設置沿 box-orient
    軸的框排列方式。因此,如果 box-orient 是水平方向,就會選擇框的子代的水平排列方式,反之亦然。

  • box-align 值:start | end | center | baseline | stretch 基本上而言是 box-pack
    的同級屬性。設置框的子代在框中的排列方式。如果方向是水平的,該屬性就會決定垂直排列,反之亦然。

項目屬性

  • box-flex 值:0 | 任意整數 該子代的彈性比。彈性比為 1 的子代占據父代框的空間是彈性比為 2 的同級屬性的兩倍。其預設值為0,也就是不具有彈性。

用box改造上述例子
基本只修改了容器元素li的屬性,如下所示

li{
  display: -webkit-box;
  -webkit-box-orient:horizontal;
  -webkit-box-pack: justify;
  -webkit-box-align: center;
  padding: 10px 0;
  margin-bottom: 10px;
  border: 1px solid;
}

display: inline-flex

我發現在chrome條件下設置了inline-flex,其子元素全部變成了inline模式,設置flex並沒有什麼用,不知道是不是我寫的有問題,目前沒找到這個屬性的用法

<div class="main">
    <div class="sp1">123</div>
    <div class="sp1">123</div>
  </div>
<style>
.main{
  display: -webkit-inline-flex;
  justify-content: center;
}
.sp1{
  flex:1;
}
</style>

其他

以下屬性是實驗性質的,支持度都很低,不建議使用,知道就行。

  • run-in: 此元素會根據上下文作為塊級元素或內聯元素顯示;

  • grid: 柵格模型,類似block

  • inline-grid: 柵格模型,類似inline-block

  • ruby, ruby-base, ruby-text, ruby-base-container,ruby-text-container

  • contents

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡使用了迴圈刪除,並不是最優的方法,歡迎園友不吝批評指正。 ...
  • 在SQL Server的資料庫維護過程中,有時候在一些特殊情況下需要在單用戶模式下啟動SQL Server實例。 下麵總結一下單用戶模式啟動SQL Server的幾種方式: 1:命令模式(sqlservr.exe)啟動 首先在命令視窗中切換到Binn目錄(這個要視SQL Server實際安裝路徑情況... ...
  • 移動設備抓包主要方式 一、PC上設置網路共用,生成Wi Fi熱點供移動設備使用,PC上再使用tcpdump、Wireshark等捕獲分析; 二、PC上開啟http代理工具伺服器(如Charles、fiddler),移動設備再通過該HTTP代理上網(只能抓去HTTP/HTTPs); 三、使用管道工具將 ...
  • 開題:之前就有所耳聞,最近兩天第一次運用到圖標字體。剛開始嘛,一臉懵逼的狀態。成功運用之後就來記錄一下使用過程咯! 1. 打開線上生成工具:https://icomoon.io/app/#/select 2. 導入本地文件或者選擇圖標庫 (1) 如果你本地沒有.svg圖標,你可以選擇線上免費的圖標。 ...
  • Nodejs設計的核心理念:1.事件迴圈;2.模式;3.差錯處理;4.運用多處理器 ...
  • 時間關係長話短說,今天把文章編輯和刪除功能實現了。 本來是要單獨做兩個按鈕來選擇列表中的所有朋友圈文章,但是老師想偷懶……所以我也就跟著偷懶了。 編輯文章部分,可以獲取每條朋友圈的標題和內容。 第一步編輯的時候要打開編輯框,改動之後再保存至資料庫。 測試刪除這條數據。 有一個刪除的提示,也是用的el ...
  • 1)基礎 學習目的: 1. 客戶端表單驗證 2. 頁面動態效果 3. jQuery的基礎 什麼是JavaScript? 一種描述性語言,也是一種基於對象和事件驅動的,並具有安全性能的腳本語言 javaScript是一種基於對象和事件驅動的,並具有安全性能的腳本語言 解釋執行javaScript特點向 ...
  • 定義: 保證一個對象(類)僅有一個實例,並提供一個訪問它的全局訪問點; 實現原理: 利用閉包來保持對一個局部變數的引用,這個變數保存著首次創建的唯一的實例; 主要用於: 全局緩存、登錄浮窗等只需要唯一一個實例的時候; Part1、命名空間的管理員開發中經常會遇到不同的人定義的變數使用的單詞可能會重覆 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...