Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景

2018-04-0523:35:42WEB前端开发Comments2,405 views字数 2888阅读模式

CSS3 弹性盒子(flexbox),是一种新的布局方式。使用 flexbox,可以很方便的实现常见的布局以及居中效果。Bootstrap v4 的 Media object 也是使用 flexbox 来实现。flexbox 相关的属性较多,本文便结合几种的情形来探讨 flexbox 的应用场景。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

Boostrap v3 中的 Media object 使用 table-cell 实现,新版本则采用了 flexbox。table-cell 是一个不太常见的属性,使用该属性主要是:1. 实现两栏或者多栏布局;2.很容易实现元素垂直居中效果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

v4 版本使用了 flexbox,完成功能的同时,相较于 v3 更加简洁了。下面我们来结合 Media Object 介绍 flexbox 的相关知识。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

1. 常见的 Media object

Media object 用来实现常见的两栏或者多栏布局。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景

html 片段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

<div class="media">
    <img class="media-left media-pic" src="../assets/logo.png" />
    <div class="media-body">body</div>
    <div class="media-right">right</div>
</div>

scss 片段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

.media {
    display: flex;
    .media-pic {
        width: 50px;
        height: 50px;
        margin-right: 10px;
    }
    .media-body {
        flex: 1 1 230px;
        background-color: #b1b1b1;
    }
    .media-right {
        width: 50px;
    }
}

在需要布局的区域设置 display: flex 就完成了最基本的布局。通过在 media-body 部分设置 flex: 1 来让这部分自动占据剩余宽度。flex 是 flex-grow,flex-shrink 与 flex-basis 的简写,flex: 1 相当于 flex: 1 1 none,其中 flex-shink 为 1,该元素宽度扩张为剩余的宽度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

2. 常见的居中效果

有了 flexbox,我们可以很方便实现一些居中效果。这里讨论两种情形的居中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

2.1 元素的居中

在没有 flexbox 之前,让一个块级元素垂直居中用的是 负外边距 或者 table-cell 的方式来实现。现在有了 flexbox,居中很容易实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

html 片段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

<div class="vertical-container">
    <p>简单的垂直居中布局的方法</p>
</div>

scss 片段:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

.vertical-container {
    display: flex;
    align-items: center;
    justify-content: center;
}

2.2 align-self-center

在进行多栏布局中,我们其中的某一项垂直居中,Bootstrap 提供了一个 align-self-center 的类。把这个类添加到需要垂直居中的 flex item 上即可。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景
.align-self-center {
    align-self: center;
}

3. 关于 Flexbox 的一些细节

3.1 flex 与 flex-wrap 属性

flex 是 flex-shrink flex-grow flex-basis 的缩写,初始值是 flex: 0 1 auto。 默认情况下 flex-shrink 为 1,也就是说当 flex item 元素的宽度大于 Flexbox 的宽度时,flex item 元素的宽度会自动等比缩小,以避免撑破父元素。如果不希望子元素缩放,有两种情形。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

  1. 设置 flex-shrink 为 0,父元素加上滚动条。
    Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景
.media {
    overflow-x: scroll;
    .box {
        flex-shirnk: 0;
    }
    
}
  1. 设置父元素的 flex-wrap 为 wrap。
    Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景
.media {
    flex-wrap: wrap;
}

3.2 当使用 text-overflow 需要注意的细节

CSS 的 text-overflow 可以用来控制超长溢出的文字内容的显示方式,对于超出的内容可以是直接截断、用省略号表示,或用自定义的字符替代。但是要想使该属性生效,还需设置元素的 overflow,white-space 属性。我们可以简单写一个 text-overflow 的类,专门用来控制文本的显示。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

.text-overflow {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}

white-space: no-wrap 表示文本不会换行,除非遇到 <br>。与 Media object 想结合时,可能会导致文本把 Flex 容器撑破的情形。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

<h4>情形-1</h4>
<div class="media">
  <img class="media-left" src="../assets/logo.png" />
  <div class="media-body text-overflow">
    Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。
  </div>
  <div class="media-right"></div>
</div>
<h4>情形-2</h4>
<div class="media media3 media3-3">
  <img class="media-left" src="../assets/logo.png" />
  <div class="media-body">
    <p class="text-overflow">Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。</p>
  </div>
  <div class="media-right"></div>
</div>

渲染效果如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

Bootstrap 媒体对象(Media object) 谈 flexbox的应用场景

我们发现 text-overflow 作用在 flex item 下的元素时,flex item 宽度被撑破,整个 Flexbox 排版也全乱掉。情形-2演示的场景很常见。为了排版的灵活性,一般情况下,并不会把 media-body 的宽度设定为一个固定值。一种最简便的解决方案是设置 media-body 的 min-width 为 0。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

.media-body {
    min-width: 0;
}

当设置 min-width 为 0,media-body 的宽度就不会超过 Flexbox 的剩余宽度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

4. 总结

flex 弹性盒子的属性众多,一篇文章详解全部的属性也不太可能。一种好的方法是结合常见的排版情形来学习 flexbox。 下面总结一下文中涉及到的 flex box 相关的属性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

作用在 flex container 的属性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

  1. justify-content
  2. align-items
  3. flex-wrap

作用在 flex item 上的属性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

  1. flex (flex-shrink flex-grow flex-basis)
  2. align-self

作者:zy_deng
链接:https://juejin.im/post/5a25f934f265da43133cfee5
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3170.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/gcs/3170.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定