一个Tahoma字体bug引发的思考—关于样式bug的分析流程

这是一篇分析流文章,不是技术流。

问题:我们经常会碰到很多莫名其妙的样式bug,也许10个浏览器下,9个浏览器是好的。但是就有一个浏览器有问题。很多情况下,ie6/7出bug的几率比较大,当然解决办法也是很多,zIndex,双边距,末尾多一个字,等等都成为了耳熟能详的bug流派了。但是opera,firefox,safari下也会有bug,这个时候要是出了问题该怎么办呢。

一个opera的bug实例
我还是得说,我这里只是提供一个解决问题的流程,具体是什么什么原因导致的,就不做深入研究了。bug如下。
-------



-----
这个结构大家应该很熟悉了,很多情况下就是 ul>li*n 的样子。li往左float了。所有浏览器除了opera都显示正常。但是opera显示了以上效果。
连号走势 和 跨度走势 这两个li 为什么会在右边呢?明明是float左边的,应该是显示在左边啊!


分析流程,排除法
1。假如没有一手的开发代码,那先从线上另存为网页。看错误代码,如果能够有firebug这样的工具,能直接改代码的话就很方便了,但是现在没有。只能一步步来。
2。另写一个网页,做一个纯粹的,ul>li*n结构的页面,放在opera下看效果。发现,纯粹的这个结构下,没有上面的问题。也就是说这个模型没有问题,必然是这个模型里加了一些未知的样式导致的。
3。看源代码中结构是否复杂,如果太复杂的话不好分析,所以去掉一些元素,使其只剩下ul>li*n这样的纯粹结构。删除了其他元素,只剩下ul,li的样式。相同的结构,该清理的东西都清理掉了。发现ul和li上没有重叠的样式。但是还是存在问题。这很让人纳闷。
4。这个时候我就考虑到了2个东西,一个是dtd声明,还有就是引入的公共css中的reset。
5。于是先查看一reset里的css呢,我一下子就想到了字体,而不是font-size或者line-height。因为经验,我曾经就几次因为字体问题出现过这样莫名其妙bug问题。于是修改了一下字体,发现OK了。
6。这个时候已经明白是字体导致的,于是百度一下这个字体,找到了这篇文章http://www.cnblogs.com/radom/archive/2010/07/04/1770979.html,说是中英文高度不一致引起的。
7。再查看一下dtd,为什么我会想到的是dtd声明会出错呢?因为经验,我以前也碰到因为dtd声明错误导致的问题。于是我修改了dtd,发现也OK了。


最后得到结果:

Tahoma这个字体,在中文和数字等混合排版的时候,会导致了中文和数字的line-height不一致,从而导致最终的高度不一致。
从而导致了上面连号走势被挤到除3余数的后面了.
解决办法就很明白了。因为是字体高度引起的。所以
第1个办法:换个高度相同的字体,用宋体就没有问题了。
第2个办法:限定高度。设置height后,也没有问题了。
另外:DTD声明错误一样会出现问题,建议使用最简单同时也是最安全的声明方式<! DOCTYPE HTML>。

这里是从原来页面上摘下来的一个精简后的错误模型代码。可以复制到html中,在opera下看效果。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:esun>
<head>

    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">

    div{
        padding-left: 10px;
        width: 755px;
        float:left;
        font-family: Tahoma;
    }
    span{
        display: block;
        float: left;
        line-height: 25px;
        height: 25px;
        width: 104px;
    }
    
    
    </style>
</head>
<body>

    <div>
        <span><a href="http://trend.com/ssqZst!ssqjbzs.jhtml?flag=jbzs" target="_blank">基本走势</a></span>
        <span><a href="http://trend/ssqZst!ssqdxzs.jhtml" target="_blank">大小走势</a></span>
        <span><a href="http://trend/ssqZst!ssqjozs.jhtml" target="_blank">奇偶分析<s></s></a></span>
        <span><a href="http://trend/ssqZst!ssqzhzs.jhtml" target="_blank">质合分析</a></span>
        <span><a href="http://trend/ssqZst!ssqc3ys.jhtml" target="_blank">除5余数</a></span>
        <span><a href="http://trend/ssqZst!ssqwxzs.jhtml" target="_blank">五行走势</a></span>
        <span><a href="http://trend/ssqZst!ssqhzzs.jhtml" target="_blank">和值走势<s></s></a></span>
        <span><a href="http://trend/ssqZst!ssqlhzs.jhtml" target="_blank">连号走势<s></s></a></span>
        <span><a href="http://trend/ssqZst!ssqkdzs.jhtml" target="_blank">跨度走势</a></span>
    </div>
    
    <div style='margin-top:20px'>
    <pre>
            以上效果是错误的,可以修改3个地方。
            1:可以修改dtd为正确的方式,我不知道这里的dtd为什么会写成这样。其实这样的声明是最简单而且永远不会出错的 < ! DOCTYPE HTML > ,我一直这么使用。
               但是很多人就是喜欢加上一堆的长代码,认为不这样声明会在ie下出错,等等问题。我觉得都是猜测,没有经过实践。
               
            2:修改tahoma字体为等高的如宋体等。
            
            3:设置span的height。
            
    </pre>
    </div>

    
</body>
</html>



总结
碰到bug,不用着急。按照流程一步一步来分析。建模型,找不同之处。最好有总结的习惯,把碰到过的bug都能总结起来,bug再多也是有限的。

原文地址:https://www.cnblogs.com/lunalord/p/2502275.html