《编写高质量代码??Web前端开发修炼之道》读后随笔_html/css_WEB-ITnose
结构样式行为的分离
结构标准包括XML标准、XHTML标准、HTML标准;样式标准有CSS标准;行为标准主要包括DOM标准和ECMAScript标准。
通常的项目会按照如上的方式进行分离,但自己曾今做过的一个项目整个网站架构是按照模块进行分离的:
需求:设计一个网站,该网站的用途是根据用户需求生成网站,
例如一个企业展示网站,需要主页A,主页A包括布局(例如头部容器,导航容器,焦点图容器,然后之后再一个三列的容器,然后再页尾容器)。
每个容器中的模块都是根据用户需求加载,该页面A主要加载的模块:页头图片,水品导航、焦点图、最新新闻、最新产品、联系方式、页尾版权声明。
每个模块都有样式(例如颜色,背景图片,边距);每个模块都有配置信息(例如最新产品模块是否显示产品描述)。
如果按照结构样式行为分离的方式设计,那么我必须将如上的七个模块的样式配置都提取成CSS文件,还有每个模块的渲染JS提取成一个JavaScript文件,这么操作真能提高开发效率以及维护效率么?
目前的实现是:
1. 最终的页面只有一个JS文件,无CSS和额外的JS文件。
2. 页面由布局(排版)和模块(功能)两个部分组成。
3. 服务端根据用户请求的页面,从数据库中读取JSON格式的页面布局配置,用户生成最终页面的布局。
4. 服务端根据用户请求的页面,输出关联的每个模块的HTML以及该模块对应的JS渲染脚本(JS渲染脚本包含了JSON格式的样式信息和其他配置信息)。
5. 输出页面。
最终页面的源码输出看起来类似如下:
------------------------------------------------
通用JS封装
模块1HTML
模块2HTML
模块3HTML
模块1脚本
模块2脚本
模块3脚本
------------------------------------------------
对于服务端,实际上是实现了:插件(对应一个DLL)、插件模板(例如导航有水平导航,有垂直导航)、插件视图这样的架构(视图会从模板继承样式,例如一个水平导航可以有水平导航1,水平导航2)。
现在假设我的页面B也需要和页面A同样样式同样配置的导航,那么在服务端只需要:
1. 选择导航插件
2. 选择导航插件中的“水平导航”模板
3. 配置该模板的颜色、背景图片、动画效果等配置,标记为TPL1
4. 使用TPL1生成视图,标记为View1和View2
5. 在页面A的布局位置放入View1,在页面B的布局位置放入View2
6. 若今后需要同时修改A和B的背景图片,只需要修改TPL1的背景图片
7. 若今后需要只修改B的背景图片,只需要修改View2的背景图片
HTML标签的语义化
先确定HTML,确定语义的标签,再来选用合适的CSS。
使用Firefox的Web Developer插件来禁用CSS,看页面展现效果。
例如一个标题和内容的模块方案:
<标题>这里是标题内容<a href="#">更多</a></标题><段落>段落一的内容</段落><段落>段落二的内容</段落>
这里的“更多”事实上不应该属于标题标签中,调整后如下:
<div><标题>这里是标题内容</标题><a href="#">更多</a></div><段落>段落一的内容</段落><段落>段落二的内容</段落>
当页面内容标签无法满足设计需求时,才会适当添加DIV和SPAN等无语义的标签来辅助实现。
提高CSS质量
最常用的组织CSS的方式:base.css + common.css + page.css
基础类应该具备通用性和原子性,例如:
.f12{font-size:12px;}.zoom{zoom:1;}
用划线表示从属关系:例如".timeList-lastItem"从属于".timeList"样式。
用前缀表示开发人员:例如".xf-timeList-lastItem"、".jn-timeList-lastItme"。
多用组合,少用继承的原则:将类中不稳定的部分分离出来,单独设置成一个类,相对稳定的剩下的部分设置成另一个类,通过类的组合(多个class)实现最终样式。
CSS的权重计算:HTML标签的权重是1,class的权重是10,id的权重是100;例如"strong.demo"的权重是10+1=11;例如"#test.red"的权重是100+10=110。
CSS sprite:利用background-position来实现。
CSS Hack:
1. IE条件注释,也可以用于JS的Hack
<!--[if gt IE 6]><link type="text/css" href="test.css" rel="stylesheet" /><![endif]-->
2. 选择符前缀
"*html"星号前缀只对IE6生效;
"*+html"星号加前缀只对IE7生效;
在向后兼容方面存在一些风险,不能保证以后的IE版本都不识别*html和*+html。
3. 样式属性前缀
"_width:60px;"只在IE6下生效;
"*width:60px;"在IE6和IE7下生效。
4. 超链接hover的兼容:
顺序::link :visited :hover :active (lv ha)
display:inline-block
<!DOCTYPE html><html><head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"></meta> <style type="text/css"> body,ul,li{margin: 0px;padding: 0px;} ul{list-style: none;} li{display: inline-block;*display: inline;*zoom:1;} ul li {border:solid 1px #eee;padding: 2px 20px;} </style></head> <body> <div> <ul><li>标题1</li><li>标题2</li><li>标题3</li></ul> </div> </body></html>
position:absolute和float会隐式地改变display类型,不论之前设置了什么类型,都会让元素以display:inline-block的方式显示,就算显示设置display:inline或者display:block也无效。
IE6下的float双边距BUG就可以通过设置display:inline来解决。
水平居中的问题
给父元素设置text-align:center可以实现文本、图片等行内元素的水品居中。
确定宽度的块级元素可以通过设置margin-left:auto和margin-right:auto来实现。
不确定宽度的块级元素实现水平居中:
1. 可以通过将需要水平居中的块级元素放入table标签实现(不设置table标签的宽度,仅设置margin-left:auto和margin-right:auto就可以实现水平居中),缺点是增加了无语义的标签。
2. 改变块级元素的display为inline类型,然后使用text-align:center实现居中,缺点是块级元素变成行内元素后,无法设置长宽值等。
3. 通过给父元素设置float并设置position:relative和left:50%,子元素设置position:relative和left:-50%来实现水平居中,缺点是设置了position:relative,如下所示:
<!DOCTYPE html><html><head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"></meta> <style type="text/css"> body,ul,li{margin: 0px;padding: 0px;} .ccenter{position: relative;float: left;left: 50%;} .ccenter-in{position: relative;left: -50%;} .show{border:solid 1px #eee;margin: 10px;padding:10px;} </style></head> <body> <div class="ccenter"> <div class="ccenter-in show">这里的内容想要水平居中显示</div> </div> </body></html>
垂直居中的问题
父元素高度确定的单行文本的垂直居中可以通过设置line-height来实现。
CSS中有一个vertical-align属性只有在父元素为td或者th的时候才生效,在现代浏览器下(IE8+)可以设置块级元素的display类型为table-cell来激活vertical-align属性,但IE67下并不支持;
<!DOCTYPE html><html><head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"></meta> <style type="text/css"> body,ul,li{margin: 0px;padding: 0px;} .ccenter{height: 200px;display: table-cell;vertical-align: middle;*position: relative;} .fixie67vmiddle{*position: absolute;*top: 50%;} .fixie67vmiddle-in{*position: relative;*top:-50%;} .show{border:solid 1px #eee;margin: 10px;padding:10px;} </style></head> <body> <div class="ccenter hcenter"> <div class="fixie67vmiddle"> <div class="ccenter-in hcenter-c show">这里的内容想要垂直居中显示</div> </div> </div> </body></html>
另外想要实现块元素居中,还可以通过更简单的方式:
.vhcenter{ width: 400px; height: 200px; padding: 20px; position: absolute; top: 50%; left: 50%; margin-left: -210px; /* (width + padding)/2 */ margin-top: -120px; /* (height + padding)/2 */}
使用子选择器应对复杂变化
.content-lr-7025 .main{float:left;width:70%;}.content-lr-7025 .sidebar{float:right;width:25%;}.content-rl-7025 .main{float:right;width:70%;}.content-rl-7025 .sidebar{float:left;width:25%;}
z-index相关问题以及Flash和IE6下的select元素
z轴在设置position:relative或absolute后被激活,z-index值越大越靠上。
z-index设置为负数可能会遇到些麻烦,例如当位于body之下时,可能事件会被透明的body挡住。
负边距引起的相邻元素位置重叠,取决于HTML标签出现的先后顺序,后出现的标签浮于先出现的标签之上。
Flash嵌入网页时有个wmode属性,可以设置为opaque和transparent来防止Flash始终浮于最上方。
select表单元素在IE6下会浮于绝对定位的元素之上,可以使用一个和绝对定位元素同样大小的firame元素,通过z-index放置在绝对定位元素之下,select元素之上来定位。
PNG图片的IE6透明问题
参考P130页。
通过滤镜progid:DXImageTransform.Microsoft.AlphaImageLoader(src='png_file',sizingMethod='crop')实现。
提高 JavaScript质量
匿名函数控制作用域。
定义命名空间。
统一入口。
JavaScript分层。
封装浏览器差异。
弹性编程,可扩展:组件通过class来标识,并通过实现getElementsByClassName来获取一组功能相近的标签。
可复用:组件指定根节点,保持每个组件之间的独立性。
通过传参实现定制。
this的指向
<a href="#" onclick="alert(this.tagName)">test1</a><a href="#" onclick="javascript:alert(this.tagName)">test2</a>
如上的test1显示的是A,但test2显示的是undefined。
同样的setTimeout和setInterval也会改变this指向,传递的相当于函数指针,this就变成window作用域了:
var test="hello";var o={ test:'o', go:function(){ alert(this.test); }};o.go(); // osetTimeout(o.go,1000); // hellosetInterval(o.go,2000); // hello
可以通过匿名函数来调整this指向,另外还可以通过call和apply来调整this指向。
自定义标签属性
JavaScript和HTML标签之间存在映射关系,HTML标签在JavaScript中作为DOM节点对象存在。
对于常规属性,通过使用n.xxx的方式读取,对于自定义属性,统一使用n.getAttribute方法读取。
自定义属性可以通过info=eval("("+info+")");来反序列化。
协作
1. 公共组件一人维护,各个子频道专人负责;
2. 视觉设计师完成设计后,和交互设计师沟通,确定设计可行性;然后先将设计图给公共组件维护者,看是否需要提取公共组件,然后再提交给相应频道的前端工程师,如果有公共组件要提取,公共组件维护者需要对频道前端工程师说明。
3. 如果没有公共组件提取,交互设计师直接和各栏目前端工程师交流,对照视觉设计师的设计图进行需求说明,前端工程师完成需求。
4. 前端工程师在制作设计时,先去common文件中查询是否已经存在设计图中的组件,如果有,直接调用,如果没有,则在自己频道的文件中添加对应的代码。
5. 前端工程师在制作过程中,发现有高度重用的组件,却未加入到公共组件中,则向公共组件维护人说明,然后由公共组件维护人决定是否添加该组件。
6. 公共组件维护者的公共组件说明文档,需要提供配套的图片和说明文字,方便阅读。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











