1. フローティングの導入
歴史:
フローティング属性は元々、「テキストの折り返し」効果を実現するために作成されました。これにより、テキストが Web ページ上の画像の周りを回り込み、Word で「グラフィックとテキストの混合」を実現できます。
配置方法:
フローティングにより、要素は通常の流れから離れて、要素が含まれているコンテナーの端に当たるまで [テスト後にパディングに当たると停止] するか、当たるまで親コンテナーの左側または右側に移動できます。その他の浮遊要素。テキスト要素とインライン要素はフロート要素の周囲に回り込みます。
注:
1. コンテナに接触するエッジとは、コンテナのパディング内側エッジを指します。
検証例:
<style>.container{ border: 1px solid green; padding: 30px; background-color: green;/*将背景裁剪到内容框,方便看浮动元素效果*/ background-clip: content-box;}.fl{ float: left;}</style><div class="container"> 文字会环绕在图片周围文字会环绕在图片周围文字会环绕在图片周围文字会环绕在图片周围 <img class="fl" src="img/wb.jpg"></div>
2. フローティング要素は通常のフローから外れています。つまり、次の要素はレイアウト中に存在しないかのように動作します (テキストはまだ存在しているかのように動作します) 、それを囲んでいます)、しかし、それはまだ DOM ツリー内にあります。
3. js の element.style で要素を float に設定する場合、float は js のキーワードであるため、cssFloat を使用する必要があります。 [StyleFloat は IE8 以下のブラウザで使用されます]
は次のとおりです:
<style>#father{ border:1px solid red;}#test{ background-color: green; /*float: left;*/ }</style><div id="father"><span id="test">span内容</span></div><script type="text/javascript"> var oSpan=document.getElementById("test"); oSpan.style["cssFloat" in oSpan.style? "cssFloat" : "styleFloat"]="left";</script>
フローティング効果: ラッピングと破壊性。以下に 1 つずつ紹介します。
2. ラッピングラッピング: この言葉は他の人がまとめたものですが、個人的にはちょうどよくまとめられていると思います。
ラッピングとは、要素のサイズがコンテンツにぴったり合うことを意味します。
ラッピング プロパティを持つその他の属性:
例:
<style>.container{ border: 1px solid green; padding: 30px; background-color: green; background-clip: content-box;/*将背景裁剪到内容框,方便看浮动元素效果*/}.fl{ float: left;}</style><div class="container fl">内容</div>
float がラッピング効果を生み出す理由は、 float 属性が要素の表示属性の最終計算値を変更するためです。
float設定前の表示属性??》float設定後の表示属性の計算値
テスト後、inline-flexの表示計算値がchromeでフローティングされた後にflexに変更されただけで、他はすべて同じでした。興味のある友達は自分でテストしてみることができます。
ここでは、非常に簡単なテスト方法を示します。たとえば、inline-flex をテストするには、任意のラベルを選択できます。ここでは、span ラベルを使用し、表示属性を inline-flex に設定し、float:left を設定します。以下に示すように、Chrome コンソールのスタイル オプションで、表示属性が inline-flex であることを確認し、計算オプションに切り替えて表示属性が flex であることを確認します。他の値のテストは、コンソールで直接編集および表示できます。
<style>.test{background-color: green;display:inline-flex;float: left; }</style><span class="test">span内容</span>
float のラッピング プロパティを使用して、親コンテナの適応的な内部要素幅を実現できます。
3. 破壊性ここでの破壊性とは、要素が浮いた後、親要素が高度に崩壊する可能性があることを意味します。
その他の破壊的属性:
Floating 破壊原理:
Floating 要素はドキュメントの通常のフローから削除されるため、親要素はもちろんそのまま残ります通常のフローでは、フローティング要素によって親要素を展開することはできません。
4. フロートのクリアクリア属性は、要素のどの側に他のフローティング要素を含めることができないかを指定します。
値:
特定の原則: 要素の上マージンの上に空きスペースを追加します。たとえば、左側のフロートをクリアすると、要素の上マージンが作成されます。左側のフローティング要素の下マージンのすぐ下。
float をクリアするには主に 2 つの方法があります
以下の詳細な分析。
clear:both メソッドには以下も含まれます。
例:
<style>.wrap{ background-color: green;}.fl{ float: left;}</style><div class="wrap"><img class="fl" src="img/wb.jpg" /><div style=" clear:both;margin-bottom:50px;">兄弟元素设置clear:both</div></div><p style="margin-top: 50px;">兄弟元素设置clear:both来清除浮动会有margin重叠现象</p>
これを使用しますこのメソッドは浮動小数点をクリアします。注意すべき点は、クリアされる要素が浮動小数点要素を除く他の要素と同じ BFC 内にあるためです。
コードレベルの問題:
因为上面方法的种种弊端,更推荐使用这种父元素添加after伪元素清除浮动的方法。
上面方法是在html层面写的代码,而after伪元素是在css层面写的代码,虽然代码都不多,但站在结构和表现分离的角度看两种方式还是有差的。
代码如下:after在父元素底部生成一个具有clear:both 声明的伪元素来清除浮动。
.clearfix::before,.clearfix::after{ content: "."; display: block; height: 0; overflow: hidden;}.clearfix:after{ clear: both;}.clearfix { zoom: 1; /* IE < 8 */}
这种方法原理:
通过父元素的::after伪元素来生成浮动元素的兄弟元素,然后兄弟元素使用clear:both方法。
知道这点很重要,举个反例子来说明一下:
<style>.wrap{ background-color: green;}.fl{ float: left;}.clearfix::before,.clearfix::after{ content: "."; display: block; height: 0; overflow: hidden;}.clearfix:after{ clear: both;}</style><div class="wrap clearfix"><img class="fl" src="img/wb.jpg" /><div > 父元素的::after伪元素并不是浮动元素【在这里是图片】的相邻的兄弟元素,就达不到清除浮动的效果父元素的::after伪元素并不是浮动元素【在这里是图片】的相邻的兄弟元素,就达不到清除浮动的效果父元素的::after伪元素并不是浮动元素【在这里是图片】的相邻的兄弟元素,就达不到清除浮动的效果</div></div>
因为父元素生成的并不是浮动元素相邻的兄弟元素,所以使用clear:both无效,使用时必须注意。
支持浏览器: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+
/** * For modern browsers * 1. The space content is one way to avoid an Opera bug when the * contenteditable attribute is included anywhere else in the document. * Otherwise it causes space to appear at the top and bottom of elements * that are clearfixed. * 2. The use of `table` rather than `block` is only necessary if using * `:before` to contain the top-margins of child elements. */.cf:before,.cf:after { content: " "; display: table; }.cf:after { clear: both;}/* IE < 8 *//** * For IE 6/7 only * Include this rule to trigger hasLayout and contain floats. */.cf { *zoom: 1;}
了解更多可参考micro-clearfix-hack
zoom是为了兼容IE6,7;:before是为了阻止margin重叠,如果只清除浮动,可用:
.container:after { content:""; display:table; clear:both;}
BFC:块级格式化上下文【在css3中叫Flow Root】是一个独立布局环境,相邻盒子margin垂直方向会重叠。
什么样的元素会为其内容生成一个BFC呢?
BFC特性:
正是因为BFC特性中,创建了BFC的元素中,子浮动元素也会参与高度计算,所以可来清除浮动。
常用方法如下:
举例:父元素使用overflow:hidden生成一个BFC来清除浮动。
<style>.wrap{ background-color: green; overflow: hidden;}.fl{ float: left;}</style><div class="wrap"><img class="fl" src="img/wb.jpg" /><div style=" margin-bottom:50px;">浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容浮动元素的兄弟元素的内容</div></div><p style="margin-top: 50px;">浮动元素父元素的兄弟元素内容</p>
overflow: hidden;使得包含图片的div生成BFC,所以里面内容元素与外面包含文字的div的margin不会重叠,如上图。
两种清除浮动方法区别:clear:both可以发生margin重叠,BFC隔离不会有margin重叠。
BFC缺点:
1、不能应用于所有场合,因为不可能所有元素都绝对定位或者不可能所有元素都浮动。
2、现代浏览器不认识zoom1。
每种清除浮动的方法都有弊端,权衡后推荐用法:
.clearfix:after{content:"";display:block;height:0;overflow:hidden;clear:both;}/*IE6和IE7*/.clearfix{*zoom:1;}
或者用:
.clearfix:after{content:"";display:table;clear:both;}/*IE6和IE7*/.clearfix{*zoom:1;}
Note:
.clearfix类只应该用在包含浮动元素的父元素上。【如果不懂这句话再把上文看一遍】
五、浮动布局通常用的浮动布局一般是:固定尺寸+浮动。
举例:两栏布局
<style type="text/css"> body{ width: 600px; } .left{ width: 150px; float: left; }.right { width: 450px; float: right; } </style><body> <div class="left"> <img src="img/wb.jpg"/> </div> <div class="right"> 文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容 </div></body>
问题:
容错性差:容器尺寸变了,就得改代码。
复用性不好:尺寸固定,模块在另外尺寸容器中不能重用。
举例:在上面代码基础上修改样式为
<style type="text/css"> .left{ width: 150px; float: left; } /*流体布局*/.right { margin-left: 150px;} </style>
重点是使用margin-left,且不要定宽。这样好处是容器尺寸变化右侧可自适应。
改变DOM位置的流体布局写法
写代码时顺序为先右后左,这样就可以设置右栏右浮动,左栏设置margin-right。
<style type="text/css">.right{float: right;width: 150px;}.left{margin-right: 150px;} </style></head><body><div class="right"><img src="img/wb.jpg"></div><div class="left">文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容</div></body>
不改变DOM位置的流体布局写法【左右栏都左浮动】
写代码时顺序不变,左右栏都浮动,通过margin调整位置。
<style type="text/css">.wrap { width: 100%; float: left;}.left { margin-right: 150px;}.right { width: 150px; float: left; margin-left: -150px;} </style><body><div class="wrap"> <div class="left"> 文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容 </div></div><div class="right"> <img src="img/wb.jpg"></div></body>
效果同上。
大前端就是用的这种布局方法。
原理是左栏浮动,右两栏生成BFC,根据BFC特性与浮动元素相邻的、创建了BFC的元素,都不能与浮动元素相互覆盖。
<style type="text/css">.left { float: left;}.right{ display: table-cell; } </style><body> <div class="left"> <img src="img/wb.jpg"/> </div> <div class="right"> 文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容 </div></body>
六、float布局和inline-block布局对比
浮动和inline-block都能让元素排成一排,那么应该如何抉择?下面对比一下。
举例:浮动布局可以去掉元素之间的空格,而inline-block会保留空格。
<style>button { margin: 0; float: left;}p { clear: both;}</style></head><body> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <button>按钮4</button></body>
分析:button默认display:inline-block;可见他们之间有空格的距离。加了float:left后各个button元素之间空格消失。
总结一下:处理文字环绕自然是用浮动,处理图片列表垂直对齐或者横向导航可以选择inline-block。