分类“你问我答”的存档

共 9 页: [1] 2 3 4 5 6 » ... 末页 | 下一页»

你问我答(38)—— 问答精选集

2009年07月03日 星期五

我在过去时常会根据一些读者和网友的问题,做出一些回答。有时也会根据我自己遇到的问题,写一些相关的文章。今天把一些经常常被问到的问题,做一个分类整理,这样既可以便于初学者了解,同时也方便我回答一些常遇到问题,可以直接把文章发给提问者,总之希望提高效率,对大家有所帮助。

1:关于学习目标、学习方法、学习态度等通用的问题

《关于Web设计、制作、开发工作》:“Web”相关的工作实际上包含的内容非常广泛,此文主要针对这些工作进行具体的分类,进行一些介绍,帮助读者找到自己的定位,和学习的方向。

《学习开发的三个层次》:本则是针对Web“开发”的学习给出的一些建议,供打算作程序员的朋友参考。

《每天被问得最多的一个问题》 :此文主要是针对“非常初学”的初学者,学习一些基本的技术和软件操作时,做出的一个简单的难度估计。

《上大学,学什么?》:此文主要针对学习“基础理论”和“实用技术”二者之间的关系,做出一些分析,帮助读者理清学习思路。

《自学是艰苦的》:此文主要针对学习方法的一些建议,同时对自己的学习能力的评估做出一些分析。

《工作职责兼谈工资水平(上)》《工作职责兼谈工资水平(下)》 : 这两篇文章主要谈了谈Web前端的工作职责,至于里面说到的工资水平,是我“闭门造车”想出来的,不一定和实际相符,但就我个人实际做一些项目的了解,现在普遍的情况是:略知皮毛的人非常多,真正做的好的人却相当不多,所以工资到底多少合适,就看你的真正的真功夫了,是“非常多”里面的?还是“相当少”里面的?

《虚竹的人生启示》:本文是针对《上大学,学什么?》一文的读者交流的一个后续文章,对学习“基础理论”和“实用技术”二者之间的关系,也就是“内功”和“招式”之间的关系的一个补充说明。

2:关于CSS在不同浏览器中的兼容性问题

《关于CSS在不同浏览器的调试经验》:本文介绍了两个调试CSS网页的最基本的原则。

《CSS调试技巧五则,兼谈“提问的艺术”》:本文介绍了五个调试CSS网页的技巧,同时对如何在互联网上需求帮助给出了一点建议。

《再谈浏览器的兼容性》:很对初学者听说了CSS的”Hack”这个词以后,都非常向往,其实它并不是解决问题的真正的良药。所以上面两篇文章都没有提及Hack的方法,而这篇文章则给出了一点通用性很强的Hack技巧,在你实在没有办法的时候可以考虑使用,但是尽量不用。

《CSS调试工具推荐 —— IE Tester》:IE的不同版本之间的差异是令设计师最为头疼的事情,本文介绍了一个方便的小工具,可以便于你在一台机器上同时用多种IE浏览器测试你制作的网页。

3:CSS学习中其他通用的问题

《选择CSS参考书的建议》:本文针对我们出版的几本CSS图书,进行一些说明,解释了我们在写作中的一些想法和构思,便于希望跟随图书学习的朋友选择。

《CSS滑动门技术的简单应用》: “滑动门”这个词是被很多人误用的,本文使用一个简单的例子,说明了CSS中“滑动门”的含义。

《行内元素与块级元素》 : 行内元素与块级元素是CSS中两个非常核心的概念,非常重要,本文作一简要说明。

CSS英文小字典 :对于很多人来说,学习CSS的一个很大的困难,不是因为CSS难以理解,而是因为CSS中的英文单词太多。这里我总结了一个“CSS英语小字典”,pdf格式,读者可以下载,一共有160个单词,如果您对英语实在不灵光,可以花几天时间,集中背一次。

4:关于基于CSS的建站完整流程

