以淘宝新版首页为实例讲述网页布局
一、以淘宝新版首页为实例讲述网页布局
1.1 流动性(自适应)布局
自适应布局,是指页面主体部分的宽度随着浏览器宽度的大小而发生改变
优点:
1. 显示器宽度利用率高,固定宽度的布局上,宽屏显示器用户的宽屏优势没有体现出来,比较浪费。
2. 网页的生命周期更长。
影响网页寿命因素:功能,web流行趋势,显示器的分辨率等。宽屏显示器的分辨率用户增多,不需要做任何改动,因为其页面自适应于任何分辨率的浏览器,其使用寿命是不会受分辨率影响的。
3. 模块化与重用性
如果一个页面是自适应,其内部的模块也是自适应,那么这个模块可以放在任何地方都不会影响布局,这样的话这个模块的重用性非常很大。
1.2 固定布局
固定布局,指的是页面主体部分宽度固定,不随着浏览器的大小或显示器的分辨率变化
固定布局优点:
1. 布局精良
自适应布局有时给人的感觉松松垮垮,不精致,而固定布局则可以很好的克服这个问题
2. 开发成本
从技术的实现上来讲,固定布局显然更容易实现,依照设计图,设置宽度、高度即可实现。
马化腾对Google产品特点的总结:文字化界面,极致简洁,排版清晰,重点突出。这是页面宽度自适应所必须的的。因为图片,尤其非平铺背景图片要随着浏览器宽度改变而改变是不方面的,即使实现后期的维护等都是需要大量成本的。自适应布局可以克服这一点。
自适应布局方法特点;宏观的布局,从整体入手,不必担心几像素的误差会破坏布局;而固定布局特点:其属于精确布局思想,讲求规整,像素级布局。
1.3 如何在页面制作中融合这两种布局特点?
融合特点:页面主体部分最外框的宽度不变,但是里面的元素水平自适应于外框宽度。即主体固定内部自适应。
优势:
1. 虽然页面不能自适应于浏览器的大小,但是即使后期页面需要改版调整宽度,只需要改最外框的宽度就可以了,只要改一个width值,其改版的成本几乎是0。
2. 内部宽度自适应可以让内部的元素重用性大大增强,不同的页面可以使用同一模块,即使宽度不一样也不用做任何的CSS修改。
自适应评论模块demo
3. 自适应布局的容错性相当高,基本上不会出现错位,或是几个像素的偏差造成的布局混乱,维护成本比固定布局小很多很多。实现困难维护简单。
twitter首页自适应布局demo页面
淘宝新版首页自适应页面demo
二、去除冗余 – 精简您的CSS样式代码(知识点比较细碎,需要点耐心)
问题: 常见的一些没有必要使用CSS代码,但使用了。越是对CSS理解不够,越容易出现这些问题。
前提条件:此处不考虑继承或是CSS reset
2.1 一些常见不必要CSS样式
2.1.1 与默认CSS样式一致
1.
p {width:auto; height:auto;}
上述代码没必要添加,因为默认的任何块状元素的高度几乎都是auto
2.
body,p,h1,h2,h3,h4,h5,h6{margin:0; padding:0;}
body,p,h1~6这些标签,本身的padding值就是0,所以只需要margin:0即可,如下:
body,p,h1,h2,h3,h4,h5,h6{margin:0;}
在CSS reset中,为了方便,都是一堆标签直接套个margin:0;padding:0; 这种做法不推荐,因为会浪费CSS的渲染。
常用的标签就ul,ol列表元素有默认的padding值,如下写法:
body,p,h1,h2,h3,h4,h5,h6{margin:0;}
ul,ol{list-type:none; margin:0; padding:0;}
3.
span{display:inline; float:left; margin-left:3px;}
上面写法多余,因为对于span/a/em/cite/i/b/strong等行内元素默认就是display:inline的
还有对本身就是block水平的元素设置display:block属性(之前看其它网站写的CSS,也一直奇怪/疑惑来着,本身就是block属性,还设置,都怀疑自己学的CSS与其他人不一样!)
li{display:block; padding:4px 0;}
4. 其它情况
p{margin:auto;}
textarea{overflow:auto;}
img,input,button{vertical-align:baseline;}
p{background-position:0 0;}
2.2 没有必要出现的样式
最常见的就是clear:both;的使用。
如果前后没有浮动元素干扰,使用clear:both是没有道理的。
(这样的CSS样式也碰到过,当初看得纠结啊!)
2.3 不起作用的单样式
有些CSS样式只针对特定显示水平的标签起作用
2.3.1 inline水平
inline水平的元素对很多CSS样式都不起反应,例如height/width, clear, margin-top/margin-bottom, vertical-align, overflow等。
inline元素与overflow属性demo
2.3.2 block水平
block水平的元素对vertical-align属性没有作用。
2.3.3 组合起作用
有些样式需要和其他一些特定的CSS属性一起使用才有作用。常见的就是z-index与position属性的组合使用,left/top/bottom/right与position属性的组合使用。
2.4 组合样式中多余的CSS代码
这种情况就多了,实际情况下,牵扯到继承,命名冲突,书写等
一些常见的多余样式的例子
a{display:block; float:left; margin-top:2px;}
display属性完全没有必要,对于a或是span标签而言,没有任何理由使用display+float的组合,float所产生的“包裹”作用已经让元素如同一个inline-block水平的元素,这种作用大于直接的display设置
仅仅一种情况下有必要使用display+float的组合,就是block水平的元素在IE6下的双边距bug问题,这种情况的唯一写法如下:
// 解决IE6下的双边距bug写法
display:inline; float:left; margin-left:3px;
一定要有与float浮动同方向的margin值,否则display:inline是多余的,可以直接去掉。
p{~~height:25px;~~line-height:25px;}
这段代码高度与line-height值一致,通常作用是实现单行文字的垂直居中显示。但是实际上,很多情况下,这里的height是个多余的值,尤其在模块标题处。对于单行文字而言,您设置line-height多大,其实际占据的垂直高度就是多高,没有任何的兼容性问题。
什么时候有必要同时使用呢?
IE6/7清除浮动影响的时候,IE6/7下设置height值可以让元素haslayout从而清除浮动的影响,而line-height无此作用,还有就是其他一些需要layout的情况。
span{display:block; width:100%;}
p{width:100%;}
body{width:100%;}
这也是常见的使用多余CSS样式的情况,width:100%。在一般情况下,对于block属性的元素,width:100%这个属性绝对是多余的。默认的,block水平的元素就是宽度相对于父标签100%显示的。
不使用100%的情况不是绝对的,下面这个组合可能使用width:100%是有必要的
p{width:100%; overflow:hidden;}
在IE6/7(没有IE8)下,对于block水平的元素,我们可以使用width:100%清除浮动造成的影响,原因与上例一样,haslayout,除了这种情况,纯粹的{width:100%;}样式(无float或是position:absolute之类的样式)是不可能出现的。
p{float:left/display:inline; vertical-align:middle;}
设置无用的vertical-align属性也是常见的。对于block/inline水平的元素或是设置了浮动属性或是absolute绝对定位的元素,其都不支持vertical-align属性。
p{position:absolute; left:0; top:0; display:inline; float:left; margin-left:10px;}
设置了绝对定位属性的元素相对特殊些,其不支持的CSS样式可就多了,首先对于display属性,完全没有必要,无论是block/inline-block/inline都是如此,除了现实隐藏外,没有任何组合使用的理由。absolute元素一旦设置了left/top这类定位值,margin属性也就失去了作用(有作用的),浮动也无效。还有其他很多属性都不支持,例如clear,vertical-align等。
p{height:20px/width:200px; zoom:1; overflow:hidden;}
我们可能会使用zoom清除IE6/7(对IE8无效)浏览器下浮动造成的影响。但是对于IE6/7而言,如果您已经设置了高度值或是宽度值,那么zoom:1完全就是多余的,在IE6/7下含有定值的height或是width与zoom:1起到了同样的一个作用,就是使元素haslayout,可用来清除浮动产生的影响,所以,width/height与zoom:1同时出现也是没有任何理由的。
a{display:inline-block; *display:inline; *zoom:1;}
这是设置元素的inline-block属性,但是对于inline行内元素来说,后面的两个样式就是多余的,因为display:inline-block可以让inline水平的元素表现的就如同真正的inline-block水平一样。
如果是p,则需要上面完整代码
使CSS代码足够精简的方法就是对每个CSS样式都要非常的熟悉了解
三、中国古代道家思想与网页重构的思考(主要涉及网页重构)
对于web设计师,总是要去抓住这个流行趋势,去重新设计页面,于是在web开发中,经常听到的一个词就是改版。部分流行的网站过一段时间后,可能需要改版,而
也有网站可以历经几十年都可以不用改版。
简洁???
简洁的含义到底是什么?是内容少?是去除任何不必要的东西?还是有更深此次的含义。很多网站都称追求简洁的设计,而最终的表现呢?往往差强人意。到底问题出在哪里呢?
设计——————剔除不必要的修饰、保留其本性
抓住代码的寓意以及本质——————深入理解语义化标签
控件——————浏览器对一些表单控件自定义了些样式,按钮,文本输入框,单选/复选框,文本域等。基本上大部分的页面都对这些控件进行了样式干预
页面重构,不仅仅是布局,设计,HTML,还有一个CSS
关于CSS重置(CSS reset)
小结:从页面的布局,结构,设计,以及HTML与CSS代码的各方面追求简洁。
注:张鑫旭本人不用CSS reset,他是按需书写。
来自于评论:基于display:table的CSS布局
四、CSS reset的重新审视 – 避免样式重置
CSS reset作用: 让各个浏览器的CSS样式有一个统一的基准
常见但事实上极不推荐的代码:
*{ margin:0; padding:0; }
4.1 CSS reset的滥用
关于CSS reset,根据您自己的要求做修改,但大部分基本上是直接拷贝过去。
常见标签的默认属性值及相互作用——关于CSS reset的思考
4.2 避免样式重置的理由(或CSS reset的不足)
大部分样式重置的标签不可能全部用到,如h1~h6标签;
如果不对h1~h6标签设置{margin:0}重置该如何?
从SEO的角度讲,一个页面最多只能出现一个h1标签,所以,显然,h1标签的CSS reset完全没有必要,页面什么地方用就设置相应的样式
记住,h1标签是有个默认的margin-top与margin-bottom值的,因此可以有下面这样的属性
h1{margin:10px 0 0;}
对比下CSS reset下的使用:
h1, h2, h3, h4, h5, h6{margin:0;}
.
.
.
h1{margin-top:10px;}
CSS reset:不仅文件大小增加了,CSS代码属性也发生了重置,CSS渲染也增加了。显然不及没有CSS reset来的高效
2. 关于兼容性
哪些标签的默认属性在不同浏览器下有差异?(此处需要重点查询一下常见标签的默认样式)
h1标签的文字的大小,在有些浏览器下大些,有些小些;然后就是一些margin值的些许偏差,然后还有呢?
目前浏览器而言,对于这些默认标签的属性其实差异是很少很小的,兼容性一说实在不能用在标签的默认属性上。
就算有一些差异,为何非得在头部已CSS reset的位置同一呢?当需要的时候,在设置,又有什么差异呢,这样,反而更直接,更高效!
3. CSS库的概念
与性能,优化的概念是相悖的,但其存在似乎有一定的道理,如设置默认的a标签的属性。不过也可这样设置(不用CSS reset的概念来解释它):
body{margin:0; font:normal 12px/1.5 '宋体';}
a{color:#34538b;}
上面,看不到CSS reset的样子
小结:1.最少的CSS代码,最少的渲染,最少的重置就是最好的CSS样式代码
2. 看完此篇文章应有意识的去整理形成自己的一套reset,再根据实际情况选择是否用它。
3. 评论很有意思,看到了Normalize.css,一种CSS reset替代方案来,让我们谈一谈 Normalize.css
4. 评论区也指出存在部分错误,现在先把这个问题先放这,抽个时间一一验证一下。
5. 评论区有人提到,这样做不值得。测试了*通配符和yahoo rest 渲染时间在IE下相差2毫秒,其它浏览器渲染时间也比较小。嗯,这也是一个思考的角度(其实也想问这样的问题,关于怎么测试渲染时间,暂且也搁置此处,过段时间再来深挖)
*通配符反而是破坏了部分元素的兼容性,例如单复选框与后面文字的间距。
级联是CSS里很重要的一个设计思想,覆盖之前的样式
关于form没有margin值的说法 在IE系列中form是有margin默认值的 在一个form标签的上下部分各添加点内容 就会发现form和他们之间是有明显间隙的
6.果然是评论区更精彩!
下篇为CSS样式设置方面的技巧,也同样来源于张鑫旭个人博客
注:
1. 做这个记录总结起因一是在写网页的时候碰到一些问题,解决不了,知道问题在哪,但不知道该怎么解决(比如一个标签设置的属性特别多,大概有十多个吧,但是有部分样式后面会用到,在这里要不要拆开分成多个属性方便后面复用。但是怎么拆呢?这个是一个问题;
2. 或者用PS测量标签的长、宽、内边距、边框、外边距,尼玛那可测得真精确呀,像素级别妥妥的!这还不算啥,关键是测了宽度还需要去计算,宽度减外边距还剩多少,减边框还剩多少,…一大堆计算,但是累成狗了呀!一直盯着屏幕眼睛也难受是不?
3. 写页面一直觉得不对劲,到了这里觉得自己的书写方式那是绝对有问题,所以跑到网上寻找思路,看看是不是有人也碰到了类似的问题。看到了知乎真阿当的一篇收徒文章(不过我不是去拜师的,行跪师礼这一行为我是没办法接受的!),先看了一下知乎关注度,又因为之前听过这个网名但是不是具体了解,百度搜了一下发现这人有出过一本书,然后跑去查找书方面的相关信息了,看了一下目录觉得值得一看。
4. 这本书解决了我的一个大问题,关于如何用JavaScript实现面向对象与继承。(虽然现在用面向对象写程序不怎么样,但至少看完这本书我对JavaScript实现面向对象与继承理解又深入了一点点)。看了不少视频,但是讲解都不太容易让人明白,网上也看了许多关于这方面的博客文章,还是理解不了。他写的书特点总结一下:由浅入深(类似“渐进增强”)、通俗易懂,思路也很清晰,可以看到他的思维过程。从这一点来看,如果他来带徒弟的话,可信度还是很高的,基本上不存在坑人的说法,应该是一个好的教学者吧!
5. 不过我的问题还是没有得完全解决,关于CSS部分第4章有提到网格布局,还有一些思想——用面向对象的方式来写CSS,简称oocss。这是个好东西呀,可以解决CSS中命名的以及选择符权重的问题。但是更深入的怎么去操作,没有进行下去。
6. 其实我想看看他是如何架构CSS的,网上找到他的博客去寻找答案,博文基本上被我翻了个遍,没发现关于oocss这方面的(有的话,书中也提到过)
7. 后面就找上张鑫旭、找上大漠来了,这不能怪我呀,谁让他们在前端界这么出名呢!大漠写的关于oocss的文章挺多的,他用BEM与oocss的结合的方式来进行命名,这我暂时还不太习惯。不过他有一个关于给CSS添加命名空间的想法还是很不错的。在这基础上又对命名空间,即选择符前面的前缀,根据组件、对象、工具等分类分别添加简写组成可复用的功能组件,这点对于避免冲突和提高css代码重用也是不错的。
8. 张鑫旭的关于CSS的博客文章也看了一小部分,关于页面布局、重构、页面代码的可复用性有他自己独到的见解,也是非常不错的!(上面第2点关于测量、写页面需要计算,这一问题在这里找到了解决,发现原来他也踩过这个坑。还有一个就是之前看其他人写的HTML大部分会添加一个“额外”的盒子,当时想不出这样写的好处在哪里,觉得纯属多余,这个“多余”的盒子我可一直记着呢,这点我在张鑫旭的博客里也找到了答案,这也就是上面第1、2点,为什么一个标签,我给他设置了那么多的属性,算错了又得重算,真是公公背媳妇过河———吃力不讨好啊!)