CSS Hack的一些知識

来源:http://www.cnblogs.com/xuxiuyu/archive/2016/10/22/5987940.html
-Advertisement-
Play Games

測試環境:Windows7 主要測試:IE6、IE7、IE8、Fire Fox3.5.6 次要測試:Chrome4.0、Opera10.10、Safari4.04、360瀏覽器3.1為了能夠讓多個Hack在同一個例子里,現對實例頁面做如下要求是: <!DOCTYPE html PUBLIC "-// ...


測試環境:Windows7
主要測試:IE6、IE7、IE8、Fire Fox3.5.6
次要測試:Chrome4.0、Opera10.10、Safari4.04、360瀏覽器3.1

為了能夠讓多個Hack在同一個例子里,現對實例頁面做如下要求是:

1、左右有兩個DIV分別是#menu,#content,字體顏色為白色。
2、#menu高度500px,#content高度600px。
3、#menu寬度200px,#content寬度是自適應(因為是自適應所以常用的加float的方法不能解決3pxBug)。
4、在#content中寫入一段文字且與紅色區域邊距為50px。

 

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  2. <html xmlns="http://www.w3.org/1999/xhtml">

  3. <head>

  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  5. <title></title>

  6. <style>

  7. body,div{margin:0; padding:0;}

  8. div{color:#fff;}

  9. #menu{width:200px; height:500px; background:#900; float:left;}

  10. #content{height:600px; padding-left:50px; background:#36f;}

  11. </style>

  12. </head>

  13. <body>

  14. <div id="menu"></div>

  15. <div id="content"></div>

  16. </body>

  17. </html>

  18. 代碼在各種瀏覽器下進行測試的結果如下:
  19. IE6
  20.  

  21. IE8、firefox、Opera、Chrome

  22.  

    通過瀏覽器的測試我們可以比較出:
    1、IE6與IE7效果對比基本一致,但IE6在兩個DIV中間出現了3像素的Bug,這也是非常有名的IE6 3像素Bug。註意:如果對IE6的這兩個經典的Bug不熟悉的話請看這兩篇文章:《3像素Bug》
    2、IE8和Fire Fox內,紅色區域(#menu)蓋住了藍色的區域(#content)。

    提出問題:
    1、解決自適應寬度情況下的IE6 3像素Bug(註:如果寬度是一定的,只需要加上浮動float即可解決,但是在寬度自適應的情況下此方法無效)
    2、解決位置不一致(例如#content中的文字)

    解決方法(利用CSSHack來解決):

  23.  

    * html
    IE6及更低版本的IE並不是將Html標簽認定為是最外層的元素,而是認為*(其中*並不是指通用選擇器)才是最外層的元素,而HTML被認為是它的子元素。另外只要第一個元素浮動第二個元素不浮動的話,就會出現3像素bug。
    因此既然只有IE6及更低版本“理解”* HTML,那麼它就可以作為一種hack來解決瀏覽器之間的不相容。
    修改代碼如下:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    2. <html xmlns="http://www.w3.org/1999/xhtml">

    3. <head>

    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    5. <title>CSS Hack-CSS</title>

    6. <style>

    7. body,div{margin:0; padding:0;}

    8. div{color:#fff;}

    9. * html #menu{margin-right:-3px;}

    10. #menu{width:200px; height:500px; background:#900; float:left;}

    11. #content{height:600px; padding-left:50px; background:#36f;}

    12. </style>

    13. </head>

    14. <body>

    15. <div id="menu"></div>

    16. <div id="content"></div>

    17. </body>

    18. </html>

    19. 通過上面各種瀏覽器的截圖比較可以發現到目前為止只有IE7及更低版本(以及360瀏覽器)顯示的此頁面才是我們想要的效果,然而非IE瀏覽器的#content的padding-left:50px無效果。如果你夠細心可能發現也只有IE7及更低版本(以及360瀏覽器)的藍色區域沒有被紅色區域所覆蓋,因此設置padding-left:50px;都被紅色區域覆蓋了,文字被紅色區域撐開,也可以說非IE瀏覽器中預設將藍色區域的文字設置為padding-left:200px;了(因為紅色區域的寬度是200px)。如果我們在非IE瀏覽器中也要設置內邊距為50px,那麼就得是250px才能達到我們想要的效果。但是如果只是單純的設置padding-left:250px;的話,IE7及更低版本(以及360瀏覽器)就真正的變成了250px了。
      有些朋友肯定會想到使用_Hack來解決此問題,如果這麼做的話IE7又不相容了。因此此方法不可行。
      <style>
      body,div{margin:0; padding:0;}
      div{color:#fff;}
      * html #menu{margin-right:-3px;}
      #menu{width:200px; height:500px; background:#900; float:left;}
      #conten{height:600px; padding-left:250px; _padding-left:50px; background:#36f;}
      </style>

      主要用於區分IE與非IE瀏覽器。(IE均“理解”\9)


      雖然\9Hack可以解決(上面例子)IE7中的#content文字位置的問題,但是到目前為止所有的IE均可“理解”此Hack。因此IE8設置成250px以後又被設置成了50px,因此此Hack不能徹底解決問題。代碼如下:

      <style>
      body,div{margin:0; padding:0;}
      div{color:#fff;}
      * html #menu{margin-right:-3px;}
      #menu{width:200px; height:500px; background:#900; float:left;}
      #conten{height:600px; padding-left:250px; padding-left:50px\9; background:#36f;}
      </style>


      意思是說所有的IE均設置左內邊距為50px;



      那麼朋友們肯定想到了,再設置一個只有IE8才認識的Hack,很遺憾的告訴你如果從正常的思路來理解的話針對IE8的CSSHack沒有。但是我們可以反過來想一想使用排除法將IE8排除。

      IE8 Hack
      <style>
      body,div{margin:0; padding:0;}
      div{color:#fff;}
      * html #menu{margin-right:-3px;}
      #menu{width:200px; height:500px; background:#900; float:left;}
      #conten{height:600px; padding-left:250px; *padding-left:50px; background:#36f;}
      </style>
      紅色部分便合起來可以算是IE8的Hack,因為*只有IE7及更低版本才能解析此Hack,因此IE8便會跳過 *padding-left:50px; 不解析此代碼,從而將IE8以下的版本排除。



      如果IE6、IE7、IE8的效果均不一致,那麼如何解決呢?

      舉例:
      假如IE6、IE7、IE8的DIV元素的左外邊距均不一致。可以作如下設置便可以解決此類問題:
      div
      {
      padding-left:250px; //解析到此處==>所有的IE均設置為250px
      *padding-left:50px; //解析到此處==>IE6和IE7設置為50px
      _padding-left:30px; //解析到此處==>IE6設置為30px
      }
      註:順序一定不能錯。

     


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

-Advertisement-
Play Games
更多相關文章
  • 自從在園子里,發表了兩篇如何基於Netty構建RPC伺服器的文章:談談如何使用Netty開發實現高性能的RPC伺服器、Netty實現高性能RPC伺服器優化篇之消息序列化 之後,收到了很多同行、園友們熱情的反饋和若幹個優化建議,於是利用閑暇時間,打算對原來NettyRPC中不合理的模塊進行重構,並且增 ...
  • 先貼代碼有空來寫內容。 備忘錄1 測試類 備忘錄2 測試類 memento3 ...
  • Django 最開源地方就是可以使用強大第三方插件1,Django預設沒有提供對象(Object)級別的許可權控制,我們可以通過該Django Guardian 擴展來幫助Django實現對象級別的許可權控制。 2,Python social auth 可以進行社交賬號認證/註冊機制支持如Google、 ...
  • 首先我們進一步理解什麼是對象關係映射模型? 它將對資料庫中數據的處理轉化為對對象的處理。如下圖所示: 入門簡單實例: hiberante 可以用在 j2se 項目,也可以用在 j2ee (web項目中),而struts是web框架,所以用在 web項目。 hibernate開發方式的主要兩種方式: ...
  • ...
  • 先貼代碼,有空來寫內容。 1.定義集合 import java.util.List; import java.util.ArrayList; 2.寫迭代器 3.測試迭代器 ...
  • 文檔目錄 本節內容: 簡介 一個快速示例 其它特性 啟動模板 如何使用 簡介 我們總是對不同的需求開發不同的應用。但至少在某些層面上,一次又一次地重覆實現通用的和類似的功能。如:授權,驗證,異常處理,日誌,本地化,資料庫連接管理,設置管理,審核日誌等功能。所以我們創建架構和最佳實踐,如分層和模塊架構 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> //方法一: var max=1; for(var ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...