css佈局之負margin妙用及其他實現

来源:http://www.cnblogs.com/jesse007/archive/2016/07/07/5650236.html
-Advertisement-
Play Games

相信大家在項目的開發中都遇到過這樣的需求,一行放X(X>1)個塊且相鄰塊之間的間距相同。 大概就是上面這個樣子,下麵介紹幾種實現的方式。 1.負margin大法 設置好元素的寬度和留白占滿父級的寬度,然後設置父級的margin-left為留白的負留白的寬度 *{ margin: 0; padding ...


相信大家在項目的開發中都遇到過這樣的需求,一行放X(X>1)個塊且相鄰塊之間的間距相同。

大概就是上面這個樣子,下麵介紹幾種實現的方式。

1.負margin大法

設置好元素的寬度和留白占滿父級的寬度,然後設置父級的margin-left為留白的負留白的寬度

<style type="text/css">

*{
margin: 0;
padding: 0;
}
img{
vertical-align: middle;
}

ul>li{
float: left;
}

ul>li>img{
width: 100%;
}

.test1{
padding: 0 2%;
margin-left: -3.3%;
}

.test1>li{
width: 30%;
margin-left: 3.3%;
}

</style>


<
p>1.關於負margin的實現,由於margin是基於父級計算的,會有一定的偏差,但是用於移動端上,誤差可以忽略不計</p> <ul class="test1 clearfix"> <li><img src="img/test.jpg"/></li> <li><img src="img/test.jpg"/></li> <li><img src="img/test.jpg"/></li> </ul>

上面的誤差是因為ul的margin和li的margin百分比的計算基於的元素不一樣導致的,但是在移動端上因為視窗的範圍有限,這個差別很小,在pc上一般使用px,所以可以忽略不計。(下麵還有更多的辦法)

2.各大網站的實現,在元素內部進行填充,使用box-sizing,需要ie8及以上才支持

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
img{
    vertical-align: middle;
}
.test1{
    padding: 0 2%;
    margin-left: -3.3%;
}
ul>li{
    float: left;
}
.test1>li{
    width: 30%;
    margin-left: 3.3%;
}
ul>li>img{
    width: 100%;
}
.test2>li{
    width: 33.3%;
    padding: 0 2%;
    box-sizing: border-box;
}
.test3{
    display: flex;
    justify-content: space-between;
    
}
.test3>li{
    width: 31.3%;
    padding: 0 2%;
    float: none;
}
.test4{
    width: 1200px;
    border: 1px solid red;
    margin-left: -3.33%;
}
.test4>li{
    width: 30%;
    margin-left: 3.33%;
}
</style>
<p>2.各大網站的實現,在元素內部進行填充,使用box-sizing,需要ie8及以上才支持</p>
        <ul class="test2 clearfix">
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
        </ul>

這種實現暫時還沒發現什麼缺點,代碼也簡單易懂(推薦)

3.彈性盒模型flex的實現,需要做相容處理(舊盒子+新盒子)

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
img{
    vertical-align: middle;
}
.test1{
    padding: 0 2%;
    margin-left: -3.3%;
}
ul>li{
    float: left;
}
.test1>li{
    width: 30%;
    margin-left: 3.3%;
}
ul>li>img{
    width: 100%;
}
.test2>li{
    width: 33.3%;
    padding: 0 2%;
    box-sizing: border-box;
}
.test3{
    display: flex;
    justify-content: space-between;
    
}
.test3>li{
    width: 31.3%;
    padding: 0 2%;
    float: none;
}
.test4{
    width: 1200px;
    border: 1px solid red;
    margin-left: -3.33%;
}
.test4>li{
    width: 30%;
    margin-left: 3.33%;
}
</style>
<p>3.彈性盒模型flex的實現,需要做相容處理(舊盒子+新盒子),僅為演示,沒做相容處理</p>
        <ul class="test3">
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
        </ul>

這種情況怎麼能少了我們flex呢,彈性盒模型應該是專門用來處理這種情況吧,但是又有新舊盒子模型之分,各瀏覽器實現的都不太一樣。所以一般情況兩套盒子模型的屬性都需要加上。(喜歡折騰就上吧,效果棒棒的)

4.classname實現

將需要特殊處理的元素加上單獨的class,再做相應的處理。可以後臺進行處理也可以前端處理(推薦後臺處理)

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
img{
    vertical-align: middle;
}
.test1{
    padding: 0 2%;
    margin-left: -3.3%;
}
ul>li{
    float: left;
}
.test1>li{
    width: 30%;
    margin-left: 3.3%;
}
ul>li>img{
    width: 100%;
}
.test2>li{
    width: 33.3%;
    padding: 0 2%;
    box-sizing: border-box;
}
.test3{
    display: flex;
    justify-content: space-between;
    
}
.test3>li{
    width: 31.3%;
    padding: 0 2%;
    float: none;
}
.test4{
    padding: 0 2%;
}
.test4>li{
    width: 30%;
    margin-left: 5%;
}
.test4>li.first{
    margin: 0;
}
.test5{
    padding: 0 2%;
}
.test5>li{
    width: 30%;
    margin-left: 5%;
}
.test5>li:first-child{
    margin: 0;
}
</style>
<p>4.classname實現</p>
        <ul class="test4 clearfix">
            <li class="first"><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
        </ul>

5.css選擇器實現

:first-child :first-type-of :nth-child() 這些實現都沒有什麼技術難點,大家可以去查閱一下css文檔,註意一下相容性沒問題了

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
img{
    vertical-align: middle;
}
.test1{
    padding: 0 2%;
    margin-left: -3.3%;
}
ul>li{
    float: left;
}
.test1>li{
    width: 30%;
    margin-left: 3.3%;
}
ul>li>img{
    width: 100%;
}
.test2>li{
    width: 33.3%;
    padding: 0 2%;
    box-sizing: border-box;
}
.test3{
    display: flex;
    justify-content: space-between;
    
}
.test3>li{
    width: 31.3%;
    padding: 0 2%;
    float: none;
}
.test4{
    padding: 0 2%;
}
.test4>li{
    width: 30%;
    margin-left: 5%;
}
.test4>li.first{
    margin: 0;
}
.test5{
    padding: 0 2%;
}
.test5>li{
    width: 30%;
    margin-left: 5%;
}
.test5>li:first-child{
    margin: 0;
}
</style>
<p>5.css選擇器實現(註意ie相容性)</p>
        <ul class="test5 clearfix">
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
            <li><img src="img/test.jpg"/></li>
        </ul>

貼上全部的DEMO

差點忘了還有一種情況X=2時,設置好width,左邊左浮動,右邊右浮動。

其實X=3時,還有一種處理方式,左右元素分別左右浮動,中間元素相對於父級設置絕對定位,居中定位。

註意由於不能整除的原因,不能像box-sizing那樣完美的計算,但是合理的應用在項目上完全沒問題。

個人思路畢竟有限,如果大家還有什麼其他方案,歡迎留言。


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

-Advertisement-
Play Games
更多相關文章
  • 本章內容: 簡介 變數 運算符 算術運算符 比較運算符 邏輯運算符 數據類型 語句 簡介 定義 javascript是一門動態的、弱類型的解釋型編程語言,增強頁面動態效果,實現頁面與用戶之間的實時、動態交互。 javascript由三部分組成:ECMAScript、DOM和BOM ECMAScrip ...
  • 開發工具採用WebStorm,沒破解,使用了過期策略:安裝之後不著急打開程式,先設置系統日期為未來的某個日期,比如2020年。然後再打開程式,試用。然後再改回來系統日期。雖然每次打開WebStorm都會提示: 不過不影響使用,點擊“OK”繼續吧。 項目採用anguarjs seed項目作為基礎框架, ...
  • 原文地址:http://www.3lian.com/edu/2015/01-31/191131.html 原文地址:http://www.3lian.com/edu/2015/01-31/191131.html 詳解CSS的相對定位和絕對定位 感謝 3lian8 的投遞 時間:2015-01-31 ...
  • 當用百分比作為寬高時 因為百分比是相對於其最近的父元素的寬高,所以首先其父元素要有寬高,寬度一般不設置會有預設值(比如整個屏幕的寬度),但是高度不設置就沒有預設值,因此如果父元素沒設高度值,而其內部元素用了百分比作為高度時,是沒有效果的 ...
  • 今年項目的需要,開始琢磨研究前端開發,由於之前項目已經用Angularjs了,就順其而然的繼續沿用。 在使用Angularjs之前,先要準備好工具:Nodejs、npm、git、bower、fis 下麵是各個工具的安裝方法(開發機為64位的Win10): 1.Nodejs1>下載安裝:https:/ ...
  • 響應式佈局可以為不同終端的用戶提供更加舒適的界面和更好的用戶體驗,而且隨著目前大屏幕移動設備的普及,用"大勢所趨"來形容也不為過。隨著越來越多的設計師採用這個技術,我們不僅看到很多的創新,還看到了一些成形的模式。隨著技術的發展css3的特性也被廣泛應用開來,它的很多新標簽也非常好用而且非常容易學習, ...
  • 項目中用到的跨域 ,在除IE9以下的瀏覽器上運行都是沒有問題的,IE8 IE9中報錯,error :no transport; 網上解決辦法均是 在發起請求之前添加 jQuery.support.cors=true;但是,線下測試,是ok的,一放到伺服器上,又出現了新的eroor:readyStat ...
  • 在React中,當涉及組件嵌套,在父組件中使用 把所有子組件顯示出來。如下: function ParentComponent(props){ return ( {props.children} ) } 如果想把父組件中的屬性傳給所有的子組件,該怎麼做呢? 使用 幫助方法就可以做到。 比如,把幾個R ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...