博客列表 >CSS进阶响应式布局浮动定位知识

CSS进阶响应式布局浮动定位知识

wen。
wen。原创
2021年01月17日 16:22:031159浏览

响应式布局

响应式布局等于流动网格布局,这里响应式布局分为四种;第一种浮动float布局(传统布局),第二种定位position布局,第三种弹性flex盒子,还有最后一种网格grid布局;后两种会在接下来的文章中介绍,本章主要讲定位布局。

1.浮动布局float

解释 说明
本质 为了解决图文并茂显示问题
核心 浮动初心是为了解决图片与文本并排显示的问题
原理 浮动元素脱离了文档流,后面的元素会上移填充它原来的空间
特征 任何元素(包括行内元素)浮动后,都具备了块级元素的特征

注意:浮动元素不会影响到它前面的元素的布局,只会影响到后面的元素的排列

1.1 浮动问题

  • 父元素计算高度的时候,会忽略内部的浮动元素(父级高度塌陷)
    • 解决方式是使用clear:both清除浮动
  • 如何解决右边元素文本自动延伸到左边浮动元素的下面
    • BFC:创建独立的布局单元
    • 创建BFC的方式: 任何一个元素添加上以下任何一个属性后就是一个BFC容器
符合BFC法则 备注
float: left / right 不能是 none
overflow: hidden / auto / scroll 不能是 visible
display: inline-block / table-cell
display: flex / inline-flex
display: grid / inline-grid
position: absolute / fiexed
  • 如何不使用清除浮动来解决父级高度塌陷和左右浮动元素独立问题
    • 在父类元素使用overflow:hidden转为BFC

2.定位布局position

2.1 定位类型

类型 说明
static 默认,也就是文档流定位,元素的位置和源码顺序一样
relative 相对于该元素在文档流中的原始位置进行偏移
absolute 相对于它的定位祖先元素中离它最近的”定位元素”的位置发生偏移
fiex 它始终相对于html进行定位

何为”定位元素”呢?

定位元素:只要这个元素中有position:relavite或者position:absolute就称为定位元素;

2.2 使用条件

  • 相对定位
    • 父级元素转为定位元素,它内部的元素就相对于它进行绝对定位
  • 绝对定位
    • 绝对定位元素会脱离文档流
    • 如果祖先元素中不存在定位元素,它就参考根元素(html)进行定位
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>相对定位</title>
  7. <style>
  8. .box{
  9. width: 15em;
  10. height: 15em;
  11. background-color: lawngreen;
  12. /* 转为定位元素,它内部的元素就相对于它进行绝对定位 */
  13. position: relative;
  14. }
  15. .box .sub{
  16. width: 5em;
  17. height: 5em;
  18. left: 0;
  19. right: 0;
  20. top: 0;
  21. bottom: 0;
  22. /* 使用绝对定位的完全定位空间来快速实现水平和垂直居中 */
  23. margin: auto;
  24. background-color: yellow;
  25. position: absolute;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="box">
  31. <div class="sub"></div>
  32. </div>
  33. </body>
  34. </html>

效果图如下
定位元素效果图

3.模态框实战

接下来我们运用固定定位来实现模态框效果

3.1 css代码如下

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. header {
  7. padding: 1em 2em;
  8. background-color: #ccc;
  9. overflow: hidden;
  10. }
  11. header h2 {
  12. float: left;
  13. }
  14. header button {
  15. width: 10em;
  16. height: 2.5em;
  17. float: right;
  18. }
  19. .modal {
  20. width: 5em;
  21. height: 5em;
  22. display: none;
  23. }
  24. .modal .modal-backsorp {
  25. /* 蒙版 */
  26. background-color: rgba(0, 0, 0, 0.8);
  27. left: 0;
  28. top: 0;
  29. right: 0;
  30. bottom: 0;
  31. position: fixed;
  32. }
  33. .modal .modal-body {
  34. left: 30em;
  35. top: 5em;
  36. right: 30em;
  37. min-height: 15em;
  38. /* 固定定位 */
  39. position: fixed;
  40. background-color: #fff;
  41. }
  42. .modal .modal-body .pane-header {
  43. width: 100%;
  44. height: 64px;
  45. background-color: orangered;
  46. border-radius: 5px 5px 0 0;
  47. line-height: 64px;
  48. color: white;
  49. text-align: center;
  50. margin-bottom: 10px;
  51. cursor: move;
  52. padding: 0em 2em 0em 2em;
  53. }
  54. .modal .modal-body .pane-header h2 {
  55. float: left;
  56. padding-left: 6em;
  57. }
  58. .modal .modal-body .pane-header button {
  59. float: right;
  60. padding: 0.3em;
  61. width: 5em;
  62. margin-top: 1.2em;
  63. }
  64. .modal .modal-body .pane-content {
  65. padding: 2em;
  66. }
  67. .modal .modal-body .pane-content .userpwd {
  68. margin-bottom: 15px;
  69. height: 40px;
  70. position: relative;
  71. }
  72. .modal .modal-body .pane-content .userpwd img {
  73. position: absolute;
  74. top: 7px;
  75. left: 6px;
  76. }
  77. .modal .modal-body .pane-content .userpwd input {
  78. width: 100%;
  79. height: 100%;
  80. box-sizing: border-box;
  81. padding-left: 38px;
  82. border-radius: 5px;
  83. border: 1px solid #dddddd;
  84. }
  85. input[type="text"],
  86. input[type="password"] {
  87. border-width: 1px;
  88. border-style: solid;
  89. border-color: #707070 #CECECE #CECECE #707070;
  90. padding: 2px 4px;
  91. height: 18px;
  92. line-height: 18px;
  93. vertical-align: middle;
  94. }
  95. .modal .modal-body .login-btn {
  96. margin: 15px 0;
  97. width: 100%;
  98. height: 38px;
  99. background-color: orangered;
  100. border: 0;
  101. font-size: 20px;
  102. color: white;
  103. border-radius: 5px;
  104. cursor: pointer;
  105. }

3.2 html代码如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>固定定位:模态框</title>
  7. <link src="modal.css">
  8. </head>
  9. <body>
  10. <!-- 页眉 -->
  11. <header>
  12. <h2>我的博客</h2>
  13. <button>登录</button>
  14. </header>
  15. <!-- 模态框 -->
  16. <div class="modal">
  17. <!-- 蒙板:用来盖住后面的内容,使它半透明状态 -->
  18. <div class="modal-backsorp"></div>
  19. <!-- 主体 -->
  20. <div class="modal-body">
  21. <div class="pane-header">
  22. <h2>登陆页面模板</h2>
  23. <button class="close">关闭</button>
  24. </div>
  25. <div class="pane-content">
  26. <form name="form1" method="post" action="login.php">
  27. <div class="userpwd">
  28. <img src="images/icon_people.png">
  29. <input type="text" name="userid" placeholder="请输入用户名/手机号">
  30. </div>
  31. <div class="userpwd">
  32. <img src="images/icon_password.png">
  33. <input type="password" name="pwd" placeholder="请输入密码">
  34. </div>
  35. <dt>&nbsp;</dt>
  36. <button type="submit" name="sm1" class="login-btn" onclick="this.form.submit();">登录</button>
  37. </form>
  38. </div>
  39. </div>
  40. </div>
  41. </body>
  42. <script src="modal.js"></script>
  43. </html>

3.3 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. }

3.4 效果图如下
模态框效果图

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