zoukankan      html  css  js  c++  java
  • 深入分析lineheight 在浏览器中的特性以及最佳实践

    首先看2个问题:

    1)line-height和font-size 有联系吗,什么联系?

    2)line-height的继承特性有什么特殊性?

    如果你对这2个问题很清楚的话,你可以跳过本文。 

    首先看看w3c的解释:line-height 属性设置行间的距离(行高,行间距)。

    该属性会影响行框的布局。在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最大距离。line-height 与 font-size 的计算值之差(在 CSS 中成为“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。可以包含这些内容的最小框就是行框。原始数字值指定了一个缩放因子,后代元素会继承这个缩放因子而不是计算值。什么是基线(baseline)?在我之前的一篇文章中已经给出了一个地址,如果不太清楚的话,可以去看看。一个重要的特性就是line-height可以被继承。

    浏览器的默认值不一样

    各个浏览器的默认值不一样(在1~1.2),所以我们看到的行高都不一样,也是由于这个原因,一般网站都有reset。

    line-height有5种定义方式

    1)div{line-height:nomal}就是默认的形式,不太推荐这种方式,因为各个浏览器都不一样,会有差异,firefox大概是34px。oprea大概是30px。

    2)div{line-height:inherit}继承的方式,就是继承父级元素的形式,不定义的默认值,也不推荐这种方式。

    3)div{line-height:150%} 百分比的形式,比较的灵活。

    4)div{line-height:20px} 长度的形式,关于常见的一些CSS中的长度单位,后面我将讲述一下。

    5)div{line-height:1.5} 纯数字的方式,我推荐的方式,能适应各种。

    关于继承特性

    1)百分比的继承:继承下来的元素会忽略font-size的大小,都是用同一值。如下图所示:

     

    代码如下:

     1 <!DOCTYPE HTML>
     2 <html >
     3 <head>
     4     <meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
     5     <style type="text/css">
     6         * { margin:0; padding:}
     7         #doc { width:990px; margin:0 auto; margin-top:50px;font:12px/150% arial; }
     8         #doc h4 { border-bottom:1px solid #000;font-size:30px; }
     9         #test{font-size:20px;}
    10         p{font-size:26px}
    11 </style>
    12     <title>line-height的研究</title>
    13 </head>
    14 <body>
    15     <div id="doc">
    16     <h4>line-height的实践</h4>
    17     <div id="test">从目前的形式来看,HTC进军国内行货手机市场绝不是玩票,2011刚开年,就接连不断地推出新机,
    18     并且还都是原生Android 2.2的机器,再加上几款运营商定制机型,可以说产品覆盖率非常的高。</div>
    19     <p>今天,我们再次拿到这款2010下半年炙手可热的HTC“野火”,行货今非昔比</p>
    20     </div>    
    21 </body>

    22 </html> 

    2)长度的继承:长度是一个绝对值,同样的,继承下来的元素会忽略本身的font-size的大小的。这个可以将上面的例子150%换成18px,效果和上面一样。

    3)默认值的继承:这里和前面的方式有点不一样,后面的元素不会忽略font-size的大小,而是基于font-size的大小来计算高度的。我是用firefox3.6测试的,各个元素的font-size的大小不一样,基本上各行文字不再重叠在一起了。后来我用firebug看了下各行的高度,h4是40px,#test是54px(由于是在2行排列的),但是p是35px,我用了chrome10测试了下,h4是40px,#test是46px,p是30px。这2个浏览器就表现不一样了。可见这个方式不是一个好的方式,会带来浏览器的差异。

    4)数字的方式:这是对继承方式的一个加强,后面的元素会根据font-size的大小来计算高度的,系数就是这个数字,可见这个在所有的浏览器中都是一样的,可以将

    上例子中的150%换成1.5试试。

    line-height与行盒(line box)的高度

    首先看看height与line-height吧,如果对同一个div修饰的话,height指的是整个div的高度,而line-height应该指的是div中一行间距(两行文字的baseline之间的距离),要理解这个东西,必须要理解半行间距,先看一个例子:

    <!DOCTYPE HTML>
    <html >
    <head>
        
    <meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
        
    <style type="text/css">
            * 
    { margin:0; padding:}
            #doc 
    { width:990px; margin:0 auto; margin-top:50px;font:12px/1.5 arial;height: }
            #doc h4 
    { border-bottom:1px solid #000;font-size:30px; }
            .test
    {font-size:20px;line-height:30px}
    </style>
        
    <title>line-height的研究</title>
    </head>
    <body>
        
    <div id="doc">
        
    <h4>line-height的实践-半行间距</h4>
        
    <div class="test">研究半行间距的问题abcdefg</div>
        
    </div>    
    </body>

    </html>

    在以.test为class这行文字中。line-height:30px font-size 是20px。其实可以看做文字的高度,那么在文字上到顶部,文字下到底部就是半行间距, 很明显,如果在添加一行文字的话,上一行文字的底部半行间距到下行文字的顶部半行间距加上font-size的大小刚好是line-height的高度,其实也就是2行的baseline的高度。

    这个例子中也很明显的看出了line-height和font-size的区别。

    line-height小于font-size怎么办?

      从上面的例子也可以看出,line box的优先级高,以line box为主。由于line-height是决定line box的一个很重要因素,每一行的文字将根据line-height的取值,决定最后的line box的高度。

    line-height 是特性

    垂直居中,为什么会垂直居中呢?如上面所讲的,两行baseline之间的距离包括上半行间距和下半行间距,这个就组成一个line-height。从整体上来算的话,上和下应该是一样的,试想下如果上下不相等,那该是什么样子的呢?可能可控,可以调节。但是目前没有。从美学的观点来看,今后也不会有,所以上和下半行间距是一样大小的。这就构成了垂直居中。

    利用垂直居中的特性:我们可以做当行文字的居中,多行的文字居中。图片居中等等。。

    标题,段落与行高的关系

    一般的情况下标题用1.2 ,段落至少用1.5(在万维网内容可存取性指南2.0版有叙述) 

    总结

    本文讲述了line-height的定义的5种方式,然后结合line-height的继承特性 ,分析了各种继承特性的问题,最后得出了使用数字来表示的正确和可取性。

    文中比较了line-height和font-size的区别,从半行间距的的分析入手,总结了line-height的垂直居中特性以及基于这个特性的应用例子。同时也分析了font-size大于line-height怎么办的优先级问题。


  • 相关阅读:
    larave5.6 引入自定义函数库时,报错不能重复定义
    laravel获取当前认证用户登录
    淘宝免费ip地址查询导致服务堵死的坑
    this关键字
    Jsp Spring Security 权限管理系统
    spring secrity
    spring bean何时实例化
    Spring Security3 页面 权限标签
    Spring常用注解,自动扫描装配Bean
    java继承时,实例化子类,是否会默认调用父类构造方法
  • 原文地址:https://www.cnblogs.com/yupeng/p/2016634.html
Copyright © 2011-2022 走看看