深入理解CSS盒模型 - 程序猿的程 - 博客園

深入理解CSS盒模型

?本文是學習中傳思客在慕課網開的課程《前端跳槽面試必備技巧》的學習筆記。課程地址:https://coding.imooc.com/class/evaluation/129.html#Anchor。

 如果你在面試的時候面試官讓你談談對盒模型的理解,你是不是不知從何談起。這種看似簡單的題其實是最不好答的。

? 下面本文章將會從以下幾個方面談談盒模型。

  • 基本概念:標準模型 和IE模型
  • CSS如何設置這兩種模型
  • JS如何設置獲取盒模型對應的寬和高
  • 實例題(根據盒模型解釋邊距重疊)
  • BFC(邊距重疊解決方案)

?

基本概念

盒模型的組成大家肯定都懂,由里向外content,padding,border,margin.

盒模型是有兩種標準的,一個是標準模型,一個是IE模型。

?

?從上面兩圖不難看出在標準模型中,盒模型的寬高只是內容(content)的寬高,

而在IE模型中盒模型的寬高是內容(content)+填充(padding)+邊框(border)的總寬高。

?

css如何設置兩種模型

這里用到了CSS3 的屬性 box-sizing

/* 標準模型 */
box-sizing:content-box;/*IE模型*/
box-sizing:border-box;

?

JS獲取寬高

通過JS獲取盒模型對應的寬和高,有以下幾種方法:

為了方便書寫,以下用dom來表示獲取的HTML的節點。

1. ?dom.style.width/height?

  這種方式只能取到dom元素內聯樣式所設置的寬高,也就是說如果該節點的樣式是在style標簽中或外聯的CSS文件中設置的話,通過這種方法是獲取不到dom的寬高的。

?2. dom.currentStyle.width/height?

  這種方式獲取的是在頁面渲染完成后的結果,就是說不管是哪種方式設置的樣式,都能獲取到。

  但這種方式只有IE瀏覽器支持。

?3. window.getComputedStyle(dom).width/height

  這種方式的原理和2是一樣的,這個可以兼容更多的瀏覽器,通用性好一些。

?4. dom.getBoundingClientRect().width/height

  這種方式是根據元素在視窗中的絕對位置來獲取寬高的

?5.dom.offsetWidth/offsetHeight

  這個就沒什么好說的了,最常用的,也是兼容最好的。

?

邊距重疊

什么是邊距重疊

如下圖,父元素沒有設置margin-top,而子元素設置了margin-top:20px;可以看出,父元素也一起有了邊距。

上圖的代碼

?

