乐趣区

关于css:CSS-弹性浮动布局应用

其实文章原名叫做“碰到不反对 flex 的我的项目怎么办?”

当初差不多曾经是 flex 的天下了,简略灵便,但有时还是不可避免的会接触到 IE 浏览器,比方我最近接触的 阅文作家专区 (qq.com),这个就是须要兼容 IE9,也天然不能应用 flex 布局了。不能应用 flex 怎么办(这个我的项目怎么这么 XX,都 2021 年了还要兼容 IE)?那只能回归传统布局形式了,也就是浮动布局。

浮动 float 能够说是 CSS 布局里最为灵便的布局之一了,千万不要小瞧了浮动,有些布局只有浮动能力实现呢。上面将介绍几种常见的布局,一起看看吧

一、文本盘绕布局

这类布局应该就是浮动最后的用意了,比方这样的

设置一个左浮动就能够了,实现如下

<div>
  <strong class="float"> 浮 </strong>
  <p> 动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。</p>
</div>
.float{
  float: left;
  /* 其余款式 */
}

残缺代码可拜访 float-layout (codepen.io)

须要留神的是,浮动元素必须放在文本的后面(HTML 构造),如果放在文本前面

<div>
  <p> 动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。</p>
  <strong class="float"> 浮 </strong>
</div>

那么就会变成这样

也就是说,浮动的影响范畴是由浮动元素在 HTML 中的构造决定的,这一点十分重要

不过,当初很少会见到这种盘绕布局了,但有些时候这种思路还是挺有用的,比方在这篇文章 CSS 实现多行文本“开展收起”(juejin.cn),外面就用到了浮动的个性,实现了右下角文本盘绕的成果,有趣味的能够看看

二、两栏布局

两栏布局的特点是右边是固定尺寸,左边主动撑满残余空间,例如

构造如下

<div class="crad">
  <img class="head" src="xxx.jpg">
  <p class="info"> 浮动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。</p>
</div>

浮动实现如下,次要是文本须要设置 overflow: hidden。这里就不谈实现原理(BFC)了,有趣味深究的能够查看这篇文章 CSS 深刻了解流体个性和 BFC 个性下多栏自适应布局

.head{float: left;}
.info{overflow: hidden;}

如果左边是固定尺寸,比方这样的

这种状况如何解决呢?很多人可能会想到右浮动,没错,然而要留神,HTML 构造不须要改变,也就是浮动元素依然在文本的后面

.head{float: right;}

值得注意的是,如果须要设置两栏的间距 margin,须要设置在 浮动元素

.head{
  float: left;
  margin-right: 8px;
}

残缺代码可拜访 float-2-cols

三、三栏布局

三栏布局的特点是左右是固定尺寸,两头主动撑满残余空间,例如

构造如下

<div>
  <img class="head" src="xxx.jpg">
  <div class="right"> 编辑 </div><!-- 留神是在文本的后面 -->
  <p class="info"> 浮动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。</p>
</div>

留神,这里位于右侧的按钮在 HTML 构造中依然是在文本的后方,只须要设置右浮动就行了

.head{float: left;}
.info{overflow: hidden;}
.right{
  float: right;
  margin-left: 8px;
  /* 其余款式 */
}

残缺代码可拜访 float-3-cols (codepen.io)

四、文本省略追随布局

还有一类比拟常见然而有些辣手的布局,是这样的

  1. 当文本比拟多时,超出暗藏,标签文本在最左边
  2. 当文本比拟少时,标签文本追随文本

示意如下

这里如何应用浮动实现呢?仔细观察,其实就是一个两栏布局

<div class="card">
    <div class="right"> 编辑 </div>
  <p class="info"> 浮动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。始终平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。</p>
</div>
.info{
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

很显著当初标签文本始终位于左边,那如何实现标签文本追随的成果呢?其实能够嵌套一个最大宽度为 100% 的容器

<div class="card">
  <div class="wrap"> <!-- 增加一个最大宽度为 100% 的容器 -->
        <div class="right"> 标签 </div>
        <p class="info"> 浮动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。始终平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。</p>
  </div>
</div>
.wrap{
  display: inline-block;
  max-width: 100%;
}

残缺代码可拜访 float-auto-text (codepen.io)

如果不思考兼容的话,width: fit-content 会是更好的抉择,能够使容器放弃 block 的个性,并且宽度由文本内容决定,具体能够参考这篇文章:了解 CSS3 max/min-content 及 fit-content 等 width 值

.wrap{
  /*display: inline-block;*/
  max-width: 100%;
  width: fit-content;
}

另外,如果多行文本就不实用了,能够用另一种形式实现,具体原理能够查看这篇文章 CSS 实现多行文本“开展收起”(juejin.cn)

残缺代码可拜访 float-mul-tags (codepen.io)

五、其余扩大布局

这一部分相当于以上的扩大了,上面来看一个案例。

有时候标签的前面会有日期,会始终位于最左边,成果如下

有人可能会想到相对定位,然而这里的日期可能不是固定的,须要自适应宽度,那如何实现呢?其实就是就是两种布局的联合

因而须要再增加一层容器,实现如下

<div class="card">
    <span class="date">6-14</span>
    <div class="outer-wrap"> <!-- 新加一层容器 -->
        <div class="wrap">
            <div class="right">
                <button class="btn"> 标签 </button>
            </div>
            <p class="info"> 浮动属性指定一个元素应沿其容器的左侧或右侧搁置,容许文本和内联元素盘绕它。该元素从网页的失常流动 (文档流) 中移除,只管依然放弃局部的流动性。始终平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。</p>
    </div>
  </div>
</div>

上面就是两栏布局的写法

.date{float: right;}
.outer-wrap{overflow: hidden;}

提醒:如果采纳 fit-content 形式,能够省去 .outer-wrap 这一层容器

实时成果如下

残缺代码可拜访 float-auto-text-fixed (codepen.io)

六、总结和阐明

下面介绍了浮动布局的几个罕用案例,置信能实用于绝大部分布局,当然并不是举荐大家肯定要应用浮动布局,甚至有时候布局凌乱(HTML 构造与视觉不统一)、实现啰嗦(嵌套层级多)等状况,然而在不兼容 flex 布局的浏览器中还是挺有用的(低于 IE10),甚至还有仅仅只能应用浮动能力实现的布局(文本盘绕)。这里总结如下

  1. 通过 BFC 实现自适应弹性布局,float + overflow
  2. 浮动的影响范畴是由浮动元素在 HTML 中的构造决定的
  3. 通过设置最大宽度实现文本追随成果(fit-content 也能够)
  4. 其余布局可互相组合实现
  5. 另外这些 float 实现形式全兼容(IE6+),能够放心使用

随着 IE 的逐步退去,有些布局也会缓缓的淡出,就像早年的 table 布局一样。但浮动布局始终在往新个性上倒退,比方 Shapes 布局就须要浮动做反对,另外,浮动布局也在缓缓反对逻辑属性,比方 float: inline-start。最初,CSS 最重要的是灵活性,多一种思路总是没错的。如果感觉还不错,对你有帮忙的话,欢送点赞、珍藏、转发❤❤❤

退出移动版