博客列表 >浮动 & 定位

浮动 & 定位

培(信仰)
培(信仰)原创
2020年12月22日 22:28:55544浏览

浮动

浮动的本质

浮动的初心是为了解决图片与文本并排显示的问题

  1. <h1>浮动的本质</h1>
  2. <div class="box">
  3. <!-- 浮动的初心是为了解决图片与文本并排显示的问题 -->
  4. <img src="https://img.php.cn/upload/course/000/000/001/5fae4f08a043a576.png" alt="图片">
  5. <div class="desc">
  6. <h2>第十四期_前端开发</h2>
  7. <p>php中文网第十四期前端开发部分学习目标:1、HTML5+CSS3基础知识与实战; 2、完成网站所有静态页面布局;重点:弹性布局与网格布局;3.JavaScript、jQuery、ES6基础与实战
  8. ;4.Vue.js基础与实战</p>
  9. <a href="">了解详情</a>
  10. </div>
  11. </div>
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0 box-sizing: border-box;
  5. }
  6. .box {
  7. padding: 1em;
  8. border: 1px solid #000;
  9. }
  10. .box img {
  11. width: 28em;
  12. /* 圆角 */
  13. border-radius: 0.5em;
  14. /* 图片向左浮动,后面的文本会围绕着它水平排列 ,浮动本质*/
  15. /* 也可以右浮动 */
  16. /* 浮动元素不会影响到它前面的元素,只会影响到它后面的元素排列
  17. 浮动元素只会水平方向排列
  18. 浮动元素脱离文档流(部分脱离文档流,并非完全脱离,只对后面的元素有影响)
  19. 所有元素一旦浮动都具备了块级元素的特征 */
  20. float: left;
  21. margin-right: 2em;
  22. }
  23. .box .desc a {
  24. /* a标签是行内元素设置宽应该没有效果,但是一旦浮动后宽高就起作用了 */
  25. width: 12em;
  26. height: 2em;
  27. background-color: lightgreen;
  28. float: left;
  29. }
  30. </style>

总结:

  1. 1. 浮动只限于水平方向
  2. 2. 浮动元素脱离文档流,后面元素会上移填充它原来的空间
  3. 3. 浮动元素不会影响到它前面元素的布局,只会影响到它后面的元素排列
  4. 4. 任何元素(包括行内元素)浮动后,都具备了块级元素的特征

父元素计算高度的时候会忽略内部的浮动元素(父级高度的塌陷),怎么解决呢?

方案1. 附加元素。添加一个额外元素

  1. <!-- 在需要清除的元素后面新增一个元素,没有实际的意义就是清除浮动 -->
  2. <div class="clear"></div>
  1. .clear {
  2. clear:left;
  3. }

方案1有些问题,所有的DOM元素都是由用的尽量不要写没有作用的元素;还存在一定的风险;另外在遍历元素取值时也需要有额外的工作来处理这些元素;代码不够简洁和优雅。

方案2. 伪元素

什么是伪元素:html中没有元素,通过css强制加上去的元素

  1. .box:after{
  2. content:'';
  3. display: block;
  4. /* 左右都清除 */
  5. /* clear:left;clear:right; */
  6. clear:both;
  7. }

通过伪元素的方式优雅的解决了浮动父元素高度塌陷的问题

当浏览器窗口达到一定宽度时,文字会包裹图片,而需求是图片和文本分别布局互不影响,右边的文本不受左边图片的影响,如何做?

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

子元素可以使用overflow: hidden;那么父元素是否可以可以使用它来消除浮动的影响呢?

方案3. 不使用伪元素

  1. .box .desc {
  2. overflow: hidden;
  3. }
  4. .box {
  5. overflow: hidden;
  6. }

优雅方便的解决了父元素高度塌陷问题。

总结:
浮动的本质是为了解决图文并排显示问题

  1. 浮动元素的高度对于他的包含块不可见
  2. 浮动元素可以BFC块使它不影响到后面的元素布局。

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

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

浮动以后会很少使用,因为在弹性盒子和grid中是失效的。

定位

