浮动

浮动的本质就是为了实现文字环绕效果。

特性

包裹性

包裹性: 由“包裹”和“自适应性”两部分组成。

包裹: 假设浮动元素父元素宽度 200px,浮动元素子元素是一个 128px 宽度的图片, 则此时浮动元素宽度表现为“包裹”,就是里面图片的宽度 128px

自适应性: 如果浮动元素的子元素不只是一张 128px 宽度的图片,还有一大波普通 的文字,则此时浮动元素宽度就自适应父元素的 200px 宽度,最终的宽度表现也是 200px。 ::: demo

<template>
  <div class="basis-float-wrap" style="width:200">
    <div class="float">
      <img
        width="128"
        src="https://cy-picgo.oss-cn-hangzhou.aliyuncs.com/wallhaven-6k7jxw.jpg"
      />
      我是帅哥,好巧啊,我也是帅哥,原来看这本书的人都是帅哥~
    </div>
  </div>
</template>
<script>
  export default {};
</script>
<style>
  .basis-float-wrap .float {
    float: left;
  }
</style>

:::

块状化并格式化上下文

块状化的意思是,元素一旦 float 的属性值不为 none,则其 display 计算值就是 block 或者 table。

span {
  float: left;
  display: block; /* 多余 */
}
span {
  float: left;
  vertical-align: middle; /* 多余 */
}

也不要指望使用 text-align 属性控制浮动元素的左右对齐,因为 text-align 对块级元素是无效的。

破坏文档流

没有任何 margin 合并

"行框盒子(每行内联元素所在的那个盒子)和浮动元素的不可重叠性”,也就是“行框盒子如果和浮动元素的垂直高度有 重叠,则行框盒子在正常定位状态下只会跟随浮动元素,而不会发生重叠”。 ::: demo

<template>
  <div class="basis-float-wrap">
    <div class="float">
      <img
        height="85"
        width="128"
        src="https://cy-picgo.oss-cn-hangzhou.aliyuncs.com/wallhaven-6k7jxw.jpg"
      />
    </div>
    <div class="basis-float-content">
      苦杂金板假旁营哭就托艺形及达相期。功甚。姐跳饭第福翻袋同写然守袋?子堂米马迹兰青争许禁属。下败宫信元色营财口春?不越耳人味车经局秋。舞烈合行预录兰圣走洲?激之尔宝群口史行坐器释余型持洗。洲考象险多喝早注运?命乡方农千护素露处朋叫?凡下轻戏职永!象士找维愿妈亲印声房飞刚卫请乱?落现范孩望四严步枪凡须探教将须。定心取现改?继士顶姆河担强?救们示园言较?佛女白痛盖承婚令找给笔忆读属找!脑束终院它演千济话例?脱嘴萨得腿露。专查微飞虽端挥弄睛北?
    </div>
  </div>
</template>
<script>
  export default {};
</script>
<style></style>

:::

浮动后面元素 margin 负无穷大依然无效,只有外部的块状容器盒子尺寸变大,而和浮动元素垂直方向有重叠的“行框盒子” 依然被限死在那里

.basis-float-content {
  margin-left: -100px;
}

作用机制

  • 浮动锚点: float 元素所在的“流”中的一个点,这个点本身并不浮动,就表现而言 更像一个没有 margin、border 和 padding 的空的内联元素。
  • 浮动参考:浮动元素对齐参考的实体。

为何右浮动时html 的结构要反着写

<li class="basis-float-list-item">
  <span class="badge">14</span>
  Cras justo odio
</li>

看看具体的表现效果 ::: demo

<template>
  <ul class="basis-float-list">
    <li class="basis-float-list-item">
      <span class="badge">14</span>
      C妹资请幸山曲牛份严姐波制美。青编请周败?
    </li>
    <li class="basis-float-list-item">
      <span class="badge">16</span>
      赛信男慢言底再动星左消沙七装洗香。权眼。研切处形范著呀喜洛宫鞋任剧蜖树休。忍刚。轻桌目迹法烧术男这助摇毛烈农制式因?请。
    </li>
    <li class="basis-float-list-item">
      <span class="badge">16</span>
      赛信男慢言底再动星左消沙七装洗香。权眼。研切处形范著呀喜洛宫鞋任剧蜖树休。忍刚。轻桌目迹法烧术男这助摇毛烈农制式因?请。切领半点枪珍规议烧!极剧批旅很诺难!
    </li>
  </ul>
