bootstrap栅格系统中如何实现垂直居中

html-css09

bootstrap栅格系统中如何实现垂直居中,第1张

不能居中的罪魁祸首是 col-sm-* 的 float: left 样式,因为对于 col-sm-* 而言,只要屏幕宽度不小于 @screen-sm-min 就不会折行,所以可以考虑不使用 float: left 而是用 display: table-cell 来实现对齐,这样就能比较好的解决居中问题了。不过问题是不支持这种 display 的浏览器就会出问题,你可以考虑用 CSS hack 来 fallback,舍弃居中对齐来保持栅格系统正常工作。

HTML:

<div class="row text-center vertical-middle-sm"> <div class="col-sm-4">

<img src="photo.jpg" alt="..." class="img-circle">

</div>

<div class="col-sm-8 text-left">

<p>测试文字</p>

</div></div>

LESS:

@media (min-width: @screen-sm-min) {  .vertical-middle-sm {    display: table

>div {      display: table-cell     height: 100%     min-height: 100%     float: none !important

}

}

}

拓展资料

Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,是一个CSS/HTML框架。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。

‍‍

美国人自己造个框架就是创新,就是开创。中国人自己造个框架就是借鉴,就是抄袭?美国同类型的框架/库不要太多,偏见有点严重。facebook为什么不好好给typescript贡献代码,非得自己弄个弱化版的flow-typed出来。lodash为什么不好好给underscore贡献代码,非得自己再写一个,居然还兼容underscore。jquery为什么不好好给prototype贡献代码,非得自己写一个,居然还全局对象互相冲突。任何著名的开源项目除非大公司内部已经用了多,都是从不完善的小项目一点点成长起来的。可能在前沿领域中国不输美国,但在程序的原始积累上的确是差很多的。开源本身就是互相借鉴修修补补的过程,你有自己的想法就去开发一套新的出来,很正常。但是开发一套新的并不意味着所有都得是新的部分很成熟的技术可以直接拿来用,只改你想修改的部分。比如我觉得bootstrap的栅格系统很好,css组织也不错,但是它的外观我不喜欢。我也不可能让他们团队为了我去改外观。那我就fork一个bootstrap,保留原来的代码组织,就改改css样式。可以吗,当然可以啊。这算抄袭,还是借鉴还是不好好给bootstrap贡献代码。正因为这样开源社区才会百发齐放,对使用者来说才能找到更适合自己的。开源是有开源协议的,只要在协议的许可范围内,想干什么是使用者的自由。最后,开源社区不分国界,不分你的我的。非得去区分哪国怎么怎么样不如自己多去贡献点代码。

‍‍

关键词:隐式轨道 / 隐式网格 / 自动布局算法

隐式网格是指当网格项目确认在显式网格之外时所创建的网格,简单来说,当没有足够空间或显式网格轨道来分配网格项目时,此时剩下网格会自动创建隐式网格。

当设置网格容器的网格模板 grid-template 属性并指定固定数量轨道时创建出来的就是典型的显式网格,而在实际的HTML中存在网格项目多余既定数量,此时这些多余的网格是之前未声明定义的,因此网格容器会通过添加隐式网格线来生成网格轨道,在将这些多余的网格分配到其中,这些多余的就是所谓“隐式网格”。

隐式网格轨道的尺寸由 grid-auto-rows 和 grid-auto-columns 属性来确定,使用 grid-auto-flow 属性来控制隐式网格自身主动定位(auto-placement),这三个属性都需要在网格容器上设置。

如何产生隐式网格呢?

例如:定义一个网格容器,网格间距为1px,默认存放两列等宽网格项目,创建具有隐式网格的布局。

问题是虽然在网格容器中设置了2列等宽的位置用来容器网格项目,也就是说只定义了1行轨道,但实际上网格容器中具有4个网格项目,问题来了,第3和第4个网格容器是如何处理的呢?

第3和第4会自动创建下一个轨道,即隐藏网格。创建出来的隐式网格的方向若没有设置则默认为 row 即 grid-auto-flow:row 。

这里我们首先将这4个网格分成两种类型显式网格和隐式网格,其中可以发现第1和第2个为显式网格,第3和第4网格为隐式网格。换句话说第1行为显式行轨道,第2行为隐式行轨道。

grid-auto-flow 属性用来设置自动布局算法,用于精确指定在网格中被自动布局的网格项是如何排列的,也就是说指定自动放置的网格项是如何流入网格中的,因此也被称之为“网格自动流”。

稠密堆积算法 VS 稀疏算法

dense 使用稠密堆积算法,若【后面】出现小元素则算法会尝试填充网格中【前面】留下的空白,如此这样会填补上稍大元素所留下的空白,但同时可能导致原有出现次序被打乱。

若省略 dense 则会使用稀疏算法,即在网格中布局元素时,布局算法只会向前移动,永远不会倒回来去填补空白,这样做以保证所有自动布局元素是[按照次序]出现的,即使可能会留下被后面元素填充的空白。

例如:改变隐式网格默认方向 row 为 column ,此时隐式网格行高 grid-auto-rows 将会失效。

网格容器的 grid-auto-rows 属性可以用来定义隐式网格中行轨道的大小

这里 grid-template-rows:70px 设置的是显式轨道的行高, grid-auto-rows:140px 则设置的是隐式轨道的行高。

设置隐式网格列宽,首先需使用 grid-auto-flow:column 自动创建隐式网格流方向为列,然后在使用 grid-auto-columns:1fr 设置隐式网格的列宽,这里使用 1fr 做等分处理。

例如:排序与布局

第1个网格项横跨左2格,后4格按 grid-auto-flow:column 的流向排列。