《你问我答(22)——遵循Web标准的网页设计工作流程》,此系列完整地介绍了一个网站的设计、制作全过程,共分5个部分:第一部分 第二部分第三部分 第四部分第五部分

你问我答(37)——jQeury实现回车键代替Tab键

2009年06月22日 星期一

昨天和青色同学聊了几句,说到一个具体的技术问题,我觉得可能有一些普遍性,这里详细说一说。

问题要求

问题是这样的实际的情境:对于一个网页上的表单,放置了一个提交按钮以后,用户如果按了键盘的回车键,默认情况下,就会提交这个表单了。这样对于用户输入各个表单项目,会很不方便,输入完一个项目,或者用鼠标选择下一个项目,或者用键盘的Tab键选中下一个项目。

现在希望实现的要求是:

1:如果当前处于焦点(也就是用户正在输入的那个文本框)不是最后一个输入框,那么按回车键时,将焦点转移到下一个输入框;

2:如果当前处于焦点(也就是用户正在输入的那个文本框)是最后一个输入框,那么按回车键时,将请用户确认后提交表单;

基本思路

这个问题使用jQeury实现是很方便,这里面主要有两个问题需要解决,

1:判断按键是否是回车建, 这个比较好办,用jQeury中的 keypress 事件,就可以获取到当前按的键的值了,回车键的值是13,比较一下即可。

2:判断当前处于焦点的输入框是不是最后一个输入框。

点击这里查看最终效果参考

说明:如果对Javascript和jQeury完全不了解的读者,最好先学习一下相关的基本知识:http://learning.artech.cn/20080621.mastering-javascript-jquery.html 。我们这里就不解释最基本的概念了。

实现方法

下面是具体的代码,首先是非常简单的HTML代码,可以看到,一个form元素,里面有三个输入框,和一个提交按钮,输入框分别设置了id属性。

1
2
3
4
5
6
7
8
9
<form id="myform">
 
<label>first name : </label><input type="text" id="firstName" name="firstName" />
<label>last name : </label><input type="text" id="laseName" name="laseName" />
<label>addess : </label><input type="text" id="address" name="address" />
 
<input type="submit" value="submit" />
 
</form>

接下来是Javascript代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        $(function()
        {
            $("#myform input:text").keypress(function(e)
            {
                if (e.which == 13)                         //判断所按是否回车键
                {
                    var inputs = $("#myform").find(":text");                   //获取表单中的所有输入框
                    var idx = inputs.index(this);      //获取当前焦点输入框所处的位置
 
                    if (idx == inputs.length - 1)     // 判断是否是最后一个输入框
                    {
                        if (confirm("最后一个输入框已经输入,是否提交?"))   //用户确认
                            $("#myform").submit();    //提交表单
                    }
                    else
                    {
                        inputs[idx + 1].focus();       //设置焦点
                        inputs[idx + 1].select();       //选中文字
                    }
 
                    return false;//取消默认的提交行为
                }
            });
        });

下面具体解释上述代码。

说明:如果对Javascript和jQeury完全不了解的读者,最好先学习一下相关的基本知识:http://learning.artech.cn/20080621.mastering-javascript-jquery.html 。我们这里就不解释最基本的概念了。

第1行:说明一下代码在页面完全装入浏览器以后执行。
第3行:对表单中的输入框设置keypress事件,注意参数中函数带有一个参数,将通过它获取当前按键的数值。
第5行:判断是否是回车键,如果不是,则不作任何处理,如果是怎进入下面的代码。
第7行:获取表单中的所有输入框,以便判断当前的输入框是否是最后一个。
第8行:获取当前输入框在扁担的多有输入框中处于第几个。
第10行:判断是否是最后一个输入框。
第12-13行:如果是最后一个,那么显示一个确认框,如果用户确认,则提交表单
第17-18行:如果不是最后一个,那么将下一个输入框设置为焦点,并将其中的文字选中
第21行:取消默认的提交表单操作。

问题小结

