博客列表 >css布局之浮动与定位的应用

css布局之浮动与定位的应用

祥子弟弟
祥子弟弟原创
2020年12月23日 22:36:10944浏览

一、浮动(float)

浮动属性 float 是指定一个元素沿其所在的容器的左侧或者右侧放置。浮动的出现想解决的问题就是文字和图片的并排显示,不过一旦使用了浮动属性,该元素就会脱离网页正常流动(文档流)。
浮动的缺点:任何一个元素使用浮动属性之后都会脱离文档流,然后在父级元素计算高度的时候,就会忽略内部的浮动元素,造成父级元素高度塌陷。
示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>浮动的示例</title>
  6. </head>
  7. <body>
  8. <h1>浮动的本质</h1>
  9. <div class="box">
  10. <div class="child">浮动元素</div>
  11. </div>
  12. </body>
  13. </html>
  1. * {
  2. padding: 0;
  3. margin: 0;
  4. box-sizing: border-box;
  5. }
  6. .box {
  7. /* padding: 1em; */
  8. border: 1px solid #000;
  9. background-color: lightcyan;
  10. }
  11. .child {
  12. width: 5em;
  13. height: 5em;
  14. background-color: lightgreen;
  15. float: left;
  16. }

显示效果如下:


这样就可以看到,浮动后的元素是脱离了文档流的,直接造成了父级元素 box 的高度塌陷,这样的情况,我们可以有三种方法:

  1. 添加一个附加元素,让它消除浮动影响(不建议使用)

  2. 使用伪元素 “:after” 来消除浮动影响

  3. 使用创建 BFC 容器的方法消除浮动影响

  • 添加附加元素

这个就很简单了,就是在浮动元素同级下添加一个空的 div 元素,用来消除浮动影响。

  1. <body>
  2. <h1>浮动的本质</h1>
  3. <div class="box">
  4. <div class="child">浮动元素</div>
  5. <div calss="clear"></div>
  6. </div>
  7. </body>
  1. .clear {
  2. clear: both;
  3. }
  • 使用伪元素
  1. .box:after {
  2. content: "";
  3. /* 使这个区域变成以一个块级元素 */
  4. display: block;
  5. clear: both;
  6. }
  • 创建 BFC 容器

创建 BFC 的方式:任何一个元素添加上以下任何一个属性后就是一个 BFC 容器

  1. float:left / right,不能是 none;
  2. overflow: hidden / auto / scroll, 不能是 visible;
  3. display: flex / inline-flex;
  4. display: grid / inline-grid;
  5. display: inline-block / table-cell;
  6. position: absolute / fiexed。

使用 overflow:hidden;将父元素转为 BFC 容器,使它的布局不受到内部浮动元素的影响

  1. .box {
  2. overflow: hidden;
  3. }

二、定位(position)

定位属性:position

定位类型:

  1. 静态定位(position:static;):文档流定位;默认定位,元素的显示位置与它源码的位置一致

  2. 相对定位(position:relative;):相对于该元素在文档流中的原始位置进行定位(偏移)。

  3. 绝对定位(position:absolute;):相对于它的祖先中离它最近的 “定位元素” 的位置发生偏移(定位元素:只要这个元素中有 position: relative;或者 position:absolute;就称为定位元素,仅限这两种)。如果祖先元素中不存在定位元素,那它就参考根元素(html)进行定位,而且只有定位元素才有资格充当绝对定位元素的定位祖先元素(定位参考元素)。

  4. 固定定位(position:fixed;):它是绝对定位的一个特例,它始终相对于 html 定位。固定定位应用场景:在线客服,广告位等。

定位实战

  • 模态框实现

特点:点击“登录”按钮弹出登录框,同时登录框居于屏幕中央,背景半透明,点击“关闭”按钮时,登录框隐藏,页面恢复原来亮度。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>模态框</title>
  6. <link rel="stylesheet" href="style/demo6.css" />
  7. </head>
  8. <body>
  9. <!-- 页眉 -->
  10. <header>
  11. <h2>我的博客</h2>
  12. <button>登录</button>
  13. </header>
  14. <!-- 模态框 -->
  15. <div class="modal">
  16. <!-- 蒙板:用来盖住后面的内容,使它半透明 -->
  17. <div class="modal-coverback"></div>
  18. <!-- 主体 -->
  19. <div class="modal-body">
  20. <button class="close">关闭</button>
  21. <form action="" method="POST">
  22. <table>
  23. <caption>
  24. 用户登录
  25. </caption>
  26. <tr>
  27. <td><label for="username">用户名:</label></td>
  28. <td>
  29. <input type="text" name="username" id="username" required />
  30. </td>
  31. </tr>
  32. <tr>
  33. <td><label for="psd">密码:</label></td>
  34. <td><input type="password" name="psd" id="psd" required /></td>
  35. </tr>
  36. <tr>
  37. <td></td>
  38. <td><button>登录</button></td>
  39. </tr>
  40. </table>
  41. </form>
  42. </div>
  43. </div>
  44. </body>
  45. </html>
  46. <script src="js/demo6.js"></script>

