一,理解并写出外边距的三个特征: 同级塌陷,嵌套传递,自动挤压的案例;
当两个盒子上下排列时,外边距会出现塌陷现象,小的会陷到大的里面去,简称:"同级塌陷"
当二个盒子相互潜逃,为父子关系时,给子盒子添加的外边距跑到了父盒子上面去了,这就是外边距的"嵌套传递"
给外边距左侧添加auto,会尽可能将左侧空间分配给盒子左外边距,盒子被挤到最右边,让右边距也自动分配,居然自动居中了,这就是“自动挤压”
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="style751.css"> <title>外边距规则</title> </head> <body> <div class="box1"></div> <div class="box2"></div> <hr> <div class="box3"> <div class="box4"></div> </div> <hr> <div class="box5"></div>
style751.css
/************同级塌陷************/ .box1 { width: 200px; height: 200px; background-color: red; } .box2 { width: 200px; height: 200px; background-color: blueviolet; } .box1 { margin-bottom: 50px; } .box2 { margin-top: 50px; } /* 按正常思维,现在二个盒子上下应该有100px外边距,但是页面却未发生变化 */ /* 说明二个盒子之间的外边距仍是50px,肯定有一个外边距没有生效,究竟是哪一个呢? */ /* 现在将box1的margin-bottom改为80px */ .box1 { margin-bottom: 80px; } /* 发现变宽了, 看样子是box1生效了, box2无效 */ /* 再把box2的margin改为100px */ .box2 { margin-top: 100px; } /* 发现上下间距又变宽了,再次检查发现box2的margin生效了,box1的margin失效了 */ /************嵌套传递************/ .box3 { width: 200px; height: 200px; background-color: red; } .box4 { width: 100px; height: 100px; background-color: blueviolet; } /* 我们的任务是:使box4离box3顶部之间有50px的间距,通过margin-top来实现 */ .box4 { margin-top: 50px; } /* 结果发现不对, 外边距跑到了外部盒子box3上面去了,这就是外边距的"嵌套传递"现象 */ /* 当给一个子盒子添加margin时,这个margin会自动传递到父级盒子上 */ /* 所以,正确的做法是,给父级盒子添加内边距来实现 */ .box4 { margin-top: 0; } .box3 { padding-top: 50px; /* 修改盒子高度,将撑开的50px的高度去掉 */ height: 150px; } /************自动挤压************/ .box5 { width: 200px; height: 200px; background-color: red; } .box5 { /*margin默认值为: auto*/ /*左侧添加auto,会尽可能将左侧空间分配给盒子左外边距,盒子被挤到最右边*/ /*margin-left: auto;*/ /*让右边距也自动分配, 会出现什么呢, 会自相矛盾吗?不会的*/ /*margin-right: auto;*/ /*居然自动居中了, 这就是互不相让的结果, 达到了平衡,*/ /*因为左右边距的值完全相同,所以可以简写, 因为左右值必须写到第二个参数位置上, 所以这里假定上下为0*/ /*margin: 0 auto;*/ /*或者全部交给浏览器去处理 */ margin: auto;}
二,内边距对盒中内容的影响,以及解决的三种方案是什么
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="style752.css"> <title>调皮捣蛋的内边距(padding)</title> </head> <body> <!-- 将图片在容器中居中显示 --> <!-- 方法1: 重新设置原盒子的宽度--> <div class="box1"> <img src="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4151170903,256805738&fm=26&gp=0.jpg" alt="哆啦A梦" width="200"> </div> <hr> <!-- 方法2: 宽度分离--> <div class="warp"> <div class="box2"> <img src="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4151170903,256805738&fm=26&gp=0.jpg" alt="哆啦A梦" width="200"> </div> </div> <hr> <!-- 方法3: box-sizing--> <div class="box3"> <img src="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4151170903,256805738&fm=26&gp=0.jpgg" alt="哆啦A梦" width="200"> </div> </body> </html>
style752.css
/*实现图片居中显示*/ /*********************** 方案1 *********************/ .box1 { /*默认情况下,width是直接使用到盒子中的内容级content*/ width: 300px; background-color: lightblue; border: 1px solid black; } /*使用padding让图片居中显示*/ /* 容器300*300,图片200*200,最直观的想法是添加50px的内边距 */ .box1 { padding: 50px; /* 会发现,内边距会增加盒子填充厚度,将盒子撑大 */ /*如果想保持原来盒子大小,只能手工修改box1的宽高*/ width: 200px; } /*********************** 方案2: 宽度分离 *********************/ /* 给box2认一个干爹,添加一个父级盒子wrap, 这时box2就是儿子了, width就有效了*/ /*这是利用于嵌套盒子之间,只有宽度可以继承的特征*/ .warp { width: 300px; } /*.box现在就是wrap的内容*/ .box2 { padding: 50px; background-color: lavender; border: 1px solid black; } /*********************** 方案3: box-sizing 盒尺寸 *********************/ /*经过前面学习, 知道了在默认情况下, 宽度是作用到盒中的内容上的*/ /*而一个盒子有content,padding,border,margin四部分组成,所以改变宽度会造成盒子大小不确定*/ /*方案2: 是将width宽度直接作用到了外部盒子上, 而box2此时就自动变成了warp的内容,所以会应用到width*/ .box3 { width: 300px; /*让宽度width作用到边框级,作用到内容级仍会撑开盒子的*/ /*box-sizing: content-box;*/ box-sizing: border-box; background-color: lavenderblush; border: 1px solid black; /*内边距不会撑开盒子, 因为宽度作用到了边框级, 与内容无关*/ padding: 50px; } /* 总结: * 第一种方案DOM结构简单,但是要修改原盒子大小 * 第二种方案不需要修改原盒子大小,但需要增加一个容器盒子 * 第三种无疑是首选, 但是不同级别的盒元素,理解起来有困难 * 所以, 各有利弊, 在开发中,根据实际情况进行斟酌 */
三,浮动的实现原理与清除的技巧
实现原理:浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
清除的技巧:添加额外的标签<div style="clear:both;"></div>
四,相对定位: 元素并未脱离文档流,是以元素在文档流中的原始位置为参照物进行定位的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>定位与相对定位(position:relative)</title> </head> <body> <!-- 相对定位小案例: 在页面中创建一个彩色十字架--> <div class="box1" style="width: 150px; height: 150px;background-color: lightblue;position: relative; left: 150px;"></div> <div class="box2" style="width: 150px; height: 150px;background-color: lightgray;position: relative;"></div> <div class="box3" style="width: 150px; height: 150px;background-color: lightgreen;position: relative; left: 300px;top: -150px;"></div> <div class="box4" style="width: 150px; height: 150px;background-color: lightcoral;position: relative; left: 150px; top: -300px;"></div> <div class="box5" style="width: 150px; height: 150px;background-color: lightpink;position: relative; left: 150px; top: -300px"></div> </body> </html>
绝对定位: 元素脱离文档流重新排列,所有必须要有一个定位父级做为参照物,不论元素之前是什么类型,全部转为块元素,支持宽高
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>绝对定位</title> </head> <body> <!-- 相对定位小案例: 在页面中创建一个彩色十字架--> <div class="parent" style="position: relative; border: 1px dashed gray; width: 450px; height: 450px;"> <div class="box1" style="width: 150px; height: 150px; background-color: lightblue; position: absolute; /* 第一个区块只需要右移150px,即可 */ left: 150px;"></div> <div class="box2" style=" width: 150px; height: 150px; background-color: lightgray; position: absolute; /* 第二个区块, left不用设置,只需要top=150px,将它从左上角顶下来即可 */ top: 150px;"></div> <div class="box3" style="width: 150px; height: 150px; background-color: lightgreen; position: absolute; /* 第三个区块向右跨二个区块位置,并向下移一个区块位置 */ left: 300px; top: 150px;"></div> <div class="box4" style="width: 150px; height: 150px; background-color: lightcoral; position: absolute; /* 第四个区块,向右向下各移动一个区块位置 */ left: 150px; top: 150px;"></div> <div class="box5" style=" width: 150px; height: 150px; background-color: lightseagreen; position: absolute; /* 第五个区块,向右移动一个区块位置,向下移动二个区块位置 */ left: 150px; top: 300px;"></div> </div> </body> </html>
五,模仿完成课堂上的二个定位案例:模拟php中文网登陆(遮罩+绝对定位)和固定定位广告的展示方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>遮罩+绝对定位</title> </head> <body style=" margin: 0; background-image:url(https://img.php.cn//upload/image/574/382/346/1535509625681731.jpg); background-size: cover; height: 2000px;"> <!-- 模拟php中文网的登录页面 --> <div class="shade" style=" position: absolute; left: 0;top: 0; width: 100%; height: 100%; background-color: black; opacity: 0.7;"> </div> <div class="login" style=" background-color: white; position: absolute; left: 50%; top: 50%; margin-left: -190px; margin-top: -230px; "> <img src="https://img.php.cn//upload/image/574/382/346/1535509625681731.jpg" alt="" style=" width: 380px; height: 460px;"> </div> <h1>实现广告位</h1> <div class="ads" style=" width: 350px; height: 250px; background-color: lightblue; position: fixed; right: 0; bottom: 0;"> <button onclick="this.parentNode.style.display = 'none'" style="float: right; margin-top: 10px; margin-right: 20px; border: none; background: none; color: red; font-size: 2em;">X</button> <h2>人生的意义是什么?</h2> <h1>怎么实现人生的价值?</h1> </div> </body> </html>