復制代碼

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;}.demo{height:100px;background: #eee;}.parent{height:200px;background: #88f;}.child{height:100px;margin-top:20px;background: #0ff;width:200px;}</style>
</head>
<body><section class="demo"><h2>此部分是能更容易看出讓下面的塊的margin-top。</h2></section><section class = "parent"><article class="child"><h2>子元素</h2>margin-top:20px;</article><h2>父元素</h2>沒有設置margin-top</section>
</body>
</html>

復制代碼

?

邊距重疊解決方案(BFC)

首先要明確BFC是什么意思,其全英文拼寫為 Block Formatting Context 直譯為“塊級格式化上下文”

BFC的原理

  1. 內部的box會在垂直方向,一個接一個的放置
  2. 每個元素的margin box的左邊,與包含塊border box的左邊相接觸(對于從做往右的格式化,否則相反)
  3. box垂直方向的距離由margin決定,屬于同一個bfc的兩個相鄰box的margin會發生重疊
  4. bfc的區域不會與浮動區域的box重疊
  5. bfc是一個頁面上的獨立的容器,外面的元素不會影響bfc里的元素,反過來,里面的也不會影響外面的
  6. 計算bfc高度的時候,浮動元素也會參與計算

?怎么取創建bfc

  1. float屬性不為none(脫離文檔流)
  2. position為absolute或fixed
  3. display為inline-block,table-cell,table-caption,flex,inine-flex
  4. overflow不為visible
  5. 根元素

應用場景

  1. 自適應兩欄布局
  2. 清除內部浮動?
  3. 防止垂直margin重疊

看一個垂直margin重疊例子

代碼

復制代碼

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;}.top{background: #0ff;height:100px;margin-bottom:30px;}.bottom{height:100px;margin-top:50px;background: #ddd;}</style>
</head>
<body><section class="top"><h1>上</h1>margin-bottom:30px;</section><section class="bottom"><h1>下</h1>margin-top:50px;</section></body>
</html> 

復制代碼

?

?效果圖

?用bfc可以解決垂直margin重疊的問題

關鍵代碼

復制代碼

<section class="top"><h1>上</h1>margin-bottom:30px;</section><!-- 給下面這個塊添加一個父元素,在父元素上創建bfc --><div style="overflow:hidden"><section class="bottom"><h1>下</h1>margin-top:50px;</section></div>

復制代碼

?

效果圖?

?

關于bfc的應用的案例這里就不在一一舉出了,大家去網上找一些其他的文章看一下。

?

歡迎補充

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249075.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯——機器人行走

某少年宮引進了一批機器人小車。可以接受預先輸入的指令&#xff0c;按指令行動。小車的基本動作很簡單&#xff0c;只有3種&#xff1a;左轉&#xff08;記為L&#xff09;&#xff0c;右轉&#xff08;記為R&#xff09;&#xff0c;向前走若干厘米&#xff08;直接記數字&am…

JavaWeb:腳本標識

腳本標識 一、JSP表達式 1、介紹 用于向頁面中輸出信息 2、語法格式 <% 表達式%>3、注意 在"<%"和""之間不允許有空格&#xff0c;但是在""后面的表達式之間可以有空格不僅可以插入到網頁中&#xff0c;還可以插入到HTML標記中&#xf…

線程死鎖問題

1 package com.demo.bingfa;2 3 /**4 * java并發編程中&#xff0c;死鎖的概念5 *6 * 我們啟用了兩個線程&#xff0c;分別搶占2個資源&#xff0c;但這兩個資源又分別被不同的對象&#xff08;字符串&#xff09;鎖住了。7 * 當第一個線程調用 resource1 方法&#xff0c;…

CSS的4個簡寫

CSS的4個簡寫 2010-12-13 18:50 聶微東 閱讀(1547) 評論(3) 編輯 收藏 1.background 簡寫屬性在一個聲明中設置所有的背景屬性: background-colorbackground-imagebackground-repeatbackground-attachmentbackground-position 例如: background: #444444 url(image.png…

spring boot 整合 (全)

參考: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples轉載于:https://www.cnblogs.com/lshan/p/9924005.html

使用PM2搭建在線vue.js開發環境(以守護進程方式熱啟動)

項目以vue.jslayUI的作為前端開發技術棧&#xff0c;需要有一個在線的環境供項目成員實時查看效果&#xff0c;總不能每次都webpack打包發布后才能看到效果吧&#xff01;剛開始就簡單使用npm run dev命令熱啟動&#xff0c;但是shell命令窗口退出后&#xff0c;熱啟動也就失效…

微信小程序工具類

wechat-common-sdk ? 場景&#xff1a;目前工作中的項目需要包含并使用另一個項目。 也許是第三方庫&#xff0c;或者你獨立開發的&#xff0c;用于多個父項目的庫。 現在問題來了&#xff1a;你想要把它們當做兩個獨立的項目&#xff0c;同時又想在一個項目中使用另一個。 我…

zabbix實現mysql數據庫的監控

先來介紹zabbix中幾個常用的術語&#xff1a; 主機&#xff08;host&#xff09;&#xff1a; 要監控的網絡設備&#xff0c;可由ip或DNS名稱指定。 主機組&#xff08;host group&#xff09;&#xff1a; 主機的邏輯容器&#xff0c;可以包含主機和模板&#xff…

VSCode配合eslint進行JavaScript質量檢查

寫在開始前&#xff1a;如有不準確的地方希望大家提出&#xff0c;文章可以改知識不能錯。 創建一個項目 這里已node項目為例 npm init 根據提示填寫相關信息 安裝eslint npm install eslint --save也可以全局安裝 npm install eslint -g初始化 eslint文件 eslint --init執行命…

未找到導入的項目,請確認 Import 聲明中的路徑正確

VS2017打開以前vs版本開發的項目 <Import Project"$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project"$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" /> 修改V12…

修改Jupyter的工作空間

修改Jupyter的工作空間 1、安裝Jupyter Notebook 剛安裝完并配置好Sublime Text 3后被學長推薦使用Jupyter notebook&#xff0c;于是就想著看看試試有沒有他說的那么好。 安裝&#xff1a;命令行直接pip install jupyter(前提是先安裝好了python和pip) 2、安裝完后困惑 這么大…

bzoj [Usaco2009 Hol]Cattle Bruisers 殺手游戲

Description Input 第1行輸入N&#xff0c;R&#xff0c;BX&#xff0c;BY, BVX&#xff0c;BVY&#xff0c;之后N行每行輸入四個整數Xi&#xff0c;Yi&#xff0c;VXi&#xff0c;VYi&#xff0e; Output 一個整數&#xff0c;表示在逃脫過程中&#xff0c;某一個時刻最多有這…

Visual Studio Code 使用 ESLint 增強代碼風格檢查 - gyzhao - 博客園

前言 在團隊協作開發中&#xff0c;為了統一代碼風格&#xff0c;避免一些低級錯誤&#xff0c;應該設有團隊成員統一遵守的編碼規范。很多語言都提供了Lint工具來實現這樣的功能&#xff0c;JavaScript也有類似的工具&#xff1a;ESLint。除了可以集成到構建工具中(如&#x…

CS 325 HW

代做CS 325作業、代寫C, C/Python編程設計作業、代做Python/c實驗作業CS 325 – HW 51. (6 points) Consider an undirected graph G(V,E) with nonnegative edge weights w(u,v)0. Supposethat you have computed a minimum spanning tree G, and that you have also computed…

express下使用ES6 - dtdxrk - 博客園

express下使用ES6 1 2 3 4 5 6 7 8 9 //環境切換配置 package.json scripts:{ "service": "NODE_ENVproduction PORT3000 npm start" } //node js判斷 var app express(); app.get(env) production 原文地址&#xff1a;https://segmentfault.com/a…

java中的內部類詳解

https://www.cnblogs.com/dolphin0520/p/3811445.html https://www.cnblogs.com/chenssy/p/3388487.html轉載于:https://www.cnblogs.com/codeLei/p/9934195.html

eclipse下使用git插件上傳代碼至github

eclipse下使用git插件上傳代碼至github 1.eclipse下安裝git 正常情況下&#xff0c;eclipse 是自帶 git 插件的&#xff0c;那么即可跳至步驟1的最后一小步&#xff0c;配置 git 。 如果十分悲劇&#xff0c;你的 eclipse 中見不到 git 的身影&#xff0c;那么也沒關系&#…

VS(C++)配置Halcon(一次配置,永久使用)

【說明】只需配置一次&#xff0c;以后新項目無需再次配置。 本教程是64位版本&#xff0c;32位可參考本教程。VS與Halcon無論哪個版本&#xff0c;都可參考本教程。 【步驟】以VS2015Halcon18.11為例 1、新建一個C|Win32控制臺應用程序項目 2、視圖|其他窗口|屬性管理器 在 De…

(轉)msys2使用教程

一、安裝 官方下載地址 http://www.msys2.org/ 指定好安裝路徑&#xff08;一般D根目錄即可&#xff09;&#xff0c;一路下一步就好。 二、配置國內鏡像、設置窗體修改顏色 使用[清華大學開源軟件鏡像站]中的地址&#xff0c;修改\etc\pacman.d目錄下的三個文件。 配置教程 ht…

簡單使用Git和Github來管理自己的代碼和讀書筆記

簡單使用Git和Github來管理自己的代碼和讀書筆記 以前不知道使用代碼管理工具&#xff0c;最后寫的一些東西都沒有了&#xff0c;由于硬盤壞了或者不小心格式化了之類的&#xff0c;后來使用了Git 和Github來托管自己的代碼和讀書筆記方便了不少&#xff0c;到哪里只要有網就可…