demo6.css 代码如下:

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. /* 页眉样式 */
  7. header {
  8. background-color: #ccc;
  9. padding: 0.5em 2em;
  10. overflow: hidden;
  11. font-style: italic;
  12. color: #123456;
  13. }
  14. header h2 {
  15. float: left;
  16. }
  17. header button {
  18. float: right;
  19. width: 5em;
  20. height: 2.5em;
  21. }
  22. header button:hover {
  23. cursor: pointer;
  24. opacity: 0.8;
  25. }
  26. /* 模态框样式 */
  27. /* 蒙版 */
  28. /* 使用固定定位 */
  29. .modal .modal-coverback {
  30. background-color: rgb(0, 0, 0, 0.5);
  31. position: fixed;
  32. top: 0;
  33. left: 0;
  34. right: 0;
  35. bottom: 0;
  36. }
  37. /* 主体 */
  38. .modal .modal-body {
  39. padding: 1em;
  40. min-width: 20em;
  41. min-height: 10em;
  42. border: 1px solid #000;
  43. background: linear-gradient(to right, lightcyan, #fff);
  44. /* 固定定位 */
  45. position: fixed;
  46. /* top: 0;
  47. left: 0;
  48. right: 0;
  49. bottom: 0; */
  50. /* margin: auto; */
  51. /* 实现屏幕居中 */
  52. top: 50%;
  53. left: 50%;
  54. /* 向后平移以自身为基准的50% */
  55. transform: translate(-50%, -50%);
  56. }
  57. .modal form table {
  58. width: 80%;
  59. }
  60. .modal form table caption {
  61. font-weight: bold;
  62. margin-bottom: 1em;
  63. }
  64. .modal form table td {
  65. padding: 0.5em 0;
  66. margin-bottom: 2em;
  67. }
  68. .modal form table td:first-of-type {
  69. width: 5em;
  70. }
  71. .modal form table td input {
  72. width: auto;
  73. height: auto;
  74. }
  75. .modal form table button {
  76. width: 7.5em;
  77. height: 2.5em;
  78. }
  79. .modal form table button:hover {
  80. opacity: 0.8;
  81. cursor: pointer;
  82. }
  83. .modal-body {
  84. position: relative;
  85. }
  86. .modal .close {
  87. position: absolute;
  88. width: 4em;
  89. height: 2em;
  90. top: 1em;
  91. right: 1em;
  92. }
  93. .modal .close:hover {
  94. cursor: pointer;
  95. background-color: lightcyan;
  96. color: #000;
  97. box-shadow: 0 0 2px #eee;
  98. }
  99. /* 页面初始化时,模态框应该隐藏 */
  100. .modal {
  101. display: none;
  102. }

demo6.js 代码:

  1. const btn = document.querySelector("header button");
  2. const modal = document.querySelector(".modal");
  3. const close = document.querySelector(".close");
  4. btn.addEventListener("click", setModal, false);
  5. close.addEventListener("click", setModal, false);
  6. function setModal(ev) {
  7. ev.preventDefault();
  8. let status = window.getComputedStyle(modal, null).getPropertyValue("display");
  9. modal.style.display = status === "none" ? "block" : "none";
  10. }

显示效果如下:

点击前效果:

点击后效果:

  • 使用定位制作一个五环

五环样式要求如下:

为了显示效果,将五环置于屏幕中央
示例代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>使用绝对定位实现五环效果</title>
  6. <link rel="stylesheet" href="style/five-ring.css" />
  7. </head>
  8. <body>
  9. <div class="body">
  10. <div class="circle1"></div>
  11. <div class="circle2"></div>
  12. <div class="circle3"></div>
  13. <div class="circle4"></div>
  14. <div class="circle5"></div>
  15. </div>
  16. </body>
  17. </html>

five-ring.css 代码

  1. * {
  2. padding: 0;
  3. margin: 0;
  4. box-sizing: border-box;
  5. }
  6. html {
  7. font-size: 10px;
  8. }
  9. .body {
  10. width: 35em;
  11. height: 20em;
  12. /* border: 1px solid #000;
  13. background-color: lightcyan; */
  14. }
  15. .body {
  16. position: relative;
  17. /* overflow: hidden; */
  18. position: fixed;
  19. top: 50%;
  20. left: 50%;
  21. transform: translate(-50%, -50%);
  22. }
  23. .circle1,
  24. .circle2,
  25. .circle3,
  26. .circle4,
  27. .circle5 {
  28. position: absolute;
  29. width: 10em;
  30. height: 10em;
  31. border: 10px solid #0388d4;
  32. border-radius: 50%;
  33. }
  34. .circle1 {
  35. top: 0;
  36. left: 0;
  37. z-index: 1;
  38. }
  39. .circle2 {
  40. top: 0;
  41. left: 11em;
  42. border-color: #000;
  43. z-index: 3;
  44. }
  45. .circle3 {
  46. top: 0;
  47. left: 22em;
  48. border-color: #df0510;
  49. z-index: 5;
  50. }
  51. .circle4 {
  52. top: 4.5em;
  53. left: 5.5em;
  54. border-color: #f7b714;
  55. z-index: 2;
  56. }
  57. .circle5 {
  58. top: 4.5em;
  59. left: 16.5em;
  60. border-color: #038f40;
  61. z-index: 4;
  62. }

显示效果如下:

五环

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议