定位类型:静态定位static,相对定位relative,绝对定位absolute,固定定位:fixed

  1. 静态定位:position:static 默认文档流定位,元素的显示位置与源码的顺序一致;
  2. 相对定位:position: relative;相对该元素的原始位置进行定位(偏移)
  3. 绝对定位:position: absolute;相对于祖先中离他最近的“定位元素”的位置发生偏移
    如果祖先中没有定位元素,它就参考根元素(html)进行定位
    定位元素:只要这个元素中有
    1. position:relative;
    2. position:absolute
    3. 就是定位元素
  4. 固定定位:position:fixed;是绝对定位的一个特例,它始终相对HTML定位
    1. 只有定位元素才有资格充当定位祖先元素(定位参考,定位父级)
    2. 固定定位一般用在:在线客服,广告位等,要慎重,因为会影响用户体验

综合应用:实现一个简易的带蒙板的登录框

  1. <header>
  2. <h2>我的博客</h2>
  3. <button>登录</button>
  4. <link rel="stylesheet" href="style.css">
  5. </header>
  6. <!-- 模态框 -->
  7. <div class="modal">
  8. <!-- 蒙板:用来盖住后面的内容,使他半透明 -->
  9. <div class="modal-backdrop"></div>
  10. <!-- 主体 -->
  11. <div class="modal-body">
  12. <button class="close">关闭</button>
  13. <form action="" method="post">
  14. <table>
  15. <caption>用户登录</caption>
  16. <tr>
  17. <td>
  18. <label for="email">邮箱</label>
  19. </td>
  20. <td>
  21. <input type="text" name="email">
  22. </td>
  23. </tr>
  24. <tr>
  25. <td>
  26. <label for="password">密码</label>
  27. </td>
  28. <td>
  29. <input type="password" name="password">
  30. </td>
  31. </tr>
  32. <tr>
  33. <td></td>
  34. <td><button>登录</button></td>
  35. </tr>
  36. </table>
  37. </form>
  38. </div>
  39. </div>
  40. <script src="modal.js"></script>
  1. * {
  2. padding: 0;
  3. margin: 0;
  4. box-sizing: border-box;
  5. }
  6. /* 页眉 */
  7. header {
  8. background-color: #ccc;
  9. padding: .5em 2em;
  10. overflow: hidden;
  11. }
  12. header h2 {
  13. float: left;
  14. }
  15. header button {
  16. float: right;
  17. width: 10em;
  18. height: 2.5em;
  19. }
  20. header button:hover {
  21. cursor: pointer;
  22. background-color: #fff;
  23. }
  24. /* 模态框 */
  25. /* 蒙板 */
  26. .modal .modal-backdrop {
  27. background:rgb(0,0,0,0.5);
  28. position: fixed;
  29. top: 0;
  30. left: 0;
  31. right: 0;
  32. bottom: 0;
  33. }
  34. .modal .modal-body {
  35. padding: 1em;
  36. min-width: 25em;
  37. border: 1px solid #000;
  38. background: linear-gradient(to right, green, #efefef);
  39. /* 固定定位 */
  40. position: fixed;
  41. top: 5em;
  42. left: 30em;
  43. right: 30em;
  44. }
  45. .modal form table {
  46. width: 80%;
  47. }
  48. .modal form table caption {
  49. font-weight: bold;
  50. margin-bottom: 1em;
  51. }
  52. .modal form table td {
  53. padding: 0.5em;
  54. }
  55. .modal form table td:first-of-type {
  56. width: 5em;
  57. }
  58. .modal form table input {
  59. width: 20em;
  60. height: 2em;
  61. }
  62. .modal form table button {
  63. width: 20em;
  64. height: 2.5em;
  65. }
  66. /* 定位父级 */
  67. .modal-body {
  68. position: relative;
  69. }
  70. .modal .close {
  71. position: absolute;
  72. width: 4em;
  73. height: 2em;
  74. top: 1em;
  75. right: 1em;
  76. }
  77. .modal .close:hover {
  78. cursor: pointer;
  79. background-color: red;
  80. color: white;
  81. }
  82. /* 页面初始化时,模态框应该隐藏 */
  83. .modal {
  84. display: none;
  85. }
  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. }

总结:定位应用很广泛也很实用。难点是position属性的几个值的参考对象。其他深层次的领悟需要后续多摸索。

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