1:可以看出,jQeury对我们写前段程序,确实非常方便,可以说jQeury的出现,改变了我们写Javascript程序的方式,就像C语言的出现,我们不再用汇编那样一个字节一个字节计算内存。

2:从效率角度,第7行代码,可以放到第3行的前面,这样,就不用每次都搜索一次DOM元素,不过实际体验不出速度的变化。

你问我答(36)——带有纹理的渐变背景处理方法

2009年04月23日 星期四

每天收到不少问题,遇到有代表性的我就多花些时间,给出一个比较详细的回答,希望这样可以帮助更多有类似问题的读者。

问题描述

null

前几天有一位读者在我们的论坛上发了一个帖子,希望制作这样的一个网页菜单,需要使用CSS来实现。它给出了一个图示:

图中给出了他的切片思路,他的问题是:“自适应高度的 , 上下的1和3两个部分用 img src, 中间部位“2”, 不知道怎样设置渐变色背景了,哪位大侠能给讲解一下呢, 谢谢了。”

问题原因

从他的配图,以及他的文字描述,可以看出,“表格布局”方式已经深深刻进这位读者的脑子里了,使用CSS的时候最重要的一点就是要忘掉表格布局的思路。所以从这个意义上说,有些从零开始的读者学起来反而容易一些。就像一个成年人学外语很难,而小孩则容易得多,因为母语已经深深刻在我们的脑子里面了。英语老师常说的一句话是:“Think in English”。

CSS布局的一个最重要的原则就是,一切以内容为出发点,这个例子显然是一个很典型的列表菜单,那么它的HTML就是一个 ul 列表。我们要做的就是如何让这个ul列表具有设计图中的背景。千万不要上来就把这个图用两刀坎成三块,然后在打算用HTML和CSS拼到一起,这个思路从根本上来说,就是典型的“表格布局后遗症”~~~~。这就等于我们在说:“I’ll give you some color see see ”。

基本方案

那么正确的CSS思路又是如何的呢?我们做任何事情都要有一些基本的思考方法,比如从“简单到复杂”、“从特殊到一般”等等,其实你上中学的时候。这些方法都是渗透在各门课程中的,现在想一想,都会觉得很有收获。

比如具体到这个问题,首先考虑,如果没有渐变色,我们应该怎么办?这里因为我没有原图,就自己绘制了一个简单的,但是道理和原图是完全一样的。第一步,先从最简单的开始起步,如下面图中的左图所示,这里不存在渐变地情况。

下面要解决的就是一个高度自适应的问题了,那么用CSS解决自适应高度或宽度的问题,很显然要用到“滑动门”技术了。要做滑动门就要要准备好两扇“门”了,很简单,如下图中,右边的两个图所示。他们就是左边的图切片得到的,一个去掉顶部,一个去掉底部,这样当它们叠在一起,根据内容高度上下错动时,就可以产生自适应高度的背景框了。

demo-bg.png

top.gif

bottom.gif

接下来,编写HTML:

1
2
3
4
5
6
7
8
9
10
<div id="outer">
    <div id="inner">
        <ul>
            <li>Artech</li>
            <li>Web Dev</li>
            <li>Web disign</li>
            此处省略若干菜单项……
        </ul>
    </div>
</div>

这里就是把ul列表的外面套了两层div,各自作为滑动门的一扇门。如果有人要较真,非要只套一层div,而把ul作为另一扇门,也是可以的,不过这里为了简单明了,用两层div。

下面设置CSS样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    #outer  {
        width:186px;
        background:url(images/bottom.png) no-repeat bottom;
        padding:0 0 35px 0;
    }
 
    #inner  {
        padding:35px 0 0 0 ;
        margin:0;
        background:url(images/top.png) no-repeat ;
    }
 
    ul {
        margin:0 20px}

解释一下代码:

demo-effect-1.png

1:外层div设置一个固定宽度,就是背景图像的宽度,然后设定背景图像,注意最后一个“bottom”,表示从这个盒子的最底端开始放置背景图像。