HTML은 간단하고 배우기 쉽고 결과를 빠르게 볼 수 있기 때문에 초보자에게 적합합니다. 1) HTML의 학습 곡선은 매끄럽고 시작하기 쉽습니다. 2) 기본 태그를 마스터하여 웹 페이지를 만들기 시작하십시오. 3) 유연성이 높고 CSS 및 JavaScript와 함께 사용할 수 있습니다. 4) 풍부한 학습 리소스와 현대 도구는 학습 과정을 지원합니다.

HTML은 웹 구조를 정의하고 CSS는 스타일과 레이아웃을 담당하며 JavaScript는 동적 상호 작용을 제공합니다. 세 사람은 웹 개발에서 의무를 수행하고 화려한 웹 사이트를 공동으로 구축합니다.

WebDevelopmentReliesonHtml, CSS 및 JavaScript : 1) HtmlStructuresContent, 2) CSSSTYLESIT, 및 3) JAVASCRIPTADDSINGINTERACTIVITY, BASISOFMODERNWEBEXPERIENCES를 형성합니다.

anexampleStartingtaginhtmlis, whithbeginsaparagraph.startingtagsareessentialinhtmlastheyinitiate rements, definetheirtypes, andarecrucialforstructurituringwebpages 및 smanstlingthedom.

GiteEpages 정적 웹 사이트 배포 실패 : 404 오류 문제 해결 및 해결시 Gitee ...

이미지를 클릭 한 후 주변 이미지를 산란 및 확대하는 효과를 얻으려면 많은 웹 디자인이 대화식 효과를 달성해야합니다. 특정 이미지를 클릭하여 주변을 만들 수 있습니다 ...

웹 주석 기능에 대한 Y 축 위치 적응 알고리즘이 기사는 Word 문서와 유사한 주석 기능을 구현하는 방법, 특히 주석 간격을 다루는 방법을 모색합니다 ...

HTML, CSS 및 JavaScript는 웹 개발의 세 가지 기둥입니다. 1. HTML은 웹 페이지 구조를 정의하고 등과 같은 태그를 사용합니다. 2. CSS는 색상, 글꼴 크기 등과 같은 선택기 및 속성을 사용하여 웹 페이지 스타일을 제어합니다.
