搜尋
首頁web前端html教學《编写高质量代码??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. 公共组件维护者的公共组件说明文档,需要提供配套的图片和说明文字,方便阅读。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
HTML標籤和HTML屬性有什麼區別?HTML標籤和HTML屬性有什麼區別?May 14, 2025 am 12:01 AM

HTMLtagsdefinethestructureofawebpage,whileattributesaddfunctionalityanddetails.1)Tagslike,,andoutlinethecontent'splacement.2)Attributessuchassrc,class,andstyleenhancetagsbyspecifyingimagesources,styling,andmore,improvingfunctionalityandappearance.

HTML的未來:進化和趨勢HTML的未來:進化和趨勢May 13, 2025 am 12:01 AM

HTML的未來將朝著更加語義化、功能化和模塊化的方向發展。 1)語義化將使標籤更明確地描述內容,提升SEO和無障礙訪問。 2)功能化將引入新元素和屬性,滿足用戶需求。 3)模塊化將支持組件化開發,提高代碼復用性。

為什麼HTML屬性對Web開發很重要?為什麼HTML屬性對Web開發很重要?May 12, 2025 am 12:01 AM

htmlattributesarecrucialinwebdevelopment forcontrollingBehavior,外觀和功能

Alt屬性的目的是什麼?為什麼重要?Alt屬性的目的是什麼?為什麼重要?May 11, 2025 am 12:01 AM

alt屬性是HTML中標籤的重要部分,用於提供圖片的替代文本。 1.當圖片無法加載時,alt屬性中的文本會顯示,提升用戶體驗。 2.屏幕閱讀器使用alt屬性幫助視障用戶理解圖片內容。 3.搜索引擎索引alt屬性中的文本,提高網頁的SEO排名。

HTML,CSS和JavaScript:示例和實際應用HTML,CSS和JavaScript:示例和實際應用May 09, 2025 am 12:01 AM

HTML、CSS和JavaScript在網頁開發中的作用分別是:1.HTML用於構建網頁結構;2.CSS用於美化網頁外觀;3.JavaScript用於實現動態交互。通過標籤、樣式和腳本,這三者共同構築了現代網頁的核心功能。

如何在標籤上設置lang屬性?為什麼這很重要?如何在標籤上設置lang屬性?為什麼這很重要?May 08, 2025 am 12:03 AM

設置標籤的lang屬性是優化網頁可訪問性和SEO的關鍵步驟。 1)在標籤中設置lang屬性,如。 2)在多語言內容中,為不同語言部分設置lang屬性,如。 3)使用符合ISO639-1標準的語言代碼,如"en"、"fr"、"zh"等。正確設置lang屬性可以提高網頁的可訪問性和搜索引擎排名。

HTML屬性的目的是什麼?HTML屬性的目的是什麼?May 07, 2025 am 12:01 AM

htmlattributeseresene forenhancingwebelements'functionalityandAppearance.TheyAdDinformationTodeFineBehavior,外觀和互動,使網站互動,響應式,visalalyAppealing.AttributesLikutesLikeSlikEslikesrc,href,href,href,類,類型,類型,和dissabledtransfransformformformformformformformformformformformformformformforment

您如何在HTML中創建列表?您如何在HTML中創建列表?May 06, 2025 am 12:01 AM

toCreateAlistInHtml,useforforunordedlistsandfororderedlists:1)forunorderedlists,wrapitemsinanduseforeachItem,RenderingeringAsabulletedList.2)fororderedlists,useandfornumberedlists,useandfornumberedlists,casundfornumberedlists,casundfornthetthetthetthetthetthetthetttributefordforderfordforderforderentnumberingsnumberingsnumberingStys。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器