2:内层div使用另一个背景图像,默认情况下就是从顶端放置背景图像,在内外层盒子重叠的部分,内层的盒子会压住外层的盒子。

3:下面注意,两层盒子的padding设置,外层盒子设置下部的padding为35像素,内层盒子设置上部的padding为35像素,这样就把上下装饰图像部分都让出来,而不会遮挡住他们的了。

4:最后,把最里面的ul列表位置调整一下,就完成了。

效果如右图所示,其高度可以根据ul的高度自适应。当然如果如果太高了,以致于内外两层div的背景图像无法重叠了,就会产生裂缝了,那么一种方法是把背景图像做的高一些即可,另一种方法是外面再再多套一层div,设置一个竖直方向平铺的背景,用它来填补中间的缝隙。

渐变背景

demo-effect-2.png

下面考虑背景渐变的情况,例如上面部分(#inner)的背景图像变成右图所示的样子,而下面(#outer)部分的背景图不需要变化,可以发现,代码不需要做任何修改,结果仍然是正确的。

但是要注意的一点是,在这种情况下,这时列表的内容就不能太短了,如果过短的话,渐变还没有完成就直接到了下侧的颜色,如下图所示,接缝处就会不自然了。

demo-effect-5.png

增加纹理

demo-effect-3.png

这位读者的问题中给出的图还不仅仅是渐变的问题,而且增加了纹理,这就有点麻烦了。如果仍使用上面方法则是的缺陷的,如果纹理很细小,不太明显的话,上面的方法还可以凑合了,而如果纹理比较大,就会比较明显。

在这里为了突出这个问题,我特意做了一个很大的纹理效果,如右图所示。可以发现,在接缝处(红色框里)就很不自然了,上下两层背景图的圆形纹理无法正好对上。按照上面的方法,这个接缝无法避免的,因为高度会自适应,所以无法确定到底它们会在什么位置接缝。

那么是否有更好的办法呢?要实现即有渐变色,又有纹理的背景能够自然衔接,就必须要用到半透明的背景图了,这种半透明学名叫作“alpha透明”。我们知道,GIF格式的图像是不支持alpha透明的,也就是说,GIF图像中的各个像素,要么就彻底不透明,要么就彻地透明,而无法控制透明的程度。但是PNG格式的图像就支持alpha透明,可以控制各个像素的透明度,比如某个像素是30%透

transparent-bg.png

因此我们就来考虑一下,如何使用这个特性来实现具有自然过渡的纹理背景。很显然,我们必须要把“渐变色”和“纹理”这两件事分配到两个图像中,并使渐变色地图像使用alpha透明,这样就可以自然过渡了。具体来说,上面的div#inner的背景图像仅负责渐变色和alpha透明,下面的div#outer负责纹理图案。

因此,首先解决 div#inner 的背景图像,把设计图改成左图所示的样子,灰白小方格交替的部分代表透明背景,在Phostoshop和Fireforks中,都是这样的。上侧的切片图像,取红色虚线以上部分。

注意,在导出的时候,在Fireworks中要选择PNG格式,要注意一点,PNG格式有 8位、24位和32位三种,由于这个图像中存在渐变色,8位格式产生的效果太差,无法使用,此外,24位的无法产生alpha透明,因此,这里选择32位的PNG格式导出(32位:24位=4字节:3字节,多出来的一个字节就是就是记录透明度的)。

demo-effect-4.png

接下来,div#outer的背景简单一些了,把渐变层去掉,只保留纹理层,也不需要透明,直接到处即可。

这样,代码不需要调整,产生的效果就很完美了,在IE7、IE8和Firefox中,都可以如图所示显示。

CSS 设计彻底研究

由于 IE 6 尽管支持PNG格式的图像,但是不支持PNG的Alpha属性,因此上面的页面在IE6中,不能正确先显示。要在IE6种也可以正常显示,需要借助于IE6 的 AlphaImageLoader滤镜,也同样可实现,这篇文章已经太长了,这里就不再详细介绍这个细节了,读者可以参考《CSS设计彻底研究》的129页“柔边阴影”效果在IE6中的实现方法。但是要注意,我自己实验的结果是 AlphaImageLoader滤镜只对32位PNG图支持alpha透明,8位的PNG不行。

再给大家一个把alpha透明使用得登峰造极的例子:《你问我答(21)——破解Kai Laborenz的神秘海底世界》,这个例子是一个德国人做的CSS禅意花园的例子,太酷了。

如果你对“CSS滑动门技术”还比较陌生:

1:看一下这篇文章,你问我答(11)——CSS滑动门技术的简单应用

2:滑动门技术非常有用,《CSS设计彻底研究》书里面在很多案例中用到了滑动门技术,表面上看起来完全不同的案例,实际上具有相同的技术本质,很有趣,有兴趣的读者可以看一看。

最后给出这个例子的源文件,感兴趣的读者可以点击这里下载

思考题

1:使用CSS布局,最核心的思想是什么?

2:你能否列举出一些你使用过的CSS滑动门技术的应用案例?

3:你是否能举出一些例子,说明“表面上看起来完全不同,本质上却是相同的”这个道理。

===============================================

[补充说明]

这篇文章贴出来一天之后,我发现我的解决方案还是有些问题的,虽然这个方法可以解决文中所说的读者问题中给出的图的要求,但是我给出的最后一个结果图,实际上和中间我画了一个红色方框的那个图相比,二者并不完全等价。区别在于,前者是在一个渐变色的基础上增加了纹理,后者在固定色上增加纹理后,又覆盖了一层渐变色,这两个效果是不一样的。因此用这种方法能够实现的效果,对设计效果时的操作步骤和顺序是有一定要求的,符合后者操作顺序的才能够拆到两个图像中,再叠加产生最终的效果。文章顶端的那个黑色图,是可以用这种方法做到的,因为渐变色是整个压在纹理上面的,而不是纹理压着渐变色。

你问我答(35)——破解缝隙之谜(续)

2009年03月27日 星期五

今天上午回答了一位读者的问题,有几位朋友在留言中给出了一些评论,其中 蓝月 网友给出了一个解决方法,使我想到了以前遇到的另一个问题,因此这里再补充,并更深入地扩展说明一下。

如果没有看过上一篇文章的读者,可以先看一下:你问我答(34)——破解缝隙之谜

蓝月指出,如果在div标记和img标记的尖括号都连起来写,不加空格,就不会出现这个缝隙了。例如这样写(请注意img标记的尖括号的位置):

1
2
3
        <div style="border:1px solid #FF0000;">
              <img src="pic.jpg" 
         ></div>

这里比较一下上面的写法和下面的写法有什么区别呢?

1
2
3
       <div style="border:1px solid #FF0000;">
             <img src="images/logo1.jpg">
       </div>

上面两种写法,再Firefox和IE 8中,是完全一样的,而在IE6和IE7种,却有所不同。

浏览器在解析HTML的时候,除了标记节点之外,还会根据需要生成文本节点。例如昨天的文章中,在图像的后面加了几个字母以后,就产生了一个文本节点,在没有字母的时候,本来是不应该产生文本节点的,但是IE在解析上面一种写法的代码时,会把标记之间的空格解释为文本节点,从而根据默认的规则,图像的底边和就会和文本的基线对齐,而产生了这样一条缝隙。

而当本来完全一样的代码,写成上面的第一种写法时,由于标记之间(尖括号之间)不加空格,因此IE6、IE7也不会解析出文本节点,从而也就不会产生这个缝隙了。这就解释了蓝月的方法为什么可以解决这个问题。

由此我又想到了另一个多次遇到过的针对IE6的问题,本质和这个问题是完全一样的,因此这里也介绍给大家。如下图所示的是一个很常用的效果,CSS的目的是将列表项目中的a元素改为块级元素,从而使得响应鼠标的范围扩展到li的矩形范围,而不仅仅是链接文字。

ie-li-preview.png

代码很简单,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<style>
    li a {
        display:block;
        background:#CCC;
        border-bottom:1px #000 solid;
        text-decoration:none;
    }
    li a:hover {
        background:#BBB;
    }
</style>
 
<body>
    <ul>
         <li><a href="#">First Item</a></li>
         <li><a href="#">Second Item</a></li>
         <li><a href="#">Third One!</a></li>
    </ul>
</body>

事实上,以上代码在IE7、IE8、Firefox这些浏览器中都没有问题,但是在IE6中,效果将如下图所示:

ff-li-preview.png

在各个li之间为什么会产生这个缝隙呢?其实原理和上面谈到的原意是一样的,IE 6 在某些时候,会把标记尖括号之间的空格解释位文本节点,因此,解决方法就是把HTML代码的换一种写法:

1
2
3
4
5
    <ul>
         <li><a href="#">First Item</a></li
         ><li><a href="#">Second Item</a></li
         ><li><a href="#">Third One!</a></li>
    </ul>

可以看到,我们仅仅把

分在两行里写,以保证消除标记之间的空格,在IE 6中效果就立即正常了,如下图所示。

fixed-li-preview.png

需要说明的是,通过这种HTML格式的方式解决这个问题,未必是看起来最舒服的一种,当然通过CSS来解决也是可以的。不过这种方式的最大优点就是快捷和直接,立竿见影,哪里多出了文本节点,就直接在HTML中消灭掉他。如果用CSS来解决则需要具体问题具体分析,会稍微麻烦一些,当然也是完全可行的。

你问我答(34)——破解缝隙之谜

2009年03月27日 星期五

今天收到一位读者的问题,比较有趣,这里介绍给其他读者分享。首先这位读者在前几天的留言中问了这样一个问题:

“您好! 请问,将图片放于Div标签中时,底部与右部都会出现间隙,请问如何去除?”

这个问题问得很笼统,我也很难具体帮助他,因此只能给出一些指导性的原则,因此我这样回答了他:

“这个需要具体调试,看一看这个间隙到底什么原因造成的。关于调试,可以参考一下这篇文章:

http://learning.artech.cn/20080129.css-debug-skills.html

我猜想,这位朋友很认真地看了这篇文章,做出了努力,然后给我回信如下:

“感谢您的回复,经过您的指点,发现了问题的所在,但是问题依然没有解决。询问几个老师,都无法解决(已经ff,及ie测试)。闻前沿工作室的老师对此造诣颇深,烦请赐教!!!现附代码及效果图如下:”

代码:

1
2
3
4
5
<body>
        <div style="border:1px solid #FF0000;">
              <img src="images/logo1.jpg">
        </div>
</body>

效果:

ie-css-bug

可以明显地看到图片和下边框之间出现了一条缝隙。而右侧的缝隙我想这位读者不应该有什么疑问,因为div是个块级元素,自然会有右伸展到右端,我觉得这个不是读者要问的问题。而这个关键的问题是底下的这条缝隙到底是怎么产生的呢?以及如何去掉这个缝隙呢?

下面我来解答一下这个问题。

首先要说说的是,这位读者是一个很善于学习的读者,从第一次提的问题,到第二次提的问题,可以发现,第一次的问题,别人很难了解他遇到的到底是什么问题,而第二次的问题,他做了三件事:

1:简化代码,暴露问题,得到了一段出现问题的最简代码,2:给出了这段非常简单的代码,3:给出了问题的效果图。

这样我们就可以一眼知道问题是什么了。这样对于提问者来说,就非常容易得到别人的帮助,比如你到某个论坛去发帖寻求帮助,如果做到了上面这三点,别人就很容易能帮上你,而如果仅仅是一句话的描述,或者是把非常大的一段代码贴上去,别人就很难帮上你了。具体“提问的艺术”请参考:http://talking.artech.cn/thread-178-1-1.html

下面具体说一说这个缝隙到底是怎么来的。

第一步:摸底

假设现在我们遇到这个现象,不知道是什么原因,首先用各种浏览器都看一看,分别效果如何。也就是先摸摸底。当我们使用 Firefox 、IE 6 、IE 7 、IE 8 观察以后,可以发现,这个缝隙在IE 6和IE 7中都是存在的,而在Firefox和IE 8中去不存在,看来IE 8还是不错的。

ie-8-preview

btw,关于如何方便地使用多种IE浏览器查看一个网页,可以参见:《CSS调试工具推荐 —— IE Tester》

这里有一个经验之谈,如果在IE6和IE7中的效果不一样,而IE7和Firefox中效果相同,通常是IE6的bug,而如果IE6和IE7中的相同,而与Firefox不同,通常是他们对CSS标准的解释不同。

OK,读到这里,如果您以前没有遇到过这个问题,不妨先停下来,自己试试看,能不能快速地找到这个缝隙的产生原因。如果5分钟内搞定,可以认为自己的CSS基础知识过关啦~~~

第二步:尝试

此前我也没有遇到过这个问题,所以这里就要来点头脑风暴了,就像初中证明平面几何题,有时候是要靠点运气和灵感的。就好像在证明几何题中添加“辅助线”往往是最关键的一步,这里我们可以试试看在图片后面加几个字母,就相当于添加一条辅助线,看看效果如何。

add-some-text

看了上图,这下子就有线索了,请读者仔细看一下,一共六个字母,左右各三个,你发现各自的特点了吗?——右边的三个的下端都带有一个“钩”,而左边的三个没有。到这里我们已经明显地感觉到问题很可能和它旁边的文字有关,因为这个缝隙的高度和这个“钩”的高度很一致。辅助线起作用了!

第三步:联想

我们这时联想一下文字和图像相关的内容,自然可以联想到“图片与文字的对齐方式”这个问题了,如果读者手边有“HTML+CSS网页设计与布局从入门到精通”这本书,翻到150页,第11.5节“图片与文字的对齐方式”,第2小节:“纵向对齐方式”,那么就一切真相大白了。这一小节讲的是:图像与它旁边文本之间的纵向对向方式由 vertical-align 属性控制,默认值为 baseline 方式,即“基线”对齐。

什么是基线呢?就是上面图中abc这三个字母的底端所在的水平线,英文26个字母,绝大部分都是没有“钩”的,他们的下端都是对齐于基线的,而默认下情况,图像与它旁边的文字也是基线对齐的,也就是说,你可以把这幅图像想象成一个字母,那么这个缝隙就存在了

而在Firefox和IE 8种,为什么没有这条缝隙呢?是因为他们在对于只有图像,而旁边没有字母的时候,做了不同的处理。如果你用IE8查看一下加了字母以后效果,可以看到同样出现了这个缝隙。

第四步:解决

到这里,我们就可以非常容易地把这个缝隙去掉了: 给图片增加一个CSS设置,使图像与文字的底端,而不是基线对齐就可以了。

1
2
3
4
5
<body>
        <div style="border:1px solid #FF0000;">
              <img src="images/logo1.jpg" style="vertical-align:text-bottom">
        </div>
</body>

第五步:总结

到这里,问题就解决了。从这个问题,我们可以总结几点。

1:要善于调试,善于从蛛丝马迹中寻找问题的本质原因。

2:调试的最重要的手段就是“简化代码、暴露问题”,要隔离出一段出现问题的最小代码集,这样寻找问题的解决方法就会容易得的。

3:要善于联想,尝试添加一些“辅助线”,帮你找到问题的关键。

4:基础知识要扎实,如果你根本就不知道有 vertical-align这样一回事,那么再怎么联系也没有用的。

5:书上的东西都是原理,真正如何灵活地运用到工作中,还需要靠不断地积累经验。

共 9 页: [1] 2 3 4 5 6 » ... 末页 | 下一页»