版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前端开发规范手册目录TOC\h\h基本原则\hHTML\h通用约定\h语义化\hHEAD\hCSS\h通用约定\h字体排印\h模块组织\hLess规范\h性能优化\hJavaScript\h通用约定\hjQuery规范\h性能优化\h移动端优化\h工具箱介紹前端开发规范手册此手册主要实现的目标:代码一致性和最佳实践。通过代码风格的一致性,降低维护代码的成本以及改善多人协作的效率。同时遵守最佳实践,确保页面性能得到最佳优化和高效的代码。此手册是在开发中积累下来的经验和参考其它规范/指南制定的,它只是起指导作用,除个别条目强制之外,大多数为非强制约束,开发者可根据自己的实际情况自行决定是否要遵守该指南只是保证大方向一致性和最佳实践的阶段性总结,不是最后结论,它会随着时间而变化。介紹-5-基本原则基本原则结构、样式、行为分离尽量确保文档和模板只包含HTML结构,样式都放到样式表里,行为都放到脚本里。缩进统一两个空格缩进(总之缩进统一即可),不要使用Tab或者Tab、空格混搭。文件编码使用不带BOM的UTF-8编码。在HTML中指定编码<metacharset="utf-8">;无需使用@charset指定样式表的编码,它默认为UTF-8(参考\h@charset);一律使用小写字母1.<!--Recommended-->2.<imgsrc="google.png"alt="Google">3.4.<!--Notrecommended-->5.<AHREF="/">Home</A>1./*Recommended*/2.color:#e5e5e5;3.4./*Notrecommended*/5.color:#E5E5E5;省略外链资源URL协议部分省略外链资源(图片及其它媒体资源)URL中的http/https协议,使URL成为相对地址,避免\hMixedContent问题,减小文件字节数。其它协议(ftp等)的URL不省略。1.<!--Recommended-->2.<scriptsrc="///js/gweb/analytics/autotrack.js"></script>3.4.<!--Notrecommended-->5.<scriptsrc="/js/gweb/analytics/autotrack.js"></script>-6-基本原则1./*Recommended*/2..example{3.background:url(///images/example);4.}5.6./*Notrecommended*/7..example{8.background:url(/images/example);9.}统一注释通过配置编辑器,可以提供快捷键来输出一致认可的注释模式。HTML注释模块注释1.<!--文章列表列表模块-->2.<divclass="article-list">3....4.</div>区块注释<!--@name:DropDownMenu@description:Styleoftopbardropdownmenu.@author:Ashu(Aaaaaashu@)-->CSS注释组件块和子组件块以及声明块之间使用一空行分隔,子组件块之间三空行分隔;-7-基本原则/*==========================================================================组件块============================================================================*//*子组件块============================================================================*/.selector{padding:15px;margin-bottom:15px;}/*子组件块============================================================================*/.selector-secondary{display:block;/*注释*/}.selector-three{display:span;}JavaScript注释单行注释必须独占一行。//后跟一个空格,缩进与下一行被注释说明的代码一致。多行注释避免使用/*...*/这样的多行注释。有多行注释内容时,使用多个单行注释。函数/方法注释1.函数/方法注释必须包含函数说明,有参数和返回值时必须使用注释标识。;2.参数和返回值注释必须包含类型信息和说明;3.当函数是内部函数,外部不可访问时,可以使用@inner标识;-8-基本原则/***函数描述**@param{string}p1参数1的说明*@param{string}p2参数2的说明,比较长*那就换行了.*@param{number=}p3参数3的说明(可选)*@return{Object}返回值描述*/functionfoo(p1,p2,p3){varp3=p3||10;return{p1:p1,p2:p2,p3:p3};}文件注释文件注释用于告诉不熟悉这段代码的读者这个文件中包含哪些东西。应该提供文件的大体内容,它的作者,依赖关系和兼容性信息。如下:/***@fileoverviewDescriptionoffile,itsusesandinformation*aboutitsdependencies.*@authoruser@(FirstnameLastname)*Copyright2015MeizuInc.AllRightsReserved.*/代码验证使用\hW3CHTMLValidator来验证你的HTML代码有效性;使用\hW3CCSSValidator来验证你的CSS代码有效性;代码验证不是最终目的,真的目的在于让开发者在经过多次的这种验证过程后,能够深刻理解到怎样的语法或写法是非标准和不推荐的,即使在某些场景下被迫要使用非标准写法,也可以做到心中有数。-9-HTMLHTML尽量遵循HTML标准和语义,但是不要以牺牲实用性为代价。任何时候都要尽量使用最少的标签并保持最小的复杂度。-10-通用约定通用约定标签自闭合(self-closing)标签,无需闭合(例如:imginputbrhr等);可选的闭合标签(closingtag),需闭合(例如:</li>或</body>);尽量减少标签数量;1.<imgsrc="images/google.png"alt="Google">2.<inputtype="text"name="title">3.4.<ul>5.<li>Style</li>6.<li>Guide</li>7.</ul>8.9.<!--Notrecommended-->10.<spanclass="avatar">11.<imgsrc="...">12.</span>13.14.<!--Recommended-->15.<imgclass="avatar"src="...">Class与IDclass应以功能或内容命名,不以表现形式命名;class与id单词字母小写,多个单词组成时,采用中划线-分隔;使用唯一的id作为Javascripthook,同时避免创建无样式信息的class;1.<!--Notrecommended-->2.<divclass="j-hookleftcontentWrapper"></div>3.4.<!--Recommended-->5.<divid="j-hook"class="sidebarcontent-wrapper"></div>属性顺序HTML属性应该按照特定的顺序出现以保证易读性。idclassnamedata-xxxsrc,for,type,href-11-通用约定title,altaria-xxx,role1.<aid="..."class="..."data-modal="toggle"href="###"></a>2.3.<inputclass="form-control"type="text">4.5.<imgsrc="..."alt="...">引号属性的定义,统一使用双引号。1.<!--Notrecommended-->2.<spanid='j-hook'class=text>Google</span>3.4.<!--Recommended-->5.<spanid="j-hook"class="text">Google</span>嵌套a不允许嵌套div这种约束属于语义嵌套约束,与之区别的约束还有严格嵌套约束,比如a不允许嵌套a。严格嵌套约束在所有的浏览器下都不被允许;而语义嵌套约束,浏览器大多会容错处理,生成的文档树可能相互不太一样。语义嵌套约束<li>用于<ul>或<ol>下;<dd>,<dt>用于<dl>下;<thead>,<tbody>,<tfoot>,<tr>,<td>用于<table>下;严格嵌套约束inline-Level元素,仅可以包含文本或其它inline-Level元素;<a>里不可以嵌套交互式元素<a>、<button>、<select>等;<p>里不可以嵌套块级元素<div>、<h1>~<h6>、<p>、<ul>/<ol>/<li>、<dl>/<dt>/<dd>、<form>等。更多详情,参考\hWEB标准系列-HTML元素嵌套布尔值属性HTML5规范中disabled、checked、selected等属性不用设置值。1.<inputtype="text"disabled>2.3.<inputtype="checkbox"value="1"checked>-12-通用约定4.5.<select>6.<optionvalue="1"selected>1</option>7.</select>-13-语义化语义化没有CSS的HTML是一个语义系统而不是UI系统。通常情况下,每个标签都是有语义的,所谓语义就是你的衣服分为外套,裤子,裙子,内裤等,各自有对应的功能和含义。所以你总不能把内裤套在脖子上吧。—一丝此外语义化的HTML结构,有助于机器(搜索引擎)理解,另一方面多人协作时,能迅速了解开发者意图。常见标签语义标签语义<p>段落<h1><h2><h3>...标题<ul>无序列表<ol>有序列表<blockquote>大段引用<cite>一般引用<b>为样式加粗而加粗<strong>为强调内容而加粗<i>为样式倾斜而倾斜<em>为强调内容而倾斜code代码标识abbr缩写示例将你构建的页面当作一本书,将标签的语义对应的其功能和含义;书的名称:<h1>书的每个章节标题:<h2>章节内的文章标题:<h3>小标题/副标题:<h4><h5><h6>章节的段落:<p>更多语义化的内容,参考sofish写的文章\h这样去写你的HTML。-14-HEADHEAD文档类型为每个HTML页面的第一行添加标准模式(standardmode)的声明,这样能够确保在每个浏览器中拥有一致的表现。1.<!DOCTYPEhtml>语言属性\h为什么使用lang=”zh-cmn-Hans”而不是我们通常写的lang=”zh-CN”呢?请参考知乎上的讨论:网页头部的\h声明应该是用lang=”zh”还是lang=”zh-cn”?1.<!--中文-->2.<htmllang="zh-Hans">3.4.<!--简体中文-->5.<htmllang="zh-cmn-Hans">6.7.<!--繁体中文-->8.<htmllang="zh-cmn-Hant">9.10.<!--English-->11.<htmllang="en">字符编码以无BOM的utf-8编码作为文件格式;\h指定字符编码的meta必须是head的第一个直接子元素;请参考前端观察的博文:HTML5Charset能\h用吗?<html><head><metacharset="utf-8"></head><body></body></html>IE兼容模式-15-HEAD优先使用最新版本的IE和Chrome内核<metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1">SEO优化<head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><!--SEO--><title>StyleGuide</title><metaname="keywords"content="yourkeywords"><metaname="description"content="yourdescription"><metaname="author"content="author,emailaddress"></head>viewportviewport:一般指的是浏览器窗口内容区的大小,不包含工具条、选项卡等内容;width:浏览器宽度,输出设备中的页面可见区域宽度;device-width:设备分辨率宽度,输出设备的屏幕可见宽度;initial-scale:初始缩放比例;maximum-scale:最大缩放比例;为移动端设备优化,设置可见区域的宽度和初始缩放比例。<metaname="viewport"content="width=device-width,initial-scale=1.0">iOS图标apple-touch-icon图片自动处理成圆角和高光等效果;apple-touch-icon-precomposed禁止系统自动添加效果,直接显示设计原图;-16-HEAD<!--iPhone和iTouch,默认57x57像素,必须有--><linkrel="apple-touch-icon-precomposed"href="/apple-touch-icon-57x57-precomposed.png"><!--iPad,72x72像素,可以没有,但推荐有--><linkrel="apple-touch-icon-precomposed"href="/apple-touch-icon-72x72-precomposed.png"sizes="72x72"><!--RetinaiPhone和RetinaiTouch,114x114像素,可以没有,但推荐有--><linkrel="apple-touch-icon-precomposed"href="/apple-touch-icon-114x114-precomposed.png"sizes="114x114"><!--RetinaiPad,144x144像素,可以没有,但推荐有--><linkrel="apple-touch-icon-precomposed"href="/apple-touch-icon-144x144-precomposed.png"sizes="144x144">favicon在未指定favicon时,大多数浏览器会请求WebServer根目录下的favicon.ico。为了保证favicon可访问,避免404,必须遵循以下两种方法之一:在WebServer根目录放置favicon.ico文件;使用link指定favicon;<linkrel="shortcuticon"href="path/to/favicon.ico">HEAD模板-17-HEAD<!DOCTYPEhtml><htmllang="zh-cmn-Hans"><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><title>StyleGuide</title><metaname="description"content="不超过150个字符"><metaname="keywords"content=""><metaname="author"content="name,email@"><!--为移动设备添加viewport--><metaname="viewport"content="width=device-width,initial-scale=1.0"><!--iOS图标--><linkrel="apple-touch-icon-precomposed"href="/apple-touch-icon-57x57-precomposed.png"><linkrel="alternate"type="application/rss+xml"title="RSS"href="/rss.xml"/><linkrel="shortcuticon"href="path/to/favicon.ico"></head>-18-CSSCSS-19-通用约定通用约定代码组织以组件为单位组织代码段;制定一致的注释规范;组件块和子组件块以及声明块之间使用一空行分隔,子组件块之间三空行分隔;如果使用了多个CSS文件,将其按照组件而非页面的形式分拆,因为页面会被重组,而组件只会被移动;良好的注释是非常重要的。请留出时间来描述组件(component)的工作方式、局限性和构建它们的方法。不要让你的团队其它成员来猜测一段不通用或不明显的代码的目的。提示:通过配置编辑器,可以提供快捷键来输出一致认可的注释模式。1./*==========================================================================2.组件块3.============================================================================*/4.5./*子组件块6.============================================================================*/7..selector{8.padding:15px;9.margin-bottom:15px;10.}11.12.13.14./*子组件块15.============================================================================*/16..selector-secondary{17.display:block;/*注释*/18.}19.20..selector-three{21.display:span;22.}Class和ID使用语义化、通用的命名方式;使用连字符-作为ID、Class名称界定符,不要驼峰命名法和下划线;避免选择器嵌套层级过多,尽量少于3级;避免选择器和Class、ID叠加使用;出\h于性能考量,在没有必要的情况下避免元素选择器叠加Class、ID使用。-20-通用约定元素选择器和ID、Class混合使用也违反关注分离原则。如果HTML标签修改了,就要再去修改CSS代码,不利于后期维护。1./*Notrecommended*/2..red{}3..box_green{}4..page.header.login#usernameinput{}5.ul#example{}6.7./*Recommended*/8.#nav{}9..box-video{}10.#usernameinput{}11.#example{}声明块格式选择器分组时,保持独立的选择器占用一行;声明块的左括号{前添加一个空格;声明块的右括号}应单独成行;声明语句中的:后应添加一个空格;声明语句应以分号;结尾;一般以逗号分隔的属性值,每个逗号后应添加一个空格;rgb()、rgba()、hsl()、hsla()或rect()括号内的值,逗号分隔,但逗号后不添加一个空格;对于属性值或颜色参数,省略小于1的小数前面的0(例如,.5代替0.5;-.5px代替-0.5px);十六进制值应该全部小写和尽量简写,例如,#fff代替#ffffff;避免为0值指定单位,例如,用margin:0;代替margin:0px;;1./*Notrecommended*/2..selector,.selector-secondary,.selector[type=text]{3.padding:15px;4.margin:0px0px15px;5.background-color:rgba(0,0,0,0.5);6.box-shadow:0px1px2px#CCC,inset01px0#FFFFFF7.}8.9./*Recommended*/10..selector,11..selector-secondary,12..selector[type="text"]{13.padding:15px;14.margin-bottom:15px;15.background-color:rgba(0,0,0,.5);16.box-shadow:01px2px#ccc,inset01px0#fff;17.}-21-通用约定声明顺序相关属性应为一组,推荐的样式编写顺序1.Positioning2.Boxmodel3.Typographic4.Visual由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(boxmodel)相关的样式,因此排在首位。盒模型决定了组件的尺寸和位置,因此排在第二位。其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。1..declaration-order{2./*Positioning*/3.position:absolute;4.top:0;5.right:0;6.bottom:0;7.left:0;8.z-index:100;9.10./*Boxmodel*/11.display:block;12.box-sizing:border-box;13.width:100px;14.height:100px;15.padding:10px;16.border:1pxsolid#e5e5e5;17.border-radius:3px;18.margin:10px;19.float:right;20.overflow:hidden;21.22./*Typographic*/23.font:normal13px"HelveticaNeue",sans-serif;24.line-height:1.5;25.text-align:center;26.27./*Visual*/28.background-color:#f5f5f5;29.color:#fff;30.opacity:.8;31.32./*Other*/33.cursor:pointer;34.}-22-通用约定引号使用url()、属性选择符、属性值使用双引号。参考\hIsquotingthevalueofurl()reallynecessary?1./*Notrecommended*/2.@importurl(///css/maia.css);3.4.html{5.font-family:'opensans',arial,sans-serif;6.}7.8./*Recommended*/9.@importurl("///css/maia.css");10.11.html{12.font-family:"opensans",arial,sans-serif;13.}14.15..selector[type="text"]{16.17.}媒体查询(Mediaquery)的位置将媒体查询放在尽可能相关规则的附近。不要将他们打包放在一个单一样式文件中或者放在文档底部。如果你把他们分开了,将来只会被大家遗忘。1..element{...}2..element-avatar{...}3..element-selected{...}4.5.@media(max-width:768px){6..element{...}7..element-avatar{...}8..element-selected{...}9.}不要使用@import与<link>相比,@import要慢很多,不光增加额外的请求数,还会导致不可预料的问题。替代办法:使用多个通过Sass或Less类似的CSS预处理器将多个CSS文件编译为一个文件;其他CSS文件合并工具;-23-通用约定参考\hdon’tuse@import;链接的样式顺序:a:link->a:visited->a:hover->a:active(LoVeHAte)无需添加浏览器厂商前缀使用\hAutoprefixer自动添加浏览器厂商前缀,编写CSS时不需要添加浏览器前缀,直接使用标准的CSS编写。Autoprefixer通过\hCanIuse,按兼容的要求,对相应的CSS代码添加浏览器厂商前缀。-24-字体排印字体排印暂时参\h考网页字体排印指南TODO-25-模块组织模块组织任何超过1000行的CSS代码,你都曾经历过这样的体验:1.这个class到底是什么意思呢?2.这个class在哪里被使用呢?3.如果我创建一个xxooclass,会造成冲突吗?ReasonableSystemforCSSStylesheetStructure的目标就是解决以上问题,它不是一个框架,而是通过规范,让你构建更健壮和可维护的CSS代码。Components(组件)从Components的角度思考,将网站的模块都作为一个独立的Components。Namingcomponents(组件命名)Components最少以两个单词命名,通过-分离,例如:点赞按钮(.like-button)搜索框(.search-form)文章卡片(.article-card)Elements(元素)Elements是Components中的元素Namingelements(元素命名)Elements的类名应尽可能仅有一个单词。-26-模块组织1..search-form{2.>.field{/*...*/}3.>.action{/*...*/}4.}Onmultiplewords(多个单词)对于倘若需要两个或以上单词表达的Elements类名,不应使用中划线和下划线连接,应直接连接。1..profile-box{2.>.firstname{/*...*/}3.>.lastname{/*...*/}4.>.avatar{/*...*/}5.}Avoidtagselectors(避免标签选择器)任何时候尽可能使用classnames。标签选择器在使用上没有问题,但是其性能上稍弱,并且表意不明确。1..article-card{2.>h3{/*✗avoid*/}3.>.name{/*✓better*/}4.}Variants(变体)Components和Elements可能都会拥有Variants。Namingvariants(变体命名)Variants的classname应带有前缀中划线-1..like-button{-27-模块组织2.&.-wide{/*...*/}3.&.-short{/*...*/}4.&.-disabled{/*...*/}5.}Elementvariants(元素变体)1..shopping-card{2.>.title{/*...*/}3.>.title.-small{/*...*/}4.}Dashprefixes(中划线前缀)为什么使用中划线作为变体的前缀?它可以避免歧义与ElementsCSSclass仅能以单词和_或-开头中划线比下划线更容易输出Layout(布局)Avoidpositioningproperties(避免定位属性)Components应该在不同的上下文中都可以复用,所以应避免设置以下属性:Positioning(position,top,left,right,bottom)Floats(float,clear)Margins(margin)Dimensions(width,height)*Fixeddimensions(固定尺寸)-28-模块组织头像和logos这些元素应该设置固定尺寸(宽度,高度…)。Definepositioninginparents(在父元素中设置定位)倘若你需要为组件设置定位,应将在组件的上下文(父元素)中进行处理,比如以下例子中,将widths和floats应用在listcomponent(.article-list)当中,而不是component(.article-card)自身。1..article-list{2.&{3.@includeclearfix;4.}5.6.>.article-card{7.width:33.3%;8.float:left;9.}10.}11.12..article-card{13.&{/*...*/}14.>.image{/*...*/}15.>.title{/*...*/}16.>.category{/*...*/}17.}Avoidover-nesting(避免过分嵌套)当出现多个嵌套的时候容易失去控制,应保持不超过一个嵌套。1./*✗Avoid:3levelsofnesting*/2..image-frame{3.>.description{4./*...*/5.6.>.icon{7./*...*/8.}9.}10.}11.12./*✓Better:2levels*/13..image-frame{14.>.description{/*...*/}15.>.description>.icon{/*...*/}16.}Apprehensions(顾虑)-29-模块组织中划线-是一坨糟糕的玩意:其实你可以选择性的使用,只要将Components,Elements,Variants记在心上即可。我有时候想不出两个单词唉:有些组件的确使用一个单词就能表意,比如aleter。但其实你可以使用后缀,使其意识更加明确。比如块级元素:.alert-box.alert-card.alert-block或行内级元素.link-button.link-spanTerminologies(术语)RSCSS与其他CSS模块组织系统相似的概念RSCSSBEMSMACSSComponentBlockModuleElementElement?Layout?LayoutVariantModifierTheme&StateSummary(总结)以Components的角度思考,以两个单词命名(.screenshot-image)Components中的Elements,以一个单词命名(.blog-post.title)Variants,以中划线-作为前缀(.shop-banner.-with-icon)Components可以互相嵌套记住,你可以通过继承让事情变得更简单\h译自:ReasonableSystemforCSSStylesheetStructure-30-Less规范LESS代码组织代码按一下顺序组织:1.@import2.变量声明3.样式声明1.@import"mixins/size.less";2.3.@default-text-color:#333;4.5..page{6.width:960px;7.margin:0auto;8.}@import语句@import语句引用的文需要写在一对引号内,.less后缀不得省略。引号使用'和"均可,但在同一项目内需统一。1./*Notrecommended*/2.@import"mixins/size";3.@import'mixins/grid.less';4.5./*Recommended*/6.@import"mixins/size.less";7.@import"mixins/grid.less";混入(Mixin)1.在定义mixin时,如果mixin名称不是一个需要使用的className,必须加上括号,否则即使不被调用也会输出到CSS中。2.如果混入的是本身不输出内容的mixin,需要在mixin后添加括号(即使不传参数),以区分这是否是一个className。1./*Notrecommended*/2..big-text{3.font-size:2em;4.}5.-31-Less规范6.h3{7..big-text;8..clearfix;9.}10.11./*Recommended*/12..big-text(){13.font-size:2em;14.}15.16.h3{17..big-text();/*1*/18..clearfix();/*2*/19.}避免嵌套层级过多将嵌套深度限制在2级。对于超过3级的嵌套,给予重新评估。这可以避免出现过于详实的CSS选择器。避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于20行的嵌套规则出现。字符串插值变量可以用类似ruby和php的方式嵌入到字符串中,像@{name}这样的结构:@base-url:"";background-image:url("@{base-url}/images/bg.png");-32-性能优化性能优化慎重选择高消耗的样式高消耗属性在绘制前需要浏览器进行大量计算:box-shadowsborder-radiustransparencytransformsCSSfilters(性能杀手)避免过分重排当发生重排的时候,浏览器需要重新计算布局位置与大小,\h更多详情。常见的重排元素:widthheightpaddingmargindisplayborder-widthpositiontopleftrightbottomfont-sizefloattext-alignoverflow-yfont-weightoverflowfont-familyline-heightvertical-alignclearwhite-spacemin-height正确使用Display的属性Display属性会影响页面的渲染,请合理使用。-33-性能优化display:inline后不应该再使用width、height、margin、padding以及float;display:inline-block后不应该再使用float;display:block后不应该再使用vertical-align;display:table-*后不应该再使用margin或者float;不滥用FloatFloat在渲染时计算量比较大,尽量减少使用。动画性能优化动画的实现原理,是利用了人眼的“视觉暂留”现象,在短时间内连续播放数幅静止的画面,使肉眼因视觉残象产生错觉,而误以为画面在“动”。动画的基本概念:帧:在动画过程中,每一幅静止画面即为一“帧”;帧率:即每秒钟播放的静止画面的数量,单位是fps(Framepersecond);帧时长:即每一幅静止画面的停留时间,单位一般是ms(毫秒);跳帧(掉帧/丢帧):在帧率固定的动画中,某一帧的时长远高于平均帧时长,导致其后续数帧被挤压而丢失的现象。一般浏览器的渲染刷新频率是60fps,所以在网页当中,帧率如果达到50-60fps的动画将会相当流畅,让人感到舒适。如果使用基于javaScript的动画,尽量使用requestAnimationFrame.避免使用setTimeout,setInterval.避免通过类似jQueryanimate()-style改变每帧的样式,使用CSS声明动画会得到更好的浏览器优化。使用translate取代absolute定位就会得到更好的fps,动画会更顺滑。-34-性能优化多利用硬件能力,如通过3D变形开启GPU加速一般在Chrome中,3D或透视变换(perspectivetransform)CSS属性和对opacity进行CSS动画会创建新的图层,在硬件加速渲染通道的优化下,GPU完成3D变形等操作后,将图层进行复合操作(CompesiteLayers),从而避免触发浏览器大面积重绘和重排。注:3D变形会消耗更多的内存和功耗。使用translate3d右移500px的动画流畅度要明显优于直接使用left:1..ball-1{2.transition:-webkit-transform.5sease;3.-webkit-transform:translate3d(0,0,0);4.}5..ball-1.slidein{6.-webkit-transform:translate3d(500px,0,0);7.}8..ball-2{9.transition:left.5sease;left:0;10.}11..ball-2.slidein{12.left:500px;13.}提升CSS选择器性能-35-性能优化CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器。而在这之前我们需要了解CSS选择器匹配的机制,如子选择器规则:1.#header>a{font-weight:blod;}我们中的大多数人都是从左到右的阅读习惯,会习惯性的设定浏览器也是从左到右的方式进行匹配规则,推测这条规则的开销并不高。我们会假设浏览器以这样的方式工作:寻找id为header的元素,然后将样式规则应用到直系子元素中的a元素上。我们知道文档中只有一个id为header的元素,并且它只有几个a元素的子节点,所以这个CSS选择器应该相当高效。事实上,却恰恰相反,CSS选择器是从右到左进行规则匹配。了解这个机制后,例子中看似高效的选择器在实际中的匹配开销是很高的,浏览器必须遍历页面中所有的a元素并且确定其父元素的id是否为header。如果把例子的子选择器改为后代选择器则会开销更多,在遍历页面中所有a元素后还需向其上级遍历直到根节点。1.#headera{font-weight:blod;}理解了CSS选择器从右到左匹配的机制后,明白只要当前选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和规则匹配的选择符,或者因为不匹配而退出。我们把最右边选择符称之为关键选择器。—\h—更多详情1、避免使用通用选择器1./*Notrecommended*/2..content*{color:red;}浏览器匹配文档中所有的元素后分别向上逐级匹配class为content的元素,直到文档的根节点。因此其匹配开销是非常大的,所以应避免使用关键选择器是通配选择器的情况。2、避免使用标签或class选择器限制id选择器1./*Notrecommended*/2.button#backButton{…}3./*Recommended*/4.#newMenuIcon{…}3、避免使用标签限制class选择器1./*Notrecommended*/2.treecell.indented{…}3./*Recommended*/4..treecell-indented{…}5./*Muchtorecommended*/6..hierarchy-deep{…}-36-性能优化4、避免使用多层标签选择器。使用class选择器替换,减少css查找1./*Notrecommended*/2.treeitem[mailfolder="true"]>treerow>treecell{…}3./*Recommended*/4..treecell-mailfolder{…}5、避免使用子选择器1./*Notrecommended*/2.treeheadtreerowtreecell{…}3./*Recommended*/4.treehead>treerow>treecell{…}5./*Muchtorecommended*/6..treecell-header{…}6、使用继承1./*Notrecommended*/2.#bookmarkMenuItem>.menu-left{list-style-image:url(blah)}3./*Recommended*/4.#bookmarkMenuItem{list-style-image:url(blah)}-37-JavaScriptJavaScript-38-通用约定通用约定注释原则Asshortaspossible(如无必要,勿增注释):尽量提高代码本身的清晰性、可读性。Aslongasnecessary(如有必要,尽量详尽):合理的注释、空行排版等,可以让代码更易阅读、更具美感。单行注释必须独占一行。//后跟一个空格,缩进与下一行被注释说明的代码一致。多行注释避免使用/*...*/这样的多行注释。有多行注释内容时,使用多个单行注释。函数/方法注释1.函数/方法注释必须包含函数说明,有参数和返回值时必须使用注释标识。;2.参数和返回值注释必须包含类型信息和说明;3.当函数是内部函数,外部不可访问时,可以使用@inner标识;1./**2.*函数描述3.*4.*@param{string}p1参数1的说明5.*@param{string}p2参数2的说明,比较长6.*那就换行了.7.*@param{number=}p3参数3的说明(可选)8.*@return{Object}返回值描述9.*/10.functionfoo(p1,p2,p3){11.varp3=p3||10;12.return{13.p1:p1,14.p2:p2,15.p3:p316.};17.}文件注释文件注释用于告诉不熟悉这段代码的读者这个文件中包含哪些东西。应该提供文件的大体内容,它的作者,依赖关系和兼容性信息。如下:-39-通用约定1./**2.*@fileoverviewDescriptionoffile,itsusesandinformation3.*aboutitsdependencies.4.*@authoruser@(FirstnameLastname)5.*Copyright2009MeizuInc.AllRightsReserved.6.*/命名变量,使用Camel命名法。1.varloadingModules={};私有属性、变量和方法以下划线_开头。1.var_privateMethod={};常量,使用全部字母大写,单词间下划线分隔的命名方式。1.varHTML_ENTITY={};1.函数,使用Camel命名法。2.函数的参数,使用Camel命名法。1.functionstringFormat(source){}2.3.functionhear(theBells){}1.类,使用Pascal命名法2.类的方法/属性,使用Camel命名法1.functionTextNode(value,engine){2.this.value=value;3.this.engine=engine;4.}5.6.TextNtotype.clone=function(){7.returnthis;8.};1.枚举变量使用Pascal命名法。2.枚举的属性,使用全部字母大写,单词间下划线分隔的命名方式。1.varTargetState={-40-通用约定2.READING:1,3.READED:2,4.APPLIED:3,5.READY:46.};由多个单词组成的缩写词,在命名中,根据当前命名法和出现的位置,所有字母的大小写与首字母的大小写保持一致。1.functionXMLParser(){}2.3.functioninsertHTML(element,html){}4.5.varhttpRequest=newHTTPRequest();命名语法类名,使用名词。1.functionEngine(options){}函数名,使用动宾短语。1.functiongetStyle(element){}boolean类型的变量使用is或has开头。1.varisReady=false;2.varhasMoreCommands=false;Promise对象用动宾短语的进行时表达。1.varloadingData=ajax.get('url');2.loadingData.then(callback);接口命名规范1.可读性强,见名晓义;2.尽量不与jQuery社区已有的习惯冲突;3.尽量写全。不用缩写,除非是下面列表中约定的;(变量以表达清楚为目标,uglify会完成压缩体积工作)常用词说明options表示选项,与jQuery社区保持一致,不要用config,opts等active表示当前,不要用current等-41-通用约定index表示索引,不要用idx等trigger触点元素triggerType触发类型、方式context表示传入的this对象object推荐写全,不推荐简写为o,obj等element推荐写全,不推荐简写为el,elem等length不要写成len,lprevprevious的缩写nextnext下一个constructor不能写成ctoreasing示动画平滑函数minminimize的缩写maxmaximize的缩写DOM不要写成dom,Dom.hbs使用hbs后缀表示模版btnbutton的缩写link超链接title主要文本img图片路径(img标签src属性)datasethtml5data-xxx数据接口theme主题className类名classNameSpaceclass命名空间True和False布尔表达式类型检测优先使用typeof。对象类型检测使用instanceof。null或undefined的检测使用==null。下面的布尔表达式都返回false:nullundefined‘’空字符串0数字0但小心下面的,可都返回true:‘0’字符串0[]空数组{}空对象不要在Array上使用for-in循环-42-通用约定for-in循环只用于object/map/hash的遍历,对Array用for-in循环有时会出错.因为它并不是从0到length-1进行遍历,而是所有出现在对象及其原型链的键值。1.//Notrecommended2.functionprintArray(arr){3.for(varkeyinarr){4.print(arr[key]);5.}6.}7.8.printArray([0,1,2,3]);//Thisworks.9.10.vara=newArray(10);11.printArray(a);//Thisiswrong.12.13.a=document.getElementsByTagName('*');14.printArray(a);//Thisiswrong.15.16.a=[0,1,2,3];17.a.buhu='wine';18.printArray(a);//Thisiswrongagain.19.20.a=newArray;21.a[3]=3;22.printArray(a);//Thisiswrongagain.23.24.//Recommended25.functionprintArray(arr){26.varl=arr.length;27.for(vari=0;i<l;i++){28.print(arr[i]);29.}30.}二元和三元操作符操作符始终写在前一行,以免分号的隐式插入产生预想不到的问题。1.varx=a?b:c;2.3.vary=a?4.longButSimpleOperandB:longButSimpleOperandC;5.6.varz=a?7.moreComplicatedB:8.moreComplicatedC;-43-通用约定.操作符也是如此:1.varx=foo.bar().2.doSomething().3.doSomethingElse();条件(三元)操作符(?:)三元操作符用于替代if条件判断语句。1.//Notrecommended2.if(val!=0){3.returnfoo();4.}else{5.returnbar();6.}7.8.//Recommended9.returnval?foo():bar();&&和||二元布尔操作符是可短路的,只有在必要时才会计算到最后一项。1.//Notrecommended2.functionfoo(opt_win){3.varwin;4.if(opt_win){5.win=opt_win;6.}else{7.win=window;8.}9.//...10.}11.12.if(node){13.if(node.kids){14.if(node.kids[index]){15.foo(node.kids[index]);16.}17.}18.}19.20.//Recommended21.functionfoo(opt_win){22.varwin=opt_win||window;23.//...-44-通用约定24.}25.26.varkid=node&&node.kids&&node.kids[index];27.if(kid){28.foo(kid);29.}-45-jQuery规范jQuery规范使用最新版本的jQuery最新版本的jQuery会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的jQuery。以下是三条常见的jQuery语句,版本越新,性能越好:1.$('.elem')2.$('.elem',context)3.context.find('.elem')分别使用1.4.2、1.4.4、1.6.2三个版本测试浏览器在一秒内能够执行多少次,结果1.6.2版执行次数远超两个老版本。jQuery变量1.存放jQuery对象的变量以$开头;2.将jQuery选择器返回的对象缓存到本地变量中复用;3.使用驼峰命名变量;1.var$myDiv=$("#myDiv");2.$myDiv.click(function(){...});选择器1.尽可能的使用ID选择器,因为它会调用浏览器原生方法document.getElementById查找元素。当然直接使用原生document.getElementById方法性能会更好;2.在父元素中选择子元素使用.find()方法性能会更好,因为ID选择器没有使用到Sizzle选择器引擎来查找元素;1.//Notrecommended2.var$productIds=$("#products.class");3.4.//Recommended5.var$productIds=$("#products").find(".class");DOM操作1.当要操作DOM元素的时候,尽量将其分离节点,操作结束后,再插入节点;2.使用字符串连接或array.join要比.append()性能更好;1.var$myList=$("#list-container>ul").detach();2.//...alotofcomplicatedthingson$myList3.$myList.appendTo("#list-container");-46-jQuery规范1.//Notrecommended2.var$myList=$("#list");3.for(vari=0;i<10000;i++){4.$myList.append("<li>"+i+"</li>");5.}6.7.//Recommended8.var$myList=$("#list");9.varlist="";10.for(vari=0;i<10000;i++){11.list+="<li>"+i+"</li>";12.}13.$myList.html(list);14.15.//Muchtorecommended16.vararray=[];17.for(vari=0;i<10000;i++){18.array[i]="<li>"+i+"</li>";19.}20.$myList.html(array.join(''));事件1.如果需要,对事件使用自定义的namespace,这样容易解绑特定的事件,而不会影响到此DOM元素的其他事件监听;2.对Ajax加载的DOM元素绑定事件时尽量使用事件委托。事件委托允许在父元素绑定事件,子代元素可以响应事件,也包括Ajax加载后添加的子代元素;1.$("#myLink").on("click.mySpecialClick",myEventHandler);2.$("#myLink").unbind("click.mySpecialClick");1.//Notrecommended2.$("#lista").on("click",myClickHandler);3.4.//Recommended5.$("#list").on("click","a",myClickHandler);链式写法1.尽量使用链式写法而不是用变量缓存或者多次调用选择器方法;2.当链式写法超过三次或者因为事件绑定变得复杂后,使用换行和缩进保持代码可读性;1.$("#myDiv").addClass("error").show();-47-jQuery规范1.$("#myLink")2..addClass("bold")3..on("click",myClickHandler)4..on("mouseover",myMouseOverHandler)5..show();其他1.多个参数使用对象字面量存储;2.不要将CSS写在jQuery里面;3.正则表达式仅准用.test()和.exec()。不准用“string”.match();jQuery插件模板1.//jQueryPluginBoilerplate2.//AboilerplateforjumpstartingjQuerypluginsdevelopment3.//version1.1,May14th,20114.//byStefanGabos5.6.//remembertochangeeveryinstanceof"pluginName"tothenameofyourplugin!7.(function($){8.9.//herewego!10.$.pluginName=function(element,options){11.12.//plugin'sdefaultoptions13.//thisisprivatepropertyandisaccessibleonlyfrominsidetheplugin14.vardefaults={15.16.foo:'bar',17.18.//ifyourpluginisevent-driven,youmayprovidecallbackcapabilities19.//foritsevents.executethesefunctionsbeforeoraftereventsofyour20.//plugin,sothatusersmaycustomizethoseparticulareventswithout21.//changingtheplugin'scode22.onFoo:function(){}23.24.}25.26.//toavoidconfusions,use"plugin"toreferencethe27.//currentinstanceoftheobject28.varplugin=this;29.30.//thiswillholdthemergeddefault,anduser-providedoptions31.//plugin'spropertieswillbeavailablethroughthisobjectlike:32.//pertyNamefrominsidethepluginor33.//element.data('pluginName').pertyNamefromoutsidetheplugin,-48-jQuery规范34.//where"element"istheelementthepluginisattachedto;35.plugin.settings={}36.37.var$element=$(element),//referencetothejQueryversionofDOMelement38.element=element;//referencetotheactualDOMelement39.40.//the"constructor"methodthatgetscalledwhentheobjectiscreated41.plugin.init=function(){42.43.//theplugin'sfinalpropertiesarethemergeddefaultand44.//user-providedoptions(ifany)45.plugin.settings=$.extend({},defaults,options);46.47.//codegoeshere48.49.}50.51.//public
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省百所重点高中2025-2026学年数学高一上期末学业质量监测试题含解析
- 排水盲管内壁绝对粗糙度试验记录
- 毕业设计论文模板大全
- 浅论西欧封建制度的形成与骑士制度
- 浅议平武县白马藏族服饰
- 论文答辩评审表评语
- 学生存在问题的清单和对策
- 试析供应链中采购管理的作用与影响
- 年建筑行业的供应链管理挑战与解决方案
- 理论研究与经验研究对于社会科学研究的重要性
- TCNPA - 景区玻璃栈道建设规范
- 合金固态相变全套教学课件
- 《公共机构能源托管规程》
- 心肺复苏术后护理和查房
- 产科出血大量输血策略
- 电气设备安全操作培训
- 《第二十章第五节磁生电》 -2023-2024学年物理人教版九年级下学期
- TYLTSN 0001-2023 尉犁罗布麻茶
- 微波辅助化学合成技术
- 医院HIS信息管理系统故障应急预案
- 亲子乐园财务分析与预测报告
评论
0/150
提交评论