• (6.1)分栏布局


    6.1 分栏布局

      分栏布局也被称为多列布局、多栏布局,这种布局可以将内容布局到多个列框中,类似报纸上的排版。

      分栏布局比较特殊,有别于传统布局,它将子元素在内的所有内容拆分为列,这与打印网页的时候将网页内容分成多个页面的方式类似。分栏布局主要针对图文排版布局,应用在横向排版场景中,文档流是倒N方向。有个别布局只能使用分栏布局实现,分栏布局虽然在日常开发中用得不多,但是遇到合适的场景时是一种非常有用的布局方式。

      IE10+浏览器都可以使用分栏布局,API稳定,在移动端的兼容性比弹性布局要好,可以放心使用。例如,有一段无序列表,可以看到每一个列表项的内容很少,如果容器的宽度足够,则可以使用columns属性实现分栏布局,让排版更舒服。

    HTML

    <ul> 
        <li>重庆市</li>
        <li>哈尔滨市</li>
        <li>长春市</li>
        <li>兰州市</li>
        <li>北京市</li>
        <li>杭州市</li>
        <li>长沙市</li>
        <li>沈阳市</li>
        <li>成都市</li>
        <li>合肥市</li>
        <li>天津市</li>
        <li>西安市</li>
    </ul>
    

    CSS

    ul {
        columns: 2;
    }
    

    相比其他布局方法,分栏布局最大的优点是不会改变元素原本的display计算值。例如,在默认状态下,<li>元素会出现项目符号,如圆点或数字序号。此时,如果对<li>元素使用弹性布局或网格布局,则项目符号就会消失,因为display:flexdisplay:grid会重置<li>元素内置的display:list-item声明。

    与分栏布局相关的CSS属性共有以下10个:

    ● columns;(重点)
    
    ● column-width;
    
    ● column-count;
    
    ● column-rule;
    
    ● column-rule-color;
    
    ● column-rule-style;
    
    ● column-rule-width;
    
    ● column-span;
    
    ● column-fill;
    
    ● column-gap;(关注)
    

    虽然这10个CSS属性都有各自的作用,但是在实用程度上却有明显的差异。根据我的开发经验,超过80%的分栏布局只需要使用columns属性就足够,因此,大家的学习重心可以放在columns属性上,column-gap属性有时候也会用到,所以也可以关注下,至于剩下的属性,大家了解一下基本作用即可。

    6.1.1 重点关注columns属性

    columns属性是column-widthcolumn-count属性的缩写,举几个使用columns属性的例子:

    /*栏目宽度*/
    columns: 18em;
    
    /*栏目数目*/
    columns: auto;
    columns: 2;
    
    /*同时定义宽度和数目,顺序任意*/
    columns: 2 auto;
    columns: auto 2;
    columns: auto 12em;
    columns: auto auto;
    
    

    因此,关注columns属性本质上就是关注column-width和column-count这两个CSS属性。

    1.关于column-width

    column-width 表示每一栏/列的最佳宽度,注意,是“最佳宽度”,实际渲染宽度多半和指定的宽度是有出入的。

    最佳宽度

    几乎不存在分栏布局的栏目宽度就是 column-width 设置的宽度这样的场景。

    因为column-width和传统的width属性不同,column-width 更像是一个期望尺寸,浏览器会根据这个期望尺寸确定分栏数目,一旦分栏数目确定了,column-width属性的使命也就完成了,接下来根据分栏数目对容器进行的分栏布局就和column-width属性没有任何关系了。

    没错,column-width属性在分栏布局中就是一个工具属性。

    不支持百分比。

    column-30%; /*不合法*/
    

    2.关于column-count

      column-count表示理想的分栏数目,又出现了很微妙的词——“理想的”,也就是意味着最终的分栏数目可能不受column-count属性值的控制。

     在分栏布局中,最终分栏的数量要么由column-count属性决定,要么由column-width属性决定,这两个CSS属性都可能有更高的决定权。

      决定权优先级的计算诀窍可以用一句话概括:统一转换column-count值,哪个值小就使用哪一个。例如,下面的CSS代码:

    具体解析过程如下。

    (1).container-1元素宽度为360px,因此column-100px换算成column-count的值是3.6,而.container-1元素已经设定了column-count:2,遵循“哪个值小哪个优先级高”的规则,最终.container-1元素的内容分成了2栏。

    (2).container-2元素设置的是column-count:4,比column-100px换算成的column-count值大,因此,最终.container-2元素的内容分成了3栏(3.6栏向下取整)。

    另外,从.container-2的效果可以看出,分栏布局的每一栏的高度并不总是相等的,内容的分割也不总是均匀的,浏览器有一套自己的算法。

    6.1.2 column-gap 和 gap 属性的关系(直接用gap)

    column-gap 属性表示每一栏之间的空白间隙的大小,可以是长度值,也可以是百分比值,语法示意如下:

    /*关键字属性值*/
    column-gap: normal;
    
    /*长度值*/
    column-gap: 3px;
    column-gap: 3em;
    
    /*百分比值*/
    column-gap: 3%;
    
    

    实际上,在分栏布局中,如果不考虑IE浏览器,我们可以直接使用gap属性设置分栏间隙大小,例如:

    .container
    {
    	columns: 2;
    	gap: 1rem;
    }
    

    至于原因,用一句话解释就是:column-gap 是 gap 属性的子属性。

    gap属性进行了统一

    在网格布局规范制定之后的一段时间,CSS世界中的行与列之间的间隙使用了gap属性进行了统一,也就是分栏布局、弹性布局和网格布局的间隙都全部统一使用gap属性表示,而gap属性实际上是column-gap属性和row-gap属性的缩写。

    6.1.3 了解 column-rule、column-span 和 column-fill 属性

    高级属性。

    1.column-rule 属性

    column-rule 属性是 column-rule-widthcolumn-rule-stylecolumn-rule-color 这3个CSS属性的缩写,正如border是border-style、border-width和border- color的缩写一样。

    .container {
     320px;
    border: solid deepskyblue;padding: 10px;
    column-count: 2;
    
    /*和border规则一样*/
    column-rule: dashed deepskyblue; 
    }
    

    2.column-span 属性

    column-span 属性有点类似表格布局中的HTML属性 colspan,表示某一个内容是否跨多栏显示。这个CSS属性是作用在分栏布局的子元素上的。

    column-span: none; /* 默认值 */
    column-span: all;
    
    • none表示不横跨多栏,默认值。

    • all表示横跨所有垂直列。

    例子:设置了column-span:all的“第4段”文字所在的<p>元素几乎贯穿了整个容器元素

    3.column-fill 属性

    column-fill 的作用是当内容分栏的时候平衡每一栏填充的内容。

    • balance是默认值。
    • auto属性值在Firefox中渲染正确,Chrome中需要固定高度才有效。
    • balance-all 没有浏览器支持。
    column-fill: auto;
    column-fill: balance; /* 默认值 */
    column-fill: balance-all;/* 没有浏览器支持 */
    
    

    6.1.4 分栏布局实现两端对齐布局

    分栏布局非常适合实现单行的两端对齐布局效果

    不需要改变元素的display属性,也不需要定位,只需要设置好column-count属性的值,然后使用column-gap属性设置想要的间隙就好了

    demo: https://demo.cssworld.cn/new/6/1-6.php

    6.1.5 break-inside 属性与元素断点位置的控制

    break-inside属性可以定义页面打印、分栏布局发生中断时元素的表现形式。如果没有发生中断,则忽略该属性

    break-inside: auto;
    break-inside: avoid; /* 表示元素不能中断 */
    

    demo: https://demo.cssworld.cn/new/6/1-7.php

    6.1.6 box-decoration-break 属性与元素断点装饰的控制

    chrome 兼容性差。

  • 相关阅读:
    Java中内部类中使用外面变量为什么final修饰?
    Java正则表达式
    Java内部类复习
    MyEclipse建立SpringMVC入门HelloWorld项目
    java中的System类
    java 中的Scanner
    Freemarker判断是否为空
    HQL多种查询实现
    查询功能实现
    EF生成 类型“System.Data.Entity.DbContext”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/tangge/p/15885034.html
Copyright © 2020-2023  润新知