HTML&&CSS基礎知識點整理
1、WEB標準:一系列標準的集合
1. 結構(Structure):html 語言:XHTML[可擴展超文本標識語言]和XML[可擴展標記語言] 2. 表現(Preasentation):css 3. 行爲(Behavior):JS[DOM+ES]
其中一些小的具體要求:css
- 結構:標籤小寫、閉合、不能隨意嵌套
- CSS+JS:精良使用外鏈,不用行內
優勢:
1. 易於維護 2. 頁面響應快 3. 可訪問性高 4. 提升設備兼容性 5. 易被解析(搜索引擎)
Ps:html
- 可維護性:出現問題時,修復Bug成本低且維護性好,還有一點是代碼可以被其餘開發人員理解。
- 可訪問性:全部人都能理解,解析
2、瀏覽器內核
> - IE:Trident內核(多稱:IE內核) > - Chrome:Webkit內核 ==> Blink內核 > - Firefox:Gecko內核(多稱:IE內核) > - Safari:Webkit內核 > - Opear:Preato====>Webkit內核 ====> Blink內核
3、渲染原理
一、涉及到的概念
- Dom Tree:瀏覽器將Html解析成屬性的數據結構
- Parse(構建Dom樹):生成Dom樹的行爲
- Css Rule Tree:瀏覽器將Css解析成屬性的數據結構
- Render Tree:DOM和CSSOM合併後生成Render Tree
- Construct(構建渲染樹):解析對應的CSS樣式文件信息(包括js生成的樣式和外部css文件),而這些文件信息以及HTML中可見的指令(如),構建渲染樹
- Layout:根據Render Tree已知各個節點以及節點之間的從屬關係,計算節點在屏幕中的位置
- Painting:根據Layout算出來的結果,經過顯卡,把內容滑倒屏幕上
- Reflow(迴流):當瀏覽器發現某個部分發生了點變化影響了佈局,須要倒回去從新渲染,這個回退的過程
二、==步驟==
- 解析HTML:瀏覽器會將HTML解析成一個DOM樹,DOM 樹的構建過程是一個深度遍歷過程:當前節點的全部子節點都構建好後纔會去構建當前節點的下一個兄弟節點。
- 解析CSS:將CSS解析成 CSS Rule Tree 。
- 生成渲染樹:根據DOM樹和CSSOM來構造 Rendering Tree。注意:Rendering Tree 渲染樹並不等同於 DOM 樹,由於一些像Header或display:none的東西就不必放在渲染樹中了。
- 佈局渲染樹:已知道網頁中有哪些節點、各個節點的CSS定義以及他們的從屬關係。從根節點遞歸調用,計算每個元素的大小、位置等,給出每一個節點所應該在屏幕上出現的精確座標
- 繪製渲染樹:遍歷render樹,並使用UI後端層繪製每一個節點。
三、Reflow{重構/迴流/重排}(對應Layout 改變了計算結果)
當渲染樹中的一部分(或所有)由於元素的規模尺寸,佈局,隱藏等改變而須要從新構建, 這就稱爲迴流(reflow)。== 每一個頁面至少須要一次迴流,就是在頁面第一次加載的時候(第一次佈局也稱做迴流)==。reflow 幾乎是沒法避免的。如今界面上流行的一些效果,好比樹狀目錄的摺疊、展開(實質上是元素的顯示與隱藏:display:none和visibility:hidden)等,都將引發瀏覽器的 reflow。鼠標滑過、點擊……只要這些行爲引發了頁面上某些元素的佔位面積、定位方式、邊距等屬性的變化,都會引發它內部、周圍甚至整個頁面的從新渲染。一般咱們都沒法預估瀏覽器到底會 reflow 哪一部分的代碼,它們都彼此相互影響着。前端
四、Repaint/Redraw{重繪}(對應Painting 改變了屏幕顯示樣式)
改變某個元素的背景色、文字顏色、邊框顏色等等== (外觀屬性)==不影響它周圍或內部佈局的屬性時,屏幕的一部分要重畫,可是元素的幾何尺寸== (佈局)==沒有變。
五、觸發Reflow條件
- 頁面渲染初始化;(沒法避免)
- 添加或刪除可見的DOM元素;
- 元素位置的改變,或者使用動畫;
- 元素尺寸的改變——大小,外邊距,邊框;
- 瀏覽器窗口尺寸的變化(resize事件發生時);
- 填充內容的改變,好比文本的改變或圖片大小改變而引發的計算值寬度和高度的改變;
- 讀取某些元素屬性:(offsetLeft/Top/Height/Width, clientTop/Left/Width/Height, scrollTop/Left/Width/Height, width/height, getComputedStyle(), currentStyle(IE)
六、觸發Repaint條件
- 改變元素外觀屬性。如:color,background-color等。
七、Reflow和Repaint的關係
在迴流(重排)的時候,瀏覽器會使佈局發生變化。完成迴流將變化後的新頁面繪製到頁面上,則觸發重繪。反之,重繪時不會不必定會使佈局發生變化,這不必定觸發重排(迴流)jquery
有些狀況下,好比修改了元素的樣式,瀏覽器並不會馬上reflow 或 repaint 一次,而是會把這樣的操做積攢一批,而後作一次 reflow,這又叫==異步 reflow 或增量異步 reflow==。可是在有些狀況下,好比==resize== 窗口,改變了頁面默認的字體等。對於這些操做,==瀏覽器會立刻進行 reflow==。程序員
==重排(迴流)一定會引起重繪,但重繪不必定會引起重排(迴流)==web
八、display:none和visibility:hidden
- display:none 的節點不會被加入Render Tree,若是某個節點最開始是不顯示的,設爲display:none是更優的
- visibility: hidden 的節點會被加入Render Tree
- display:none 會觸發 reflow,而 visibility:hidden 只會觸發 repaint,由於沒有發現位置變化。
九、優化重排重繪
==重繪重排的代價:耗時,致使瀏覽器卡慢==chrome
- 須要大量重繪重排的場景,例如:動畫
優化:express
- ==瀏覽器==本身的優化:==(屢次攢一次)==瀏覽器會維護1個隊列,把全部會引發迴流、重繪的操做放入這個隊列,等隊列中的操做到了必定的數量或者到了必定的時間間隔,瀏覽器就會flush隊列,進行一個批處理。這樣就會讓屢次的迴流、重繪變成一次迴流重繪。
- ==程序員==注意的優化:減小重繪和重排就是要==減小對渲染樹的操做==,能夠合併屢次的DOM和樣式的修改。並減小對style樣式的請求。如下:
- 直接改變元素的className(==一次改變多個須要一樣的樣式變化的元素==)
- display:none;先設置元素爲display:none;而後進行頁面佈局等操做;設置完成後將元素設置爲display:block;這樣的話就只引起兩次重繪和重排;(將重繪重排隱藏起來操做)
- 不要常常訪問瀏覽器的flush隊列屬性;若是必定要訪問,能夠利用緩存。將訪問的值存儲起來,接下來使用就不會再引起迴流
- 使用cloneNode(true or false) 和 replaceChild 技術,引起一次迴流和重繪;(==操做複製節點,將改變後的節點一次從新繪製==)
- 將須要屢次重排的元素,position屬性設爲absolute或fixed,元素脫離了文檔流,它的變化不會影響到其餘元素;(==脫離文檔會不會再影響頁面佈局==)
- 若是須要建立多個DOM節點,可使用DocumentFragment建立完後一次性的加入document;(==一次改變多個==)
- ==儘可能不要使用table佈局==
4、依賴管理
5、AMD、CMD和CommonJs
1. 前端模塊規範有三種:CommonJs,AMD和CMD。
* CommonJs用在服務器端,AMD和CMD用在瀏覽器環境 * AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。 * MD 是 SeaJS 在推廣過程當中對模塊定義的規範化產出。 * AMD:提早執行(異步加載:依賴先執行)+延遲執行 * CMD:延遲執行(運行到需加載,根據順序執行)
2. 模塊
模塊就是實現特定功能的文件,把幾個函數放在一個文件裏就構成了一個模塊。 須要的時候加載這個文件,調用其中的函數便可。
(1)函數寫法編程
function f1(){ //... } function f2(){ //... }
==缺點==:
這樣作會==污染全局變量==,沒法保證不與其餘模塊發生==變量名衝突==,並且==模塊成員之間沒什麼關係==。後端
(2)對象寫法
var module = { star : 0, f1 : function (){ //... }, f2 : function (){ //... } }; module.f1(); module.star = 1;
==優勢==:模塊寫成一個對象,模塊成員都封裝在對象裏,經過調用對象屬性,訪問使用模塊成員。
==缺點==:==暴露了模塊成員==,==外部能夠修改模塊內部狀態==。
(3)當即執行函數
var module = (function(){ var star = 0; var f1 = function (){ console.log('ok'); }; var f2 = function (){ //... }; return { f1:f1, f2:f2 }; })(); module.f1(); //ok console.log(module.star) //undefined
==優勢==:外部沒法訪問內部私有變量
3.CommonJs
CommonJS是服務器端模塊的規範,由Node推廣使用。
因爲服務端編程的複雜性,若是==沒有模塊很難與操做系統及其餘應用程序互動==。
CommonJS規範:
- 一個單獨的文件就是一個模塊。每個模塊都是一個單獨的做用域,也就是說,在該==模塊內部定義的變量,沒法被其餘模塊讀取==,除非定義爲==global==對象的屬性。
- ==輸出模塊變量==的最好方法是使用==module.exports==對象。
- ==加載模塊使用require==方法,該方法==讀取一個文件並執行==,==返回文件內部module.exports對象==
使用方法以下:
//math.js exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i++]; } return sum; }; //increment.js var add = require('math').add; exports.increment = function(val) { return add(val, 1); }; //index.js var increment = require('increment').increment; var a = increment(1); //2
問題:
require 是同步的。模塊系統須要同步讀取模塊文件內容,並編譯執行以獲得模塊接口。 但在瀏覽器端問題多多。
緣由:
瀏覽器端,加載 JavaScript 最佳、最容易的方式是在 document 中插入script標籤。 但腳本標籤天生異步,傳統 CommonJS 模塊在瀏覽器環境中沒法正常加載。
解決思路
- 開發一個服務器端組件,對模塊代碼做靜態分析,將模塊與它的依賴列表一塊兒返回給瀏覽器端。 這很好使,但須要服務器安裝額外的組件,並所以要調整一系列底層架構。
- 另外一種解決思路是,用一套標準模板來封裝模塊定義:
define(function(require, exports, module) { // The module code goes here });
這套模板代碼爲模塊加載器提供了機會,使其能在模塊代碼執行以前,對模塊代碼進行靜態分析,並動態生成==依賴列表==。
//math.js define(function(require, exports, module) { exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i++]; } return sum; }; }); //increment.js define(function(require, exports, module) { var add = require('math').add; exports.increment = function(val) { return add(val, 1); }; }); //index.js define(function(require, exports, module) { var inc = require('increment').increment; inc(1); // 2 });
4.AMD(異步模塊定義)
* AMD是"Asynchronous Module Definition"的縮寫。 * 因爲不是JavaScript原生支持,使用AMD規範進行頁面開發須要用到對應的庫函數RequireJS * AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化的產出 * 採用異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。
==RequireJS主要解決兩個問題:==
- 多個js文件可能有依賴關係,被依賴的文件須要早於依賴它的文件加載到瀏覽器
- js加載的時候瀏覽器會中止頁面渲染,加載文件越多,頁面失去響應時間越長
==RequireJs採用require()語句加載模塊,不一樣於CommonJS,它要求兩個參數:==
- 第一個參數[module],是一個數組,裏面的成員就是要加載的模塊;
- 第二個參數callback,則是加載成功以後的回調函數。math.add()與math模塊加載不是同步的,瀏覽器不會發生假死。
require([module], callback); require([increment'], function (increment) { increment.add(1); });
==define()函數==
- RequireJS定義了一個函數 define,它是全局變量,用來定義模塊:
- define(id?, dependencies?, factory);
==參數說明:==
- id:指定義中模塊的名字,可選;若是沒有提供該參數,模塊的名字應該默認爲模塊加載器請求的指定腳本的名字。若是提供了該參數,模塊名必須是「頂級」的和絕對的(不容許相對名字)。
- 依賴dependencies:是一個當前模塊依賴的,已被模塊定義的模塊標識的數組字面量。
依賴參數是可選的,若是忽略此參數,它應該默認爲["require", "exports", "module"]。然而,若是工廠方法的長度屬性小於3,加載器會選擇以函數的長度屬性指定的參數個數調用工廠方法。
- 工廠方法factory,模塊初始化要執行的函數或對象。若是爲函數,它應該只被執行一次。若是是對象,此對象應該爲模塊的輸出值。
define("alpha", ["require", "exports", "beta"], function (require, exports, beta) { exports.verb = function() { return beta.verb(); //Or: return require("beta").verb(); } });
==RequireJs使用例子==
- require.config是用來定義別名的,在paths屬性下配置別名。而後經過requirejs(參數一,參數二);
- 第一個參數是數組,傳入咱們須要引用的模塊名
- 第二個參數是個回調函數,回調函數傳入一個變量,代替剛纔所引入的模塊。
main.js //別名配置 requirejs.config({ paths: { jquery: 'jquery.min' //能夠省略.js } }); //引入模塊,用變量$表示jquery模塊 requirejs(['jquery'], function ($) { $('body').css('background-color','red'); });
引入模塊也能夠只寫require()。requirejs經過define()定義模塊,定義的參數上同。在==此模塊內的方法和變量外部是沒法訪問的==,只有經過return返回才行.
//將該模塊命名爲math.js保存。 //math.js define('math',['jquery'], function ($) {//引入jQuery模塊 return { add: function(x,y){ return x + y; } }; });
//main.js引入模塊方法 require(['jquery','math'], function ($,math) { console.log(math.add(10,100));//110 });
5.CMD
* CMD 即Common Module Definition通用模塊定義 * CMD規範是國內發展出來的 * CMD有個瀏覽器的實現SeaJS * SeaJS要解決的問題和requireJS同樣,只在🌟模塊定義方式和模塊加載(能夠說運行、解析時機上有所不一樣。
==CMD規範:==
(1)一個模塊就是一個文件。代碼的書寫格式以下:
define(function(require, exports, module) { // 模塊代碼 });
- require是能夠把其餘模塊導入進來的一個參數;
- exports是能夠把模塊內的一些屬性和方法導出的;
- module 是一個對象,上面存儲了與當前模塊相關聯的一些屬性和方法。
🌟🌟==AMD是依賴關係前置,在定義模塊的時候就要聲明其依賴的模塊;==
🌟🌟==CMD是按需加載依賴就近,只有在用到某個模塊的時候再去require:==
//CMD(seajs)使用例子 // 定義模塊 myModule.js define(function(require, exports, module) { var $ = require('jquery.js') $('div').addClass('active'); exports.data = 1; }); // 加載模塊 seajs.use(['myModule.js'], function(my){ var star= my.data; console.log(star); //1 }); // CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此處略去 100 行 var b = require('./b') // 依賴能夠就近書寫 b.doSomething() // ... }) // AMD define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() ... })
🌟==以上明顯的不一樣就是依賴加載方式不一樣,具體表如今define的參數構成上,但AMD和CMD都是異步加載==
6、兼容性
1. HTML對象獲取問題
- FireFox:document.getElementById("idName");
- ie:document.idname或者document.getElementById("idName").
==解決辦法:統一使用document.getElementById("idName");==
2. const問題
- Firefox下,可使用const關鍵字或var關鍵字來定義常量;
- IE下,只能使用var關鍵字來定義常量.
==解決方法:統一使用var關鍵字來定義常量==
3. event.x與event.y問題
- IE下,event對象有x,y屬性,可是沒有pageX,pageY屬性;
- Firefox下,event對象有pageX,pageY屬性,可是沒有x,y屬性.
==解決方法:使用mX(mX = event.x ? event.x : event.pageX;)來代替IE下的event.x或者Firefox下的event.pageX==
4. window.location.href問題
- IE或者Firefox2.0.x下,可使用window.location或window.location.href;
- Firefox1.5.x下,只能使用window.location.
==解決方法:使用window.location來代替window.location.href.==
5. frame問題
如下面的frame爲例:
(1)訪問frame對象:
- IE:使用window.frameId或者window.frameName來訪問這個frame對象. frameId和frameName能夠同名。
- Firefox:只能使用window.frameName來訪問這個frame對象.
==另外,在IE和Firefox中均可以使用window.document.getElementById("frameId")來訪問這個frame對象.==
(2)切換frame內容:
在 IE和Firefox中均可以使用window.document.getElementById("testFrame").src = "xxx.html"或window.frameName.location = "xxx.html"來切換frame的內容.
若是須要將frame中的參數傳回父窗口(注意不是opener,而是parent frame),能夠在frame中使用parent來訪問父窗口。例如:parent.document.form1.filename.value="Aqing";
6. 模態和非模態窗口問題
- IE下,能夠經過showModalDialog和showModelessDialog打開模態和非模態窗口;Firefox下則不能.
==解決方法:直接使用window.open(pageURL,name,parameters)方式打開新窗口。
若是須要將子窗口中的參數傳遞迴父窗口,能夠在子窗口中使用window.opener來訪問父窗口.==
例如:var parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";
7. firefox與IE的父元素(parentElement)的區別
IE:obj.parentElement
firefox:obj.parentNode
==解決方法: 由於firefox與IE都支持DOM,所以使用obj.parentNode是不錯選擇.==
8. document.formName.item(」itemName」) 問題
問題說明:IE下,可使用document.formName.item(」itemName」) 或document.formName.elements ["elementName"];Firefox 下,只能使用document.formName.elements["elementName"]。
==解決方法:統一使用document.formName.elements["elementName"]。==
9. 集合類對象問題
問題說明:IE下,可使用 () 或 [] 獲取集合類對象;Firefox下,只能使用 [ ]獲取集合類對象。
==解決方法:統一使用 [] 獲取集合類對象==。
10. 自定義屬性問題
- IE下,可使用獲取常規屬性的方法來獲取自定義屬性,也可使用getAttribute() 獲取自定義屬性;
- Firefox下,只能使用getAttribute() 獲取自定義屬性。
==解決方法:統一經過getAttribute() 獲取自定義屬性。==
11. input.type屬性問題
問題說明:IE下input.type屬性爲只讀;可是Firefox下input.type屬性爲讀寫。
==解決辦法:不修改input.type屬性。若是必需要修改,能夠先隱藏原來的input,而後在一樣的位置再插入一個新的input元素。==
12. event.srcElement問題
- IE下,even對象有srcElement屬性,可是沒有target屬性;
- Firefox下,even對象有target屬性,可是沒有srcElement屬性。
==解決方法:使用srcObj = event.srcElement ?event.srcElement : event.target;==
若是考慮第8條問題,就改用myEvent代替event便可。
13. body載入問題
- Firefox的body對象在body標籤沒有被瀏覽器徹底讀入以前就存在;
- IE的body對象則必須在body標籤被瀏覽器徹底讀入以後才存在。
Ps: 經驗證,IE六、Opera9以及FireFox2中不存在上述問題,單純的JS腳本能夠訪問在腳本以前已經載入的全部對象和元素,即便這個元素尚未載入完成。
14. 事件委託方法
- IE下,使用document.body.onload = inject; 其中function inject()在這以前已被實現;
- 在Firefox下,使用document.body.onload = inject();
==解決方法:統一使用document.body.onload=new Function(’inject()’); 或者document.body.onload = function(){}==
[注意] Function和function的區別。
15. Table操做問題
問題說明:ie、firefox以及其它瀏覽器對於 table 標籤的操做都各不相同,在ie中不容許對table和tr的innerHTML賦值,使用js增長一個tr時,使用appendChild方法也無論用。
==解決方法://向table追加一個空行:==
var row = otable.insertRow(-1); var cell = document.createElement("td"); cell.innerHTML = ""; cell.className = "XXXX"; row.appendChild(cell);
[注] 建議使用JS框架集來操做table,如JQuery。
16. 對象寬高賦值問題
- FireFox中相似obj.style.height = imgObj.height的語句無效。
- cursor:hand VS cursor:pointer
firefox不支持hand,但ie支持pointer
==解決方法: 統一使用pointer==
17. innerText在IE中能正常工做,但在FireFox中卻不行.需用textContent。
解決方法:
if(navigator.appName.indexOf("Explorer") > -1){ document.getElementById('element').innerText = "my text"; } else{ document.getElementById('element').textContent = "my text"; }
18. CSS透明
- IE:
filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)
- FF:opacity:0.6。
- opacity 透明,子元素會繼承透明屬性。
==解決方式:
一、使用 background:rgba(0,0,0,0.6) //IE8及如下無效果。
二、使用定位,背景色與子元素處於同級關係。==
19. css中的width和padding
==在IE7和FF中width寬度不包括padding,在Ie6中包括padding.==
20. FF和IEBOX模型解釋不一致致使相差2px
box.style{width:100;border 1px;}
- ie理解爲box.width = 100
- ff理解爲box.width = 100 + 1*2 = 102//加上邊框2px
==解決方法:p{margin:30px!important;margin:28px;}==
Ps:這兩個margin的順序必定不能寫反, IE不能識別!important這個屬性,但別的瀏覽器能夠識別。因此在IE下其實解釋成這樣:p{maring:30px;margin:28px}
重複定義的話按照最後一個來執行,因此不能夠只寫margin:XXpx!important;
21. IE5 和IE6的BOX解釋不一致
- IE5
下p{width:300px;margin:0 10px 0 10px;}
p 的寬度會被解釋爲300px-10px(右填充)-10px(左填充),最終p的寬度爲280px
- 在IE6和其餘瀏覽器上寬度則是以 300px+10px(右填充)+10px(左填充)=320px來計算的。
==修改 p{width:300px!important;width :340px;margin:0 10px 0 10px}
==
22. ul和ol列表縮進問題
- 消除ul、ol等列表的縮進時,樣式應寫成:
list-style:none;margin:0px;padding:0px;
經驗證,
- 在IE中,設置margin:0px能夠去除列表的上下左右縮進、空白以及列表編號或圓點,設置padding對樣式沒有影響;
- 在 Firefox 中,設置margin:0px僅僅能夠去除上下的空白,設置padding:0px後僅僅能夠去掉左右縮進,還必須設置list- style:none才能去除列表編號或圓點。
==在IE中僅僅設置margin:0px便可達到最終效果,而在Firefox中必須同時設置margin:0px、 padding:0px以及list-style:none三項才能達到最終效果。==
23. 元素水平居中問題
- FF: margin:0 auto;
- IE: 父級{ text-align:center; }
24. p的垂直居中問題
vertical-align:middle; line-height:200px; //將行距增長到和整個p同樣高
而後插入文字,就垂直居中了。缺點是要控制內容不要換行。
25. margin加倍的問題
- 設置爲float的p在ie下設置的margin會加倍。這是一個ie6都存在的bug。
==解決方案是在這個p裏面加上display:inline;塊變行==
例如:
相應的css爲
#imfloat{ float:left; margin:5px; display:inline; }
26. IE與寬度和高度的問題
- IE不認得min-這個定義,但實際上它把正常的width和height看成有min的狀況來使。這樣問題就大了,若是隻用寬度和高度,正常的瀏覽器裏這兩個值就不會變,若是隻用min-width和min-height的話,IE下面根本等於沒有設置寬度和高度。
==解決:設置在html上==
#box{ width: 80px; height: 35px; } html>body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px; }
27. 頁面的最小寬度
- IE不識別min,要實現最小寬度,可用下面的方法:
#container{ min-width: 600px; width:expression(document.body.clientWidth< 600? "600px": "auto" ); }
==第一個min-width是正常的;但第2行的width使用了Javascript,這隻有IE才認得,這也會讓你的HTML文檔不太正規。它實際上經過Javascript的判斷來實現最小寬度。==
28. p浮動IE文本產生3象素的bug
- 左邊對象浮動,右邊採用外補丁的左邊距來定位,右邊對象內的文本會離左邊有3px的間距.
#box{ float:left; width:800px;} #left{ float:left; width:50%;} #right{ width:50%;} 🌟html #left{ margin-right:-3px; //這句是關鍵}
29. IE捉迷藏的問題
當p應用複雜的時候每一個欄中又有一些連接,p等這個時候容易發生捉迷藏的問題。
有些內容顯示不出來,當鼠標選擇這個區域是發現內容確實在頁面。
解決辦法:對#layout使用line-height屬性或者給#layout使用固定高和寬。頁面結構儘可能簡單。
30. float的p閉合;清除浮動;自適應高度
?(1) 例如:
這裏的NOTfloatC並不但願繼續平移,而是但願往下排。(其中floatA、floatB的屬性已經設置爲float:left;)
這段代碼在IE中毫無問題,問題出在FF。緣由是NOTfloatC並不是float標籤,必須將float標籤閉合。在
之間加上
這個p必定要注意位置,並且必須與兩個具備float屬性的p同級,之間不能存在嵌套關係,不然會產生異常。而且將clear這種樣式定義爲爲以下便可:==.clear{clear:both;}==
(2)做爲外部 wrapper 的 p 不要定死高度,爲了讓高度能自適應,要在wrapper裏面加上overflow:hidden; 當包含float的box的時候,高度自適應在IE下無效,這時候應該觸發==IE的layout私有屬性(萬惡的IE啊!)用zoom:1;==能夠作到,這樣就達到了兼容。
例如某一個wrapper以下定義:
.colwrapper{overflow:hidden; zoom:1; margin:5px auto;}
(3)對於排版,咱們用得最多的css描述可能就是float:left.有的時候咱們須要在n欄的float p後面作一個統一的背景,譬如:
好比咱們要將page的背景設置成藍色,以達到全部三欄的背景顏色是藍色的目的,可是咱們會發現隨着left center right的向下拉長,而page竟然保存高度不變,問題來了,緣由在於page不是float屬性,而咱們的page因爲要居中,不能設置成float,因此咱們應該這樣解決:
再嵌入一個float left而寬度是100%的p解決之。
或者另外一種方法:用選擇器(:after)在page以後插入一個空標籤,並清除浮動
.page:after {content: ""; display: table; clear: both; }
(4)萬能float 閉合(很是重要!)
關於 clear float 的原理可參見 [How To Clear Floats Without Structural Markup],將如下代碼加入Global CSS 中,給須要閉合的p加上class="clearfix" 便可,屢試不爽。
.clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; } .clearfix { display:inline-block; } .clearfix {display:block;}
或者這樣設置:`.hackbox{ display:table; //將對象做爲塊元素級的表格顯示}
`
31. 高度不適應
高度不適應是當內層對象的高度發生變化時外層高度不能自動進行調節,特別是當內層對象使用margin 或padding時。
例:
#box {background-color:#eee; } #box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
p對象中的內容
==解決技巧:在P對象上下各加2個空的p對象CSS代碼{height:0px;overflow:hidden;}
或者爲p加上border屬性。==
32. IE6下圖片下有空隙產生
解決這個BUG的技巧有不少,能夠是
==改變html的排版
或者設置img爲display:block
或者設置vertical-align屬性爲vertical-align:top/bottom/middle/text-bottom 均可以解決.==
33. 對齊文本與文本輸入框
==加上vertical-align:middle;==
Ps:經驗證,在IE下任一版本都不適用,而ff、opera、safari、chrome均OK!
34. li中內容超過長度後以省略號顯示
此技巧適用與IE、Opera、safari、chrom瀏覽器,FF暫不支持。
35. 爲何web標準中IE沒法設置滾動條顏色了
==解決辦法是將body換成html==
39. FORM標籤
這個標籤
- 在IE中,將會自動margin一些邊距
- 在FF中margin則是0
- 所以,若是想顯示一致,因此最好在css中指定margin和 padding,
==css中通常首先都使用這樣的樣式ul,form{margin:0;padding:0;}。==
40. 屬性選擇器(這個不能算是兼容,是隱藏css的一個bug)
p[id]{}p[id]{}
- 這個對於IE6.0和IE6.0如下的版本都隱藏
- FF和OPera做用.屬性選擇器和子選擇器仍是有區別的,子選擇器的範圍從形式來講縮小了,屬性選擇器的範圍比較大,如p[id]中,全部p標籤中有id的都是一樣式的.
41. 爲何FF下文本沒法撐開容器的高度
- 標準瀏覽器中固定高度值的容器是不會象IE6裏那樣被撐開的,那我又想固定高度,又想能被撐開須要怎樣設置呢?
==去掉height設置min-height:200px; 這裏爲了照顧不認識min-height的IE6 能夠這樣定義:==
{ height:auto!important; height:200px; min-height:200px; }
43. IE和FireFox 對空格的尺寸解釋不一樣
- FireFox爲4px,IE爲8px;
- FireFox對p與p之間的空格是忽略的,可是IE是處理的。
- 在兩個相鄰p之間不要有空格跟回車,不然可能形成不一樣瀏覽間之間格式不正確,好比著名的3px誤差並且緣由難以查明。
- 多個img標籤連着,而後定義float: left;結果在firefox裏面正常,而IE裏面顯示的每一個img都相隔了3px。我把標籤之間的空格都刪除都沒有做用。
==解決方法是在img外面套li,而且對li定義margin: 0; 避免方式:在必要的時候不要無視 list 標籤)==
44. 條件註釋
lte -- 小於等於
lt-- 小於
gte --大於等於
gt--大於
! --不等於
45.強制渲染
//這句話的意思是強制使用IE7模式來解析網頁代碼!
//Google Chrome Frame也可讓IE用上Chrome的引擎
或者//強制IE8使用IE7模式來解析
//強制IE8使用IE6或IE5模式來解析
//一個特定版本的IE支持所要求的兼容性模式多於一種
46.js兼容文件
使IE5,IE6兼容到IE7模式(推薦)
使IE5,IE6,IE7兼容到IE8模式
使IE5,IE6,IE7,IE8兼容到IE9模式
47.瀏覽器識別符
p{ _color:red; } IE6 專用
*html p{ color:#red; }IE6 專用
p{ +color:red; } IE6,7 專用
p{ *color:red; } IE6,7 專用
*html p{ color:red; } IE6,7 專用
p{*+color: red;} IE7 專用
Body> p{ color: red; }屏蔽 IE6
p{ color:red9; } IE8
Firefox: -moz-
Safari: -webkit-
Opera: -o-
IE: -ms-
整理時有一些用到了別人的文章,須要標註版權的請聯繫