为什么先写HTML再写CSS
网页中HTML负责结构和语义,CSS负责表现,JavaScript负责行为。结构表现分离不是把文件拆开引用这么简单,而是在制作顺序上先按内容模块关系写出简洁、语义化的HTML,再通过CSS完成视觉样式。这样能减少HTML对CSS的依赖,后期维护、换肤和排查样式问题都更容易。文中以留言卡片为例,展示初级、中级、高级三种写法,从div层层嵌套到直接子元素布局,说明如何在不改变HTML结构的前提下完成设计图效果。
实现步骤与常用属性
1. 拿到设计图先看文字内容和模块关系,不急于套样式。
2. 按结构和语义编写HTML。
3. 再设置CSS样式。
4. 尽量降低HTML与CSS的耦合度。
常用手段包括:
overflow用于控制内容溢出:visible默认不修剪;hidden修剪且其余不可见;scroll修剪但显示滚动条;auto仅当内容被修剪时显示滚动条;inherit继承父元素。
text-indent可把文本缩进到目标位置,不必再给文本外套标签,减少冗余代码。
margin可以为负值,通过负margin让元素向四个方向移动,从而在不增加结构标签的情况下完成排版。
网页换肤的基础是相同HTML结构对应不同CSS样式,所以HTML越少依赖具体样式,换肤越容易。
示例结构:留言卡片三个单元
一个卡片包含头像、时间、昵称和正文。原文用三个demo表示三种结构:- <div class="demo1">
- <div class="fl">
- <img src="../../images/head02.jpg" alt="">
- </div>
- <div class="fr">
- <span>10分钟前</span>
- <h6>渐行渐远渐无书</h6>
- <p>你是不是每天脑子里盘踞许多挥之不去的想法觉得自己很忙,仔细想想又不知道自己真正地在忙些什么,而养成良好的习惯,照顾好自己,追随自己的梦想,才能提高生产力,这也意味着改善你与家人和朋友的关系,因为当你改变时,你周围的一切都改变了,高效能的人有哪些习惯值得我们学习?</p>
- </div>
- </div>
- <div class="demo2">
- <img src="../../images/head02.jpg" alt="">
- <div class="fr">
- <span>10分钟前</span>
- <h6>渐行渐远渐无书</h6>
- <p>你是不是每天脑子里盘踞许多挥之不去的想法觉得自己很忙,仔细想想又不知道自己真正地在忙些什么,而养成良好的习惯,照顾好自己,追随自己的梦想,才能提高生产力,这也意味着改善你与家人和朋友的关系,因为当你改变时,你周围的一切都改变了,高效能的人有哪些习惯值得我们学习?</p>
- </div>
- </div>
- <div class="demo3">
- <img src="../../images/head02.jpg" alt="">
- <span class="time">10分钟前</span>
- <h6>渐行渐远渐无书</h6>
- <p>你是不是每天脑子里盘踞许多挥之不去的想法觉得自己很忙,仔细想想又不知道自己真正地在忙些什么,而养成良好的习惯,照顾好自己,追随自己的梦想,才能提高生产力,这也意味着改善你与家人和朋友的关系,因为当你改变时,你周围的一切都改变了,高效能的人有哪些习惯值得我们学习?</p>
- </div>
复制代码
公共重置和文本样式如下,三个demo共用:- /* reset */
- body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{
- margin:0;padding:0;list-style:none;
- font:12px/1.5 "Arial","sans-serif","微软雅黑","宋体","Tahoma";
- }
- /* 公共样式 */
- .demo1,.demo2{
- width:600px;margin-top:20px;overflow:hidden;margin-bottom:20px;
- }
- p{
- text-align:justify;text-indent:2em;line-height:24px;
- }
复制代码
初级:额外div包住头像和文本
初级写法按视觉方框划分结构,大div里包含左右两个小div,左侧放img,右侧放span、h6、p,时间用绝对定位。这样能做出效果,但结构层级多,CSS选择器强依赖.fl、.fr等类名。- /* 初级 */
- .demo1{width:600px;margin-top:20px;overflow:hidden;}
- .demo1 .fl{width:100px;float:left;}
- .demo1 .fl img{margin-left:20px;padding:10px;border:1px solid #ccc;}
- .demo1 .fr{width:488px;float:right;border:1px solid #ccc;position:relative;padding:5px;}
- .demo1 .fr span{position:absolute;right:18px;top:5px;}
复制代码
中级:去掉左侧多余div
中级写法去掉左侧包img的div,让img直接作为.demo2的子元素,右侧仍保留.fr作为文本容器。结构少了一层,但文本区仍依赖额外包裹层和右浮动,HTML与CSS的绑定仍然较紧。- /* 中级 */
- .demo2 .fr{width:488px;float:right;border:1px solid #ccc;position:relative;padding:5px;}
- .demo2 .fr span{position:absolute;right:18px;top:5px;}
- .demo2 img{margin-left:20px;padding:10px;border:1px solid #ccc;}
复制代码
高级:结构最小化,用负margin和定位完成视觉
高级写法先把内容按语义写成img、span.time、h6、p并列,不再为左右布局增加包裹div。CSS里给.demo3设置宽度、左外边距、内边距、边框和相对定位;img左浮动,并用负margin向左上移动;时间span绝对定位到右上角。这样HTML结构更简洁,样式改动不轻易牵动结构,符合先结构后表现、降低HTML与CSS契合度的思路。- /* 高级 */
- .demo3{
- border:1px solid #ccc;width:488px;margin-left:100px;padding:5px;position:relative;
- }
- .demo3 img{
- float:left;margin:-6px 0 0 -86px;padding:10px;border:1px solid #ccc;
- }
- .demo3 span{
- position:absolute;top:10px;right:20px;
- }
复制代码
排查与适用场景
如果高级写法中头像位置偏移,先核对.demo3的margin-left、img的负margin以及padding、border是否与示例一致;时间位置异常时,检查父容器是否设置了position:relative,因为span的absolute定位以它为参照。初级和中级通过overflow:hidden处理浮动影响,高级结构直接并列元素,调整样式时要关注浮动和绝对定位对后续内容的影响。
这种“先语义结构、后CSS表现”的方式适合留言列表、评论卡片、内容块等需要复用和换肤的页面。相同HTML结构配不同CSS即可换肤,JavaScript行为也可独立添加,后期维护比层层div嵌套更清晰。
小结
原文用三个demo说明:初级靠div嵌套和左右浮动,中级去掉左侧div,高级把HTML简化到img、span、h6、p并列,再用负margin、浮动和绝对定位实现设计图效果。核心不是少写几个标签,而是先关注文字内容和模块关系,写出语义化结构,再在不改变现有结构的基础上完成视觉样式。 |