</template>
<script>
  export default {};
</script>
<style>
  .basis-float-list-item {
    display: block;
    padding: 0.625em 1em;
    border: 1px solid #c9a873;
    margin-bottom: -1px;
  }
  .basis-float-list-item .badge {
    float: right;

    padding: 0.125em 0.625em;
    box-sizing: border-box;
    font-size: 12px;
    border-radius: 9999px;
    background-color: #c9a873;
  }
</style>

:::

::: demo

<template>
  <ul class="basis-float-list">
    <li class="basis-float-list-item">
      C妹资请幸山曲牛份严姐波制美。青编请周败?
      <span class="badge">14</span>
    </li>
    <li class="basis-float-list-item">
      赛信男慢言底再动星左消沙七装洗香。权眼。研切处形范著呀喜洛宫鞋任剧蜖树休。忍刚。轻桌目迹法烧术男这助摇毛烈农制式因?请。
      <span class="badge">16</span>
    </li>
    <li class="basis-float-list-item">
      赛信男慢言底再动星左消沙七装洗香。权眼。研切处形范著呀喜洛宫鞋任剧蜖树休。忍刚。轻桌目迹法烧术男这助摇毛烈农制式因?请。切领半点枪珍规议烧!极剧批旅很诺难难难!
      <span class="badge">16</span>
    </li>
  </ul>
</template>
<script>
  export default {};
</script>
<style></style>

:::

反着写的优点

  • 不管内容没满一行,刚满一行,还是多行,浮动元素都以第一行对齐,且具有良好的样式
  • 兼容 IE7 等低版本浏览器,因为 IE7 浮动的元素会在下一行内容的右边

两栏或多栏的自适应布局

::: demo

<template>
  <div>
    <div class="basis-float-flow">
      <div class="float-left">←上一章</div>
      <div class="float-right">下一章→</div>
      <div class="title">夜的第七章</div>
    </div>
    <div class="basis-float-flow">
      <div class="float-left avatar">🤪</div>
      <div class="content">
        名景深却影近流听划华谁念色安出伦仍外现。客际定争沉他激呢弹第诺害败味浪。店形定五市黑余?汉及种高艺低印所寻更但败列脱停青杀局。击依约卡资责良洋待力?腿子响熟己阵取说早无?最中式风害哭点向才卫!下金休跟男下建买续弟另换顶父采森笑起。冷些哥身半细则记立?遍演纳秋门放半义立月击怀?做顾孤生弄店听抱根前!师向火段步命收会护试影运戏出。保份鲁孩寻忽很修未语!英丝关鱼维话德调价洗?建记毫姆班莱消前朝恐线器晚!
      </div>
    </div>
  </div>
</template>
<script>
  export default {};
</script>
<style>
  .basis-float-flow .float-left {
    float: left;
  }
  .basis-float-flow .float-right {
    float: right;
  }
  .basis-float-flow .avatar {
    height: 64px;
    width: 64px;
    font-size: 64px;
  }
  .basis-float-flow .content {
    padding-left: 74px;
  }
  .basis-float-flow .title {
    padding: 0 70px;
    text-align: center;
  }
</style>

:::

原理其实很简单,content 元素没有浮动,也没有设置宽度,因此,流动性保持得很好, 设置 margin-left、border-left 或者 padding-left 都可以自动改变 content box 的尺寸, 继而实现了宽度自适应布局效果。

清除浮动

clear 属性

  • none:默认值,左右浮动来就来。
  • left:左侧抗浮动。
  • right:右侧抗浮动。
  • both:两侧抗浮动。

::: demo

<template>
  <ul class="basis-float-clear">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</template>
<script>
  export default {};
</script>
<style>
  .basis-float-clear {
    padding: 0;
    margin: 0;
    list-style: none;
  }
  .basis-float-clear li {
    float: left;
    width: 16px;
    height: 16px;
    margin-top: 8px;
    margin-right: 8px;
    background: #7198a3;
  }
  .basis-float-clear li:nth-of-type(3) {
    clear: both;
  }
</style>

:::

.clearfix::after {
  display: block;
  clear: both;
  content: "";
}

clear 属性只有块级元素才有效的,而::after 等伪元素默认都是内联水平,这就是借 助伪元素清除浮动影响时需要设置 display 属性值的原因。

Last updated: 1/4/2021, 9:35:29 AM