CSS中的流

流(文档流),我们常说的文档流到底指的是什么? 流实际上是CSS中一种基本的定位和布局机制,把文档流看作现实生活中的水流,divspan代表着CSS中的块级元素代表和内联元素代表,当水流入一个容器中,那么水面一定是平整的,放入木头,木头多半是浮于水面的,其特征对应着CSS中的div(水)span(木头)如下图:

1.png
2.png

总而言之,所谓“流”,就是 CSS 世界中引导元素排列和定位的一条看不见的“水流”。(从上到下,从左到右)

什么是流体布局?

”流体布局“就是利用元素”流“的特性实现各类的布局效果。因为流本身具有自适应特性,所以流体布局也具有自适应特性,我们常说的”div+css布局“其实就是流体布局。

外部尺寸:就是div的宽度

内部尺寸:元素的尺寸由内部的元素决定

无宽度准则:意思是不给容器的外部尺寸设固定值的宽度,如果直接设死宽度,流动性会丢失。优点:布局会更灵活,容错性更强

宽度分离原则:就是 CSS 中的 width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存,作用将影响的子元素降到最低,方便维护

width独占一层标签,而padding、border、margin 利用流动性在内部自适应呈现

  1. .father {
  2. width: 180px;
  3. }
  4. .son {
  5. margin: 0 20px;
  6. padding: 20px;
  7. border: 1px solid;
  8. }

高度自适应

CSS中margin 无效的情形

在实际开发的时候,经常会遇到设置的margin 无效的情形,可能有如下情况:

  • display表现为inline的非替换元素(没有src属性)的垂直margin是无效的

    1. <div class="box">
    2. <span>123456</span>
    3. </div>
    4. <style>
    5. .box{
    6. width: 200px;
    7. height: 200px;
    8. background: chartreuse;
    9. }
    10. span{
    11. margin-top: 10px; //无效
    12. margin-left: 10px;//有效
    13. }
    14. </style>
  • 表格中的元素或者设置 display 计算值是 table-cell 或 table-row 的元素的margin 都是无效的。

  • margin 合并的时候,更改 margin 值可能是没有效果的。以父子 margin 重叠为例,假设父元素设置有 margin-top:100px,则此时子元素设置 margin-top:50px 就没有任何效果表现,除非大小比 100px 大,或者是负值。
    1. <div class="father-box">
    2. <div class="child-box"></div>
    3. </div>
    4. <style>
    5. .father-box{
    6. width: 200px;
    7. height: 200px;
    8. background: chartreuse;
    9. margin-top: 100px;
    10. }
    11. .child-box{
    12. width: 100px;
    13. height: 100px;
    14. margin-top: 50px; //这个时候的margin无效
    15. background: cyan;
    16. }
    17. </style>

css中的三角形

  1. .triangle{
  2. width: 0;
  3. border-width: 10px 20px;
  4. border-style: solid;
  5. border-color: #000 transparent transparent transparent; /*倒三角*/
  6. }
  7. .triangle{
  8. width: 0;
  9. border-width: 10px 20px;
  10. border-style: solid;
  11. border-color: transparent #000 transparent transparent; /*右三角*/
  12. }
  13. .triangle{
  14. width: 0;
  15. border-width: 10px 20px;
  16. border-style: solid;
  17. border-color: transparent transparent #000 transparent; /*正三角*/
  18. }
  19. .triangle{
  20. width: 0;
  21. border-width: 10px 20px;
  22. border-style: solid;
  23. border-color: transparent transparent transparent #000; /*左三角*/
  24. }

渐变圆角边框几种实现

实现这种样式通常会想到border-image,但这个属性没有办法设置圆角的边框,原因是使用 border-image 最大的问题在于,设置的 border-radius 会失效。

  1. 图形结合

    1. <div class="jb-bg flex-btn">
    2. <div class="inside-bg flex-btn">
    3. </div>
    4. </div>
    5. <style>
    6. .jb-bg {
    7. width: 313px;
    8. height: 62px;
    9. background: linear-gradient(180deg, rgba(128, 255, 255, 0.596), rgba(128, 255, 255, 100%));
    10. border-radius: 30px;
    11. position: absolute;
    12. left: 50%;
    13. transform: translateX(-50%);
    14. bottom: 157px;
    15. display: flex;
    16. justify-content: center;
    17. align-items: center;
    18. }
    19. .inside-bg {
    20. width: 305px;
    21. height: 54px;
    22. background: rgba(38, 83, 128, 0.6);
    23. border-radius: 30px;
    24. }
    25. </style>
  2. border-image + clip-path

    1. <div class="border-img"></div>
    2. <style>
    3. .border-img{
    4. width: 200px;
    5. height: 62px;
    6. margin: 0 auto;
    7. border: 10px solid;
    8. border-image: linear-gradient(45deg, gold, deeppink) 1;
    9. clip-path: inset(0 round 10px);
    10. /* 意思是矩形裁剪实现一个父容器大小且 border-radius: 10px 的容器,将这个元素之外的所有东西裁剪掉(即不可见) */
    11. }
    12. </style>

圆柱的立体实现

  1. .yuanzhu {
  2. position: relative;
  3. height: 54px;
  4. width: 230px;
  5. margin-top: 30px;
  6. background: linear-gradient(180deg, #ffeab4 0%, #fff1d1 27%, #f8bb58 100%);
  7. margin: 30px auto;
  8. border-top-left-radius: 15px;
  9. border-bottom-left-radius: 15px;
  10. }
  11. .yuanzhu::after {
  12. position: absolute;
  13. // top: -10px;
  14. right: -10px;
  15. content: '';
  16. display: block;
  17. width: 20px;
  18. height: 54px;
  19. border-radius: 50%;
  20. background: linear-gradient(180deg, #fcc35c 0%, #ab710e 100%);
  21. }

实现效果:
progress_part.png