PHP与JS运算符优先级比较
最后更新于:2022-04-01 06:04:48
[TOC]
# 运算符优先级
PHP与JS的基本语法结构非常相似,即便是在职多年的老手特别是双管前端与后台开发的程序员,常常会搞错某些最基础的东西。下面将PHP与JS的运算符列出,以便集中巩固基础知识。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-11-21_564fee2c03b4b.png)
运算符的方向中,左表示同级的(不必同一种运算符)表达式从左向右求值,右表示表达式从右向左求值。
编写高效的CSS
最后更新于:2022-04-01 06:04:46
[TOC]
编写好的CSS代码,有助提升页面的渲染速度。本质上,引擎需要解析的CSS规则越少,性能越好。MDN上将CSS选择符归类成四个主要类别,如下所示,性能依次降低。
*ID 规则*
*Class 规则*
*标签规则*
*通用规则*
对效率的普遍认识是从Steve Souders在2009年出版的《[高性能网站建设进阶指南](http://click.union.360buy.com/JdClick/?unionId=16231&to=http://book.360buy.com/10067740.html)》开始,虽然该书中罗列的更加详细,但你也可以在[这里](http://csswizardry.com/2011/09/writing-efficient-css-selectors/)查看完整的引用列表,也可以在谷歌的《[高效CSS选择器的最佳实践](https://developers.google.com/speed/docs/best-practices/rendering#UseEfficientCSSSelectors)》中查看更多的细节。
本文我想分享一些我在编写高性能CSS中用到的简单例子和指南。这些都是受到[MDN 编写的高效CSS指南](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Writing_efficient_CSS)的启发,并遵循类似的格式。
---
显然,这里只讲述了少数的规则,是我在我自己的CSS中,本着更高效和更易维护性而尝试遵循的规则。如果你想阅读更多的知识,我建议阅读MDN上的[编写高效的CSS](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Writing_efficient_CSS)和谷歌的[优化浏览器渲染指南](https://developers.google.com/speed/docs/best-practices/rendering#UseEfficientCSSSelectors)。
---
# 遵循一个标准的声明顺序
虽然有一些排列CSS属性顺序[常见的方式](http://css-tricks.com/new-poll-how-order-css-properties/),下面是我遵循的一种流行方式。
```css
.someclass {
1.位置属性(position, top, right, z-index, display, float等)
2.大小(width, height, padding, margin)
3.文字系列(font, line-height, letter-spacing, color- text-align等)
4.背景(background, border等)
5.其他(animation, transition等)
}
```
box-model从内向外写: `size -> padding -> border -> margin`
# 后代选择符最烂
不仅性能低下而且代码很脆弱,html代码和css代码严重耦合,html代码结构发生变化时,CSS也得修改,这是多么糟糕,特别是在大公司里,写html和css的往往不是同一个人。
~~~
// 烂透了
html div tr td {..}
~~~
# 避免链式(交集)选择符
这和过度约束的情况类似,更明智的做法是简单的创建一个新的CSS类选择符。
```css
// 糟糕
.menu.left.icon {..}
// 好的
.menu-left-icon {..}
```
# 组织好的代码格式
代码的易读性和易维护性成正比。下面是我遵循的格式化方法。
```css
/*糟糕*/
.someclass-a, .someclass-b, .someclass-c, .someclass-d {
...
}
/* 好的 */
.someclass-a,
.someclass-b,
.someclass-c,
.someclass-d {
...
}
/* 好的做法 */
.someclass {
background-image:
linear-gradient(#000, #ccc),
linear-gradient(#ccc, #ddd);
box-shadow:
2px 2px 2px #000,
1px 4px 1px 1px #ddd inset;
}
```
# 参考
[编写更好的CSS代码](http://blog.jobbole.com/55067/)
附录
最后更新于:2022-04-01 06:04:43
[编写高效的CSS](编写高效的CSS.md)
[PHP与JS运算符优先级比较](PHP与JS运算符优先级比较.md)
php相关
最后更新于:2022-04-01 06:04:41
[TOC]
# PHP相关
设置 `register_globals = off`;
设置 `error_reporting = E_ALL`,并且要修正所有的`error`和`warning`;
将实际的操作放在被引用的文件中。把引用文件放到不可以被直接浏览的目录下。
> `register_globals` 已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
当``register_globals=Off``的时候,下一个程序接收的时候应该用`$_GET['user_name']`和`$_GET['user_pass']`来接受传递过来的值。(注:当`<form>`的method属性为post的时候应该用`$_POST['user_name']`和`$_POST['user_pass']`)
当`register_globals=On`的时候,下一个程序可以直接使用`$user_name`和`$user_pass`来接受值。
顾名思义,`register_globals` 的意思就是注册为全局变量,所以当 `On` 的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。
所以,碰到上边那些无法得到值的问题的朋友应该首先检查一下你的 `register_globals` 的设置和你获取值的方法是否匹配。(查看可以用 `phpinfo()` 函数或者直接查看 `php.ini`)。
安全规则
最后更新于:2022-04-01 06:04:39
[TOC]
# 输入和输出
## 检查是否做了HTML代码的过滤
可能出现的问题:如果有人输入恶意的HTML代码,会导致窃取`cookie`, 产生恶意登录表单,和破坏网站。
## 检查变量做数据库操作之前是否做了`escape`
可能出现的问题:如果一个要写入查询语句的字符串变量包含了某些特殊的字符,比如引号(',")或者分号(;) 可能造成执行了预期之外的操作。
建议采用的方法:使用`mysql_escape_string()`或实现类似功能的函数。
## 检查输入数值的合法性
可能出现的问题:异常的数值会造成问题。如果对输入的数值不做检查会造成不合法的或者错误的数据存入UDB、存入其它的数据库或者导致意料之外的程序操作发生。
举例:如果程序以用户输入的参数值做为文件名,进行文件操作,恶意输入系统文件名会造成系统损毁。
## 核实对cookie的使用以及对用户数据的处理
可能出现的问题:不正确的`cookie`使用可能造成用户数据泄漏。
## 先申明后使用
XXX环境下的 PHP 代码编写要求所有的变量均需要先申明后使用,否则会有错误信息,**对于数组**,在使用一个不确定的 `key` 时,比如先进行 `isset()` 的判断,然后再使用;比如下面的代码:
~~~
$array = array();
$var = isset( $array[3] ) ? $array[3] : '';
~~~
## 严格的过滤和合法性验证
在XXX环境下,对 web 通过 `GET` 或者 `POST` 方法传递来的参数均要求进行**严格的过滤和合法性验证**,不推荐使用直接的 `$_GET` 、 `$_POST` 或者 `$_REQUEST` 获取,而通过 XXX 的 XXX_yiv 模块提供的方法获取和过滤处理,(类似ThinkPHP的I函数)。
## 访问控制
对内部使用的产品或者供合作方使用的产品,要考虑增加访问控制。
## logs
确保用户的保密信息没有记在`log`中(例如:用户的密码);
确保对关键的用户操作保存了完整的用户访问记录。
## https
对敏感数据的传输要采用https。
安全规范
最后更新于:2022-04-01 06:04:36
[TOC]
# 安全规范
当我们尝试编码时,很多时候不知道如何去让自己的代码变得安全一点,因为我们缺乏安全常识,安全常识的规范可以帮你杜绝一些日常的菜鸟黑客的攻击,却不能阻止骨灰级专家们的凌厉攻势,所以更高深的安全我们还得从其他途径学习。
SQL 规范
最后更新于:2022-04-01 06:04:34
1. SQL语句不区分大小写(要大写全大写,小写全小写),但数据库和表的名称则区分大小写!
2. `NOT NULL`的意思是表中所有行的此属性必须有一个值;如果没有指定,该列可以为空(`NULL`);
3. `unsigned` 无符号的,意思是它只能是0或者一个正数;
PHP大小写敏感问题整理
最后更新于:2022-04-01 06:04:32
> 参考:http://www.jbxue.com/article/9280.html
## php的大小写敏感问题整理:
我们知道,PHP语言对大小写敏感问题的处理有点乱,在编程时需要多加注意,特别是在linux平台中更要注意。
说明:
不鼓励用这些规则,仅作为学习研究之用。
>**在编程中,应当坚持“ _大小写敏感_ ”,遵循统一的代码规范。**
### 一、大小写敏感
1. 所有变量均区分大小写,包括普通变量以及PHP 超级全局变量。
~~~``
<?php
$abc = 'abcd';
echo $abc; //输出 'abcd'
echo $aBc; //无输出
echo $ABC; //无输出
?>
~~~
2 .常量名默认区分大小写,通常都写为大写。
~~~
<?php
define("ABC","Hello World");
echo ABC; //输出 Hello World
echo abc; //输出 abc
?>
~~~
3 .php.ini配置项指令区分大小写
如 file_uploads = 1 不能写成 File_uploads = 1。
### 二、大小写不敏感
1. 函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字。
~~~
<?php
function show(){
echo "Hello World";
}
show(); //输出 Hello World 推荐写法
SHOW(); //输出 Hello World
?>
~~~
~~~
<?php
class cls{
static function func(){
echo "hello world";
}
}
Cls::FunC(); //输出hello world
?>
~~~
2 .魔术常量不区分大小写,推荐大写,包括:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、 __NAMESPACE__。
~~~
<?php
echo __line__; //输出 2
echo __LINE__; //输出 3
?>
~~~
3 .NULL、TRUE、FALSE不区分大小写。
~~~
<?php
$a = null;
$b = NULL;
$c = true;
$d = TRUE;
$e = false;
$f = FALSE;
var_dump($a == $b); //输出 boolean true
var_dump($c == $d); //输出 boolean true
var_dump($e == $f); //输出 boolean true
?>
~~~
4 .类型强制转换,不区分大小写。
~~~
<?php
$a=1;
var_dump($a); //输出 int 1
$b=(STRING)$a;
var_dump($b); //输出string '1' (length=1)
$c=(string)$a;
var_dump($c); //输出string '1' (length=1)
?>
~~~
其他规范
最后更新于:2022-04-01 06:04:30
##包含文件
提取出来具有通用函数的包含文件,文件后缀以`.inc`来命名,表明这是一个包含文件。
如果有多个`.inc`文件需要包含多页面,请把所有`.inc`文件封装在一个文件里面,具体到页面只需要包换一个`.inc`文件就可以了。
如:`xxx_session.inc`、`xxx_comm.inc`、`xxx_setting.inc`、`myssql_db.inc`。
把以上文件以以下方式,封装在`xxx.basic.inc`文件里面:
~~~``
require_once('xxx_session.inc');
require_once('xxx_comm.inc');
require_once('xxx_setting.inc');
require_once('mysql_db.inc');
~~~
## PHP和HTML代码的分离问题
对性能要求不是很高的项目和应用,我们建议不采用 PHP 和 HTML 代码直接混排的方式书写代码,而采用 PHP 和 HTML 代码分离的方式,即采用模版的方式处理,这样一方面对程序逻辑结构更加清晰有利,也有助于开发过程中人员的分工安排,同时还对日后项目的页面升级该版提供更多便利。
**对于一些特殊情况,比如对性能要求很高的应用,可以不采用模版方式。**
## 类的构造函数
如果要在类里面编写构造函数,必须遵循以下规则:
a.不能在构造函数中有太多实际操作,顶多用来初始化一些值和变量;
b.不能在构造函数中因为使用操作而返回false或者错误,因为在声明和实例化一个对象的时候,是不能返回错误的;
##错误返回检测规则
检查所有的系统调用的错误信息,除非你要忽略错误。
为每条系统错误消息定义好系统错误文本,并记录错误LOG。
##引用的使用
引用在程序中使用比较多,为了公用同一个内存,而不需要另外进行复制,XXX环境下的引用使用时,需要注意下面的情况;
在对函数的输入参数中使用引用时,不能在调用的时候在输入参数前加 `&` 来引用,而直接使用该变量即可,同时必须在函数定义的时候说明输入参数来自引用,比如下面的代码:
~~~
$a = 1;
function ab( &$var ) {
$var ++;
return $var;
}
$b = ab($a); // 注意,此处不能使用 $b = ab(&$a)的方式;
echo $b."\n";
echo $a."\n";
~~~
此时 `$a` 和 ``$b`` 都是 2;
XXX环境下对引用的特殊要求源自 php.ini 文件里面的`allow_call_time_pass_reference` 项设置,对外公开的版本是 `On`,这样就可以支持`&`直接加到调用函数时变量前面进行引用,但是这一方法遭到抗议,并可能在将来版本的 PHP/Zend 里不再支持。受到鼓励的指定哪些参数按引用传递的方法是在函数声明里。你被鼓励尝试关闭这一选项(使用`off`,XXX的所有运行环境下都是`off`)并确认你的脚本仍能正常工作,以保证在将来版本的语言里它们仍能工作。
##PHP项目开发中的程序逻辑结构
对于 PHP 项目开发,尽量采用 `OOP` 的思想开发,尤其在 PHP5 以后,对于面向对象的开发功能大大提高。
在 PHP 项目中,我们建议将独立的功能模块尽量写成函数调用,对应一整块业务逻辑,我们建议封装成类,既可以提高代码可读性,也可以提高代码重用性。比如,我们通常将对数据库的接口封装成数据库类,有利于平台的移植。
重复的代码要做成公共的库。(除了我们在 `plug-in` 产品上遇到的情况,该产品系列有多个相类似的产品,为了尽可能地减少安装包尺寸,不适合将这些产品共用的所有函数做成公共的库)。
注释规范
最后更新于:2022-04-01 06:04:27
**每个程序均必须提供必要的注释,书写注释要求规范,参照PEAR提供的注释要求,为今后利用`phpdoc`生成 PHP 文档做准备。**
## 1、程序头注释块
每个程序头部必须有统一的注释块,规则如下:
a.必须包含本程序的描述;
b.必须包含作者;
c.必须包含书写日期;
d.必须包含版本信息;
e.必须包含项目名称;
f.必须包含文件的名称;
g.重要的使用说明,如类的调用方法、注意事项等;
参考例子如下:
~~~``
//
// +---------------------------------------------------------+
// | PHP version 4.0
// +---------------------------------------------------------+
// | Copyright (c) 1997-2001 The PHP Group
// +---------------------------------------------------------+
// | This source file is subject to of the PHP license,
// | that is bundled with this packafile LICENSE, and is
// | available at through the world-web at
// | http://www.php.net/license/2_02.txt.
// | If you did not receive a copy of the and are unable to
// | obtain it through the world-wide-web,end a note to
// | license@php.net so we can mail you a immediately.
// +---------------------------------------------------------+
// | Authors: Stig Bakken
// | Tomas V.V.Cox
//
// +———————————————————+
//
// $Id: Common.php,v 1.8.2.3 2001/11/13 01:26:48 ssb Exp $
~~~
##2、类的注释
类的注释采用里面的参考例子方式:
~~~
/**
* @ Purpose:
* 访问数据库的类,以ODBC作为通用访问接口
* @Package Name: Database
* @Author: Forrest Gump gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into()参数位置第二和第三个位置调换
* John Johnson John@crtvu.edu.cn
* @See: (参照)
*/
class Database {
...
}
~~~
##3、函数和方法的注释
函数和方法的注释写在函数和方法的前面,采用类似下面例子的规则:
~~~
/**
* @Purpose:
* 执行一次查询
* @Method Name: query()
* @Param: string $queryStr SQL查询字符串
* @Param: string $username 用户名
* @Access: public
* @Return: mixed 查询返回值(结果集对象)
*/
public function query ( $queryStr, $username ) {
...
}
~~~
##4、变量或者语句注释
程序中变量或者语句的注释遵循以下原则:
a.写在变量或者语句的前面一行,而不写在同行或者后面;
b.注释采用``/* */``的方式;
c.每个函数前面要包含一个注释块。内容包括函数功能简述,输入/输出参数,预期的返回值,出错代码定义;
d.注释完整规范;
e.把已经注释掉的代码删除,或者注明这些已经注释掉的代码仍然保留在源码中的特殊原因。
例子:
~~~
/**
* @Purpose:
* 数据库连接用户名
* @Attribute/Variable Name: db_user_name
* @Type: string
*/
var db_user_name;
~~~
##5、标注使用
IDE支持一些特殊注释,可以列出整个项目的特殊注释,方便后期的维护和代码检查,例如:
~~~
//@fixMe 表示需要修复项。如:修复了IP获取的一个安全漏洞
//@todo 表示需要完善的地方。如:这个函数的效率太低,需要改进。
~~~
上述注释和java中的标注及注解比较相像。可以查看NetBeans中标注的效果。
不同的IDE对这类特殊注释的支持程度不一。为了编码效率和团队协作,建议在项目开发时使用IDE进行项目管理。
对于代码不推荐使用的函数或方法,使用@Deprecated注释;对于重载方法,使用@over load注释。
数据库命名规范
最后更新于:2022-04-01 06:04:25
## 数据库表名
数据库表名命名遵循以下规范:
a.表名均使用小写字母;
b.表名使用统一前缀,且前缀不能为空(模块化,且可有效规避MySQL保留字)
c.对于多个单词组成的表名,使用_间隔;
d.对于普通数据表,使用`_t`结尾;
e.对于视图,使用`_v`结尾;
f.存储过程以`_proc`结尾;
j.触发器以`_tri`结尾;
h.Event调度以`_event`结尾。
例子:`user_info_t` 和 `book_store_v`等。
## 数据库字段
数据库字段命名遵循以下规范:
a.全部使用小写;
b.多个单词间使用_间隔。
c.避免使用关键字和保留字。
例子:`user_name`、`rose_price`等。
编码规范
最后更新于:2022-04-01 06:04:23
> 参考:[ThinkPHP开发规范](http://document.thinkphp.cn/manual_3_2.html#develop_standard)
1。**普通变量**采用小写字母,多单词以“`_`”连接,例如:`$base_dir`、`$red_rose_price`等。
2。**静态变量**以“`s_`”开头,字母小写,多单词以“`_`”连接,例如:`$s_base_dir`、`$s_red_rose_prise`等。
3。**局部变量**以“`_`”开头,字母小写,多单词以“`_`”连接,例如:`$_base_dir`、`$_red_rose_price`等。
4。**全局变量**以“`G_`”开头,字母大写,多单词以“`_`”连接,知道一个变量的作用域是非常重要的。例如:`global $G_LOG_LEVEL`、`global $G_LOG_PATH`。
5。**session**以“`S_`”开头,字母大写,多单词以“`_`”连接,例子:`$S_BASE_DIR`、`$S_RED_ROSE_PRICE`等。
6。确保文件的命名和**调用大小写一致**,是由于在类Unix系统上面,对大小写是敏感的(而ThinkPHP在调试模式下面,即使在Windows平台也会严格检查大小写);
7。 **类**的声明按照“帕斯卡命名法”,例如:`class MyClass` 或 `class DbOracle`等。
8。**类文件**要求以`.class.php`为后缀,使用驼峰法命名,并且首字母大写,例如 `DbMysql.class.php`。
9。通常下划线开头的方法属于**私有方法**:`_parseType`。
10。**方法**的命名使用“驼峰法”,或者使用下划线“_”连接,例如 `getUserName`。
11。**函数**的命名使用小写字母和下划线的方式,例如 `get_client_ip`。
12。**属性**的命名使用驼峰法,并且首字母小写或者使用下划线“`_`”,例如 `tableName`、`_instance`,通常下划线开头的属性属于**私有属性**;
以双下划线“`__`”打头的函数或方法作为**魔法方法**,例如 `__call` 和 `__autoload`。
13。**常量**以大写字母和下划线命名,例如 ``HAS_ONE``和 `MANY_TO_MANY`。
14。类的**命名空间**地址和所在的路径地址一致,例如`Home\Controller\UserController`类所在的路径应该是`Application/Home/Controller/UserController.class.php`。
15。**配置参数**以大写字母和下划线命名,例如`HTML_CACHE_ON`。
16。**语言变量**以大写字母和下划线命名,例如`MY_LANG`。以下划线打头的语言变量通常用于**系统语言变量**,例如 `_CLASS_NOT_EXIST_`,
没有强制的规范,可以根据团队规范来进行。
17。**类名和文件名一致**(包括上面说的大小写一致),程序中所有的类名唯一,例如`UserController`类的文件命名是`UserController.class.php`, ``InfoModel``类的文件名是`InfoModel.class.php`, 并且不同的类库的类命名有一定的规范。
~~~
//类统一采用:DemoTest.class.php
//接口统一采用:DemoTest.interface.php
//其他按照各自的方式:demoTest.{style}.php
~~~
18。**数据表和字段**采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段是正确写法,类似 _username 这样的数据表字段可能会被过滤。
19。确保文件的命名和调用大小写一致,是由于在**类Unix系统上面,对大小写是敏感的**;
20。**PHP关键词**及系统函数全部小写,`false/true/null`也全部小写。
21。所有的PHP程序**代码块标记**均使用`<?php`,(短标签容易和xml混淆,php从5.4开始默认不支持短标记)。
22。对于只有php的代码文件,建议省略结尾处的‘`?>`’。这是为了防止多余的空格或其他字符影响到代码。
23、**抽象类**应以Abstract开头。
24。**接口**命名规则:
i)采用和类相同的命名规则,但在其命名前加‘`i`’字符,表示接口。如:iDataBase。
ii)尽量保持和实现它的类名一致。
接口文件可使用“iDatabase.interface.php”命名。
**25、程序中所有类名唯一。**
书写规则
最后更新于:2022-04-01 06:04:21
[TOC]
# 1、缩进
使用4个空格作为缩进,而不使用tab缩进。
4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。
一个制表符等于8个空格(而非4个),所以在某些编辑器中,需要特别指定一下制表符的长度为4(UltraEdit),而在某些编辑器中,会将制表符转换为空格。
# 2、大括号{}书写规则
`{` 直接跟在控制语句之后,不换行,如:
~~~
for ( $i=0;$i<$count;$i++ ) {
echo 'test';
}
~~~
# 3、小括号()和函数、关键词等
小括号、关键词和函数遵循以下规则:
a.不要把小括号和关键词紧贴在一起,要用一个空格间隔;如`if ( $a<$b ); `
b.小括号和函数名间没有空格;如`$test = date("ymdhis");`
c.除非必要,不要在``return``返回语句中使用小括号。 如`return $a;`。
# 4、=符号书写
在程序中=符号的书写遵循以下规则:
a.在=符号的两侧,均需留出一个空格;如 `$a = $b` 、`$a = 'test'`等;
b.在=符号与!、=、<、>等符号相邻时,不需留一个空格;如 `if ( $a == $b )` 、`if ( $a != $b )` 等;
c.在一个申明块,或者实现同样功能的一个块中,要求=号尽量上下对其,左边可以为了保持对齐使用多个空格,而右边要求空一个空格;如下例:
~~~
$testa = $aaa;
$testaa = $bbb;
$testaaa = $ccc;
~~~
# 5、if else swith for while等书写
对于控制结构的书写遵循以下规则:
a.在if条件判断中,如果用到常量判断条件,将常量放在等号或不等号的左边,例如:`if ( 6 == $errorNum )` ,因为如果你在等式中漏了一个等号,语法检查器会为你报错,可以很快找到错误位置,这样的写法要注意;
b.`switch`结构中必须要有`default`块;
c.在 `for` 和 `wiile` 的循环使用中,要警惕 `continue`、 `break` 的使用,避免产生类似 `goto` 的问题。
# 6、语句断行
在代码书写中,遵循以下原则:
a.尽量保证程序语句一行就是一句,而不要让一行语句太长产生折行;
b.尽量不要使一行的代码太长,一般控制在120个字符以内;
c.如果一行代码太长,请使用类似 .= 的方式断行书写;
d.对于执行数据库的sql语句操作,尽量不要在函数内写sql语句,而先用变量定义sql语句,然后在执行操作的函数中调用定义的变量。
例子:
~~~
$sql = 'SELECT username,password,address,age,postcode FROM test_t ';
$sql .= ' WHERE username=\'aaa\'';
$res = mysql_query($sql);
~~~
##7、数字
一个在源代码中使用了的赤裸裸的数字是不可思议的数字,因为包括作者,在三个月内,没人知道它的含义。例如:
~~~
if ( 22 == $foo ) {
start_thermo_nuclear_war();
} elseif ( 19 == $foo){
refund_lotso_money();
} else {
cry_cause_in_lost();
}
~~~
你应该用`define()`来给你想表示某样东西的数值一个真正的名字,而不是采用赤裸裸的数字,例如:
~~~
define('PRESIDENT_WENT_CRAZY', '22');
define('WE_GOOFED', '19');
define('THEY_DIDNT_PAY', '16');
if ( PRESIDENT_WENT_CRAZY == $foo ) {
start_thermo_nuclear_war();
} elseif ( WE_GOOFED == $foo){
refund_lotso_money();
} elseif ( THEY_DIDNT_PAY == $foo ){
infinite_loop();
} else {
cry_cause_in_lost();
}
~~~
# 8、判断
遵循以下规则:
a.不能使用 1/0 代替` true/false`,在 PHP 中,这是不相等的;
b.不要使用非零的表达式、变量或者方法直接进行 `true/false` 判断,而必须使用严格的完整 `true/false` 判断;
如:不使用 `if ( $a )` 或者 `if ( checka() )` 而使用 ``if ( FALSE != $a )`` 或者 `if ( FALSE != check() )`。
##9、避免嵌入赋值
在程序中避免下面例子中的嵌入式赋值:
不使用这样的方式:
```php
while ( $a != ( $c = getchar() ) ) {
process the character
}
```
# 10、习惯与约定
通常变量的命名应该是有意义的单词,但在循环体中临时变量采用“IN规则”。
IN规则原本来自FORTRAN,在FORTRAN中,以字母表中I~N范围内字母开头的变量默认为整型变量。循环体中一般是整型变量,故习惯用I~N字母作为循环体中的变量命名。同时,I是标识符(Identify)首字母。如下:
```php
function bubble_sort($array){
$count = count($array);
for($i=0;$i<$count; $s++){
for($j=$count-1;$j<$i;$j--){
if($array[$j]<$array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
```
PHP
最后更新于:2022-04-01 06:04:18
>参考:[PHP 开发规范](http://www.kancloud.cn/itsky71/php-standard/135/)
技术部php开发规范将参照PEAR的规范,基本采用PEAR指定的规范,在其基础上增加、修改或删除部分适合具体开发环境的规范。
本规范包含了PHP开发时程序编码中命名规范、代码缩进规则、控制结构、函数调用、函数定义、注释、包含代码、PHP标记、文件头的注释块、URL样例、常量命名等方面的规则。
* * * * *
在开头就提到编码规范的目的是提高工作效率,保证开发的有效性和合理性,并最大程度提高程序代码的可读性和可重复利用性,减少返工,提高沟通效率。好的代码风格,见代码如见人,读代码时就好像和作者本人在亲切交谈。
PHP是一门脚本语言,用于网站开发,和JavaScript类似,本身就是一门不严谨的语言,有人评价PHP是“dirty and fast language”(脏而快的开发语言),所以规范显得更重要。
最后要说明的是,本规范不是强制,也不是标准。“约定大于规范”,如果有的规范太死板,不适应你所在团队,你可以不采用,而是按照自己的规范进行。
强烈建议使用大型的IDE进行代码开发和管理,并使用合适的版本控制软件。
JavaScript 编程风格
最后更新于:2022-04-01 06:04:16
[TOC]
[Google JavaScript代码风格指南](http://keleyi.com/ziliao/googlejavascriptstyle.htm)
最流行的JavaScript代码规范
最后更新于:2022-04-01 06:04:14
什么是最佳的JavaScript代码编程规范?这可能是一个众口难调的问题。那么,不妨换个问题,什么代码规范最流行?
[sideeffect.kr](http://segmentfault.com/a/1190000000410316#)通过分析GitHub上托管的开源代码,得出了一些[有趣的结果](http://sideeffect.kr/popularconvention#javascript)。一起来看看吧。
![document/2015-09-12/55f2fbcfd26af](http://box.kancloud.cn/document_2015-09-12_55f2fbcfd26af.png)
**行末逗号**:
~~~
var foo = 1,
bar = 2,
baz = 3;
var obj = {
foo: 1,
bar: 2,
baz: 3
};
~~~
**空格缩进**:
~~~
这年头大家都爱用空格了。使用空格缩进可以保证不同的开发者、不同的编辑器设置下看到的结果是一样的。
空格,81.1 %;Tab,18.9 %。(基于2,019,550次提交统计。)
~~~
**函数名称后无空格**:
~~~
function foo() {
return "bar";
}
~~~
**函数参数与括号间无空格**:
~~~
function fn(arg1, arg2) {
//or
if (true) {
~~~
**对象字面量的冒号后加空格,冒号前不加**:
~~~
{
foo: 1,
bar: 2,
baz: 3
}
~~~
**条件语句关键字后加空格**:
~~~
if (true) {
//...
}
while (true) {
//...
}
switch (v) {
//...
}
~~~
**单引号、双引号**:
`单引号,56.791 %;双引号,43.209 %。(基于1,705,910次提交。)`
编程注意
最后更新于:2022-04-01 06:04:11
## 分号
分号表示语句的结束。大多数情况下,如果你省略了句尾的分号,Javascript会自动添加。
> **不要省略句末的分号。**
## with语句
with可以减少代码的书写,但是会造成混淆。
> **不要使用with语句。**
## 相等和严格相等
Javascript有两个表示"相等"的运算符:"相等"(==)和"严格相等"(===)。
> **不要使用"相等"(==)运算符,只使用"严格相等"(===)运算符。**
## 全局变量
Javascript最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。
>**避免使用全局变量;如果不得不使用,用大写字母表示变量名,比如UPPER_CASE。**
## Javascript会自动将变量声明"提升"(hoist)到代码块(block)的头部。
> **所有变量声明都放在函数的头部。
规则10:所有函数都在使用之前定义。**
## 自增和自减运算符
自增(++)和自减(--)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。
事实上,所有的++运算符都可以用"+= 1"代替。
>**不要使用自增(++)和自减(--)运算符,用+=和-=代替。**
## 区块
如果循环和判断的代码体只有一行,Javascript允许该区块(block)省略大括号。
>**总是使用大括号表示区块。**
## new命令
Javascript使用new命令,从建构函数生成一个新对象。
```js
var o = new myObject();
```
这种做法的问题是,一旦你忘了加上new,myObject()内部的this关键字就会指向全局对象,导致所有绑定在this上面的变量,都变成全部变量。
如果不得不使用new,为了防止出错,最好在视觉上把建构函数与其他函数区分开来。
>**不要使用new命令,改用Object.create()命令。
建构函数的函数名,采用首字母大写(InitialCap);其他函数名,一律首字母小写。**
注释规范
最后更新于:2022-04-01 06:04:09
[TOC]
# 推荐参考 [JSDoc](http://usejsdoc.org/ )
## 什么是JSDoc
JSDoc是一个根据javascript文件中注释信息,生成JavaScript应用程序或库、模块的API文档 的工具。你可以使用他记录如:命名空间,类,方法,方法参数等。类似JavaDoc和PHPDoc。现在很多编辑器或IDE中还可以通过JSDoc直接或使用插件生成智能提示。从而使开发者很容易了解整个类和其中的属性和方法,并且快速知道如何使用,从而提高开发效率,降低维护成本。
## 使用JSDoc
JSDoc本质是代码注释,所以使用起来非常方便,但是他有一定的格式和规则,只要了解这些,那么后面的事情,比如生产文档,生成智能提示都可以通过工具来完成。
## 注释规范
目前脚本、样式的注释格式都有一个已经成文的约定规范,最初是YUI Compressor制定。
~~~
/**
* 这里的注释内容【会】被压缩工具压缩
*/
/*!
* 这里的注释内容【不会】被压缩工具压缩
* 与上面一个注释块不同的是,第2个*换成了!
*/
~~~
其中说到这里说到的压缩工具有[YUI Compressor](http://yui.github.io/yuicompressor/) 、[Google Closure Compiler](http://code.google.com/closure/compiler/)、[gulp-uglify](https://github.com/terinjokes/gulp-uglify)、[grunt-contrib-uglify](https://github.com/gruntjs/grunt-contrib-uglify)等,这些压缩工具都支持以上的压缩约定。常常把文件的关键信息放在第2种注释内容里,如文件名称、版本号、作者等。
关于这些关键信息,都由一些关键词和一定的格式来书写。关键词书写格式为:
使用`@key desc`格式来书写,常用的关键词有:
<table>
<thead>
<tr>
<th>关键词</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@auhor</code></td>
<td>作者</td>
</tr>
<tr>
<td><code>@param</code></td>
<td>参数</td>
</tr>
<tr>
<td><code>@example</code></td>
<td>示例</td>
</tr>
<tr>
<td><code>@link</code></td>
<td>链接</td>
</tr>
<tr>
<td><code>@namespace</code></td>
<td>命名空间</td>
</tr>
<tr>
<td><code>@requires</code></td>
<td>依赖模块</td>
</tr>
<tr>
<td><code>@return</code></td>
<td>返回值</td>
</tr>
<tr>
<td><code>@version</code></td>
<td>版本号</td>
</tr>
</tbody>
</table>
其中,param关键词的格式为:
```
/**
* @param {String} 参数描述
*/
```
> 参考资料
YUI Compressor注释规范:http://yui.github.io/yuidoc/syntax/
JSDOC:http://usejsdoc.org/
FED文章:http://frontenddev.org/article/sublime-does-text-3-plug-in-docblockr-with-javascript-comments-specification.html
JavaScript
最后更新于:2022-04-01 06:04:07
[TOC]
# 命名
1. 变量命名只允许有字母、数字、`$`和`_`下划线。
2. javascript 的变量和其他语法元素名都是区分大小写。
3. 使用jQuery对象时候,使用`$var`的形式,让人很明白这是jQuery的对象(虽然有些库也会使用`$`),虽然W3school不推荐:变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)
4. [浅谈 JavaScript 编程语言的编码规范](http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/)
# 遵行惯用法:
1. 注释符号 `//` 后应该空一格;
2. 防止变量提升,应先声明后使用(JSHint 会提醒出 `_height` 存在变量提升以及定义后未使用的错误);
3. 不应该使用硬编码,并且重复几次( ID 后缀名可以定义到常量里,用大写字母);
4. 不应该有两个配置属性,含义不明(`this.opts` 和 `this._options`);
5. 若两次以上引用同一对象的属性,应该定义到局部变量再引用(`var options = this._options`);
6. 不应该同时使用两种属性命名风格(`colModel` 和 `table_body`);
7. 局部变量名应该尽可能短,而方法名应该尽可能完整(不应该同时即有 fromatTpl 又有 parseTemplate);
8. 局部变量名不需要用下划线开头,仅对象私有属性和私有方法有此必要;变量名不需要带类型属性(`_thdoms` 叫 `ths` 就好);
9. 使用 JavaScript 时,for 循环基本可以避免(比如 jQuery 有 `$.each`, `$.map`,`$.filter`, `$.grep` 等等高阶函数可用);
10. jQuery 对象名习惯以 `$` 开头,以便区分 DOM 对象;jQuery 查询应尽量使用 context (如 `this.$table = $('table', this.$element)` );
11. jQuery DOM 操作和原生 DOM 操作不应该混用(已经使用 jQuery 的情况,就应该坚持使用 jQuery 来操作 DOM,避免丑陋的原生操作);
12. DOM 元素构造出来,也不应该再到文档中查询一遍了(图上的构造太复杂,一眼真看不懂);
*****
Code Review 把程序写正确还只是跨出了第一步。把代码交给你的同事和朋友 review,这是学习经验、共同提高 最快的办法。
HTML/CSS开发规范指南
最后更新于:2022-04-01 06:04:05
> 参考:https://github.com/doyoe/html-css-guide
# HTML/CSS开发规范指南
## 目录
[TOC]
## 规范概述
规范的制定是我们长期以来对工作的积累与沉淀的产物,帮助我们更快、更好、更高效的完成繁重、复杂、多样化的任务,我们制作规范的主要目的在于:
* 降低每个组员介入项目的门槛成本;
* 提高工作效率及协同开发的便捷性;
* 高度统一的代码风格;
* 提供一整套HTML、CSS解决方案,来帮助开发人员快速做出高质量的符合要求的页面。
<a name="profile"></a>
## 基本信息
规范名称 | Cook
--------|------|
当前版本 | v1.0 beta
规范发起 | [杜瑶(@doyoe)](http://weibo.com/doyoe)
参与人群 | Qunar FED
最后更新 | 2015.03.20
<a name="general"></a>
## 通用约定
<a name="directory"></a>
### 1.文档目录结构
```
|-- 项目名
|-- src 开发环境
|-- html 静态页面模板目录
|-- bgimg 背景图目录(假设有的话)
|-- image 前景图目录(假设有的话)
|-- font 字体目录(假设有的话)
|-- scripts 脚本目录
|-- styles(Yo) 样式目录
|-- lib 基础库
|-- core 核心代码:reset
|-- element 元素
|-- fragment 公用碎片
|-- layout 布局
|-- widget 组件
|-- usage 项目具体实现
|-- project 某个子项目
|-- core 核心代码:桥接lib中的core,可以进行项目级扩展
|-- fragment 项目公用碎片
|-- module 模块
|-- page page桥接文件目录:src-list
|-- export page pack之后的文件目录
|-- prd 生产环境
|-- bgimg 背景图目录(假设有的话)
|-- image 前景图目录(假设有的话)
|-- font 字体目录(假设有的话)
|-- scripts 脚本目录
|-- styles(Yo) 样式目录
|-- project1 子项目
|-- index.css
|-- login.css
|-- and etc...
|-- project2 子项目
|-- index.css
|-- login.css
|-- and etc...
|-- and etc...
```
> `src`, `scripts`, `styles` 三个目录是为了和现有项目保持一致,避免修改过大,所以保持不变。
> `html` 目录,用于存放前端开发做的静态页面,以备查阅、备份、review或给后端套页面。
> `bgimg`, `image`, `font` 三个目录在Qunar一般不会直接存在,因为我们有source服务器,这些资源都会在那上面管理;不过特殊情况也会有,比如一些独立的项目,没有使用source的,那么就需要遵循这样的目录划分。
> 至于 `html`, `bgimg`, `image`, `font` 这几个目录为什么没有加 `s`,主要是因为不希望大家去想某个目录是否为复数,简单点就好。
> `prd` 为生产环境目录,以 `xxx` 项目中的一个子项目 `mobile` 为例,其生产环境中的某个CSS外链大致如下:`//sitename.com/prd/styles/mobile/index.css`
<a name="separate"></a>
### 2.分离
结构(HTML)、表现(CSS)、行为分离(JavaScript)
> 将结构与表现、行为分离,保证它们之间的最小耦合,这对前期开发和后期维护都至关重要。
<a name="file-name"></a>
### 3.文件命名
* CSS模块文件,其文件名必须与模块名一致;
假定有这样一个模块:
.m-detail { sRules; }
.m-detail-hd { sRules; }
.m-detail-bd { sRules; }
.m-detail-ft { sRules; }
> 那么该模块的文件名应该为:`m-detail.css`
* CSS页面文件,其文件名必须与HTML文件名一致;
> 假定有一个HTML页面叫 `product.html`,那么其相对应的CSS页面文件名应该为:`product.css`
> 假定现在有一个 `product.html`,里面有2个模块:
+<section class="m-list">
+<section class="m-info">
那么开发人员能快速找到与该页面相关的3个直接CSS文件,包括:`product.css`, `m-list.css`, `m-info.css`
<a name="indentation"></a>
### 4.缩进
使用tab(4个空格宽度)来进行缩进,可以在IDE里进行设置
<a name="encoding"></a>
### 5.编码
* 以 UTF-8 无 BOM 编码作为文件格式;
* 在HTML中文档中用 `<meta charset="utf-8" />` 来指定编码;
* 为每个CSS文档显示的定义编码,在文档首行定义 `@charset "utf-8";`
> 在 Sass 中,如果文档中出现中文,却未显示定义编码,将会编译出错,为了统一各种写法,且提前规避错误几率,统一要求每个CSS文档都需要定义编码
<a name="lowercase"></a>
### 6.小写
* 所有的HTML标签必须小写;
* 所有的HTML属性必须小写;
* 所有的样式名及规则必须小写。
<a name="comment"></a>
### 7.注释
尽可能的为你的代码写上注释。解释为什么要这样写,它是新鲜的方案还是解决了什么问题。
<a name="todo"></a>
### 8.待办事项
用 TODO 标示待办事项和正在开发的条目
<!-- TODO: 图文混排 -->
<div class="g-imgtext">
<img src="1.png" alt="" />
...
/* TODO: 图文混排 comm: g-imgtext */
.g-imgtext { sRules; }
<a name="end-line-space"></a>
### 9.行尾空格
删除行尾空格,这些空格没有必要存在
<a name="protocol-relative-url"></a>
### 10.省略嵌入式资源协议头
省略图像、媒体文件、样式表和脚本等URL协议头部声明 ( http: , https: )。如果不是这两个声明的URL则不省略。
省略协议声明,使URL成相对地址,防止内容混淆问题和导致小文件重复下载(这个主要是指http和https交杂的场景中)。
不推荐:
<script src="http://www.google.com/js/gweb/analytics/autotrack.js"></script>
推荐:
<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>
不推荐:
```
.example {
background: url(http://www.google.com/images/example);
}
```
推荐:
```
.example {
background: url(//www.google.com/images/example);
}
```
> 注:省略协议头在IE7-8下会有一点小问题,外部CSS文件(link和@import)会被下载两遍,所以该条目的约定看具体项目。
<a name="validator"></a>
### 11.代码有效性
* 使用 [W3C HTML Validator](http://validator.w3.org/) 来验证你的HTML代码有效性;
* 使用 [W3C CSS Validator](http://jigsaw.w3.org/css-validator/) 来验证你的CSS代码有效性。
> 代码验证不是最终目的,真的目的在于让开发者在经过多次的这种验证过程后,能够深刻理解到怎样的语法或写法是非标准和不推荐的,即使在某些场景下被迫要使用非标准写法,也可以做到心中有数。
<a name="html"></a>
## HTML约定
<a name="doctype"></a>
### 1.文档类型
* 统一使用HTML5的标准文档类型:`<!DOCTYPE html>`;
> HTML5文档类型具备前后兼容的特质,并且易记易书写
* 在文档doctype申明之前,不允许加上任何非空字符;
> 任何出现在doctype申明之前的字符都将使得你的HTML文档进入非标准模式
* 不允许添加 `<meta>` 标签强制改变文档模式。
> 避免出现不可控的问题
<a name="type"></a>
### 2.省略type属性
在调用CSS和JavaScript时,可以将type属性省略不写
不允许:
<link type="text/css" rel="stylesheet" href="base.css" />
<script type="text/javascript" src="base.js"></script>
应该:
<link rel="stylesheet" href="base.css" />
<script src="base.js"></script>
> 因为HTML5在引入CSS时,默认type值为text/css;在引入JavaScript时,默认type值为text/javascript
<a name="attribute"></a>
### 3.省略属性值
非必须属性值可以省略
不允许:
<input type="text" readonly="readonly" />
<input type="text" disabled="disabled" />
应该:
<input type="text" readonly />
<input type="text" disabled />
> 这里的 readonly 和 disabled 属性的值是非必须的,可以省略不写,我们知道HTML5表单元素新增了很多类似的属性,如: required
<a name="quots"></a>
### 4.用双引号包裹属性值
所有的标签属性值必须要用双引号包裹,同时也不允许有的用双引号,有的用单引号的情况
不允许:
<a href=http://www.qunar.com class=home>去哪儿网</a>
应该:
<a href="http://www.qunar.com" class="home">去哪儿网</a>
<a name="nest"></a>
### 5.嵌套
所有元素必须正确嵌套
* 不允许交叉;
不允许:
<span><dfn>交叉嵌套</span></dfn>
应该:
<span><dfn>交叉嵌套</dfn></span>
* 不允许非法的子元素嵌套。
不允许:
<ul>
<h3>xx列表</h3>
<li>asdasdsdasd</li>
<li>asdasdsdasd</li>
</ul>
应该:
<div>
<h3>xx列表</h3>
<ul>
<li>asdasdsdasd</li>
<li>asdasdsdasd</li>
</ul>
</div>
* 不推荐inline元素包含block元素;
不推荐:
<span>
<h1>这是一个块级h1元素</h1>
<p>这是一个块级p元素</p>
</span>
推荐:
<div>
<h1>这是一个块级h1元素</h1>
<p>这是一个块级p元素</p>
</div>
> 规则可参考:
> HTML4/XHTML1.0 Strict: [嵌套规则](http://www.cs.tut.fi/~jkorpela/html/strict.html)。
>
> HTML5: [嵌套规则](http://www.w3.org/TR/html5/)
>
> 举个例子,在HTML5中,a元素同时属于 Flow content, Phrasing content, Interactive content, Palpable content 4个分类,那些子元素是 phrasing 元素的元素可以是 a 的父元素,a 允许的子元素是以它的父元素允许的子元素为准,但不能包含 interactive 元素。
<a name="close-tag"></a>
### 6.标签闭合
所有标签必须闭合
不允许:
<div>balabala...
<link rel="stylesheet" href="*.css">
应该:
<div>balabala...</div>
<link rel="stylesheet" href="*.css" />
> 虽然有些标记没有要求必须关闭,但是为了避免出错的几率,要求必须全部关闭,省去判断某标记是否需要关闭的时间
<a name="perceivable"></a>
### 7.多媒体替代方案
* 为img元素加上alt属性;
* 为视频内容提供音轨替代;
* 为音频内容提供字母替代等等。
不推荐:
<img src="banner.jpg" />
推荐:
<img src="banner.jpg" alt="520即将到来,爱就大声说出来" />
> alt属性的内容为对该图片的简要描述,这对于盲人用户和图像损毁都非常有意义,即无障碍。对于纯粹的装饰性图片,alt属性值可以留空,如 alt=""
<a name="friendly"></a>
### 8.有效操作
为表单元素label加上for属性
不允许:
<input type="radio" name="color" value="0" /><label>蓝色</label>
<input type="radio" name="color" value="1" /><label>粉色</label>
应该:
<input type="radio" id="blue" name="color" value="0" /><label for="blue">蓝色</label>
<input type="radio" id="pink" name="color" value="1" /><label for="pink">粉色</label>
> for属性能让点击label标签的时候,同时focus到对应的 input 和 textarea上,增加响应区域
<a name="html-comment"></a>
### 9.按模块添加注释
在每个模块开始和结束的地方添加注释
<!-- 新闻列表模块 -->
<div class="m-news g-mod"
...
<!-- /新闻列表模块 -->
<!-- 排行榜模块 -->
<div class="m-topic g-mod"
...
<!-- /排行榜模块 -->
> 注释内容左右两边保留和注释符号有1个空格位,在注释内容内不允许再出现中划线“-”,某些浏览器会报错。
>
> 注释风格保持与原生HTML的语法相似:成对出现 `<!-- comment --><!-- /comment -->`
<a name="format"></a>
### 10.格式
* 将每个块元素、列表元素或表格元素都放在新行;
* inline元素视情况换行,以长度不超过编辑器一屏为宜;
* 每个子元素都需要相对其父级缩进(参见[缩进约定](#indentation))。
不推荐:
<div><h1>asdas</h1><p>dff<em>asd</em>asda<span>sds</span>dasdasd</p></div>
推荐:
<div>
<h1>asdas</h1>
<p>dff<em>asd</em>asda<span>sds</span>dasdasd</p>
</div>
<a name="semantic"></a>
### 11.语义化标签
* 根据HTML元素的本身用途去使用它们;
* 禁止使用被废弃的用于表现的标签,如 center, font 等;
* 部分在XHTML1中被废弃的标签,在HTML5中被重新赋予了新的语义,在选用时请先弄清其语义,如:b, i, u等。
不允许:
<p>标题</p>
应该:
<h1>标题</h1>
> 虽然使用p标签,也可以通过CSS去定义它的外观和标题相同,但p标签本身的并不是表示标题,而是表示文本段落
> 参阅:[HTML5 Elements](http://www.w3.org/TR/html5/)
<a name="html-module"></a>
### 12.模块化
* 每个模块必须有一个模块名;
* 每个模块的基本组成部分应该一致;
* 模块的子节点类名需带上模块名(防止模块间嵌套时产生不必要的覆盖);
* 孙辈节点无需再带模块名。
代码如:
<section class="m-detail">
<header class="m-detail-hd">
<h1 class="title">模块标题</h1>
</header>
<div class="m-detail-bd">
<p class="info">一些实际内容</p>
</div>
<footer class="m-detail-ft">
<a href="#" class="more">更多</a>
</footer>
</section>
> 其中 `.m-detail-hd`, `.m-detail-bd`, `.m-detail-ft` 为可选,视具体模块情况决定是否需要抽象为这种 **头,中,尾** 的结构
<a name="css"></a>
## CSS约定
<a name="link"></a>
### 1.文件引用
* 一律使用link的方式调用外部样式
* 不允许在页面中使用 `<style>` 块;
* 不允许在 `<style>` 块中使用 `@import`;
* 不允许使用 `style` 属性写行内样式。
> 一般情况下,在页面中只允许使用 `<link />` 标签来引用CSS文件,
<a name="element"></a>
### 2.命名-组成元素
* 命名必须由单词、中划线①或数字组成;
* 不允许使用拼音(约定俗成的除外,如:youku, baidu),尤其是缩写的拼音、拼音与英文的混合。
不推荐:
.xiangqing { sRules; }
.news_list { sRules; }
.zhuti { sRules; }
推荐:
.detail { sRules; }
.news-list { sRules; }
.topic { sRules; }
> ①我们使用中划线 “-” 作为连接字符,而不是下划线 "_"。
>
> 我们知道2种方式都有不少支持者,但 "-" 能让你少按一次shift键,并且更符合CSS原生语法,所以我们只选一种目前业内普遍使用的方式
<a name="word"></a>
### 3.命名-词汇规范
* 不依据表现形式来命名;
* 可根据内容来命名;
* 可根据功能来命名。
不推荐:
left, right, center, red, black
推荐:
nav, aside, news, type, search
<a name="abbr"></a>
### 4.命名-缩写规范
* 保证缩写后还能较为清晰保持原单词所能表述的意思;
* 使用业界熟知的或者约定俗成的。
不推荐:
navigation => navi
header => head
description => des
推荐:
navigation => nav
header => hd
description => desc
<a name="prefix"></a>
### 5.命名-前缀规范
前缀|说明|示例
---|---|---|
g-|全局通用样式命名,前缀g全称为global,一旦修改将影响全站样式|g-mod
m-|模块命名方式|m-detail
ui-|组件命名方式|ui-selector
js-|所有用于纯交互的命名,不涉及任何样式规则。JSer拥有全部定义权限|js-switch
* 选择器必须是以某个前缀开头
不推荐:
.info { sRules; }
.current { sRules; }
.news { sRules; }
> 因为这样将给我们带来不可预知的管理麻烦以及沉重的历史包袱。你永远也不会知道哪些样式名已经被用掉了,如果你是一个新人,你可能会遭遇,你每定义个样式名,都有同名的样式已存在,然后你只能是换样式名或者覆盖规则。
推荐:
.m-detail .info { sRules; }
.m-detail .current { sRules; }
.m-detail .news { sRules; }
> 所有的选择器必须是以 g-, m-, ui- 等有前缀的选择符开头的,意思就是说所有的规则都必须在某个相对的作用域下才生效,尽可能减少全局污染。
js- 这种级别的className完全交由JSer自定义,但是命名的规则也可以保持跟重构一致,比如说不能使用拼音之类的
<a name="id"></a>
### 6.id与class
重构工程师只允许使用class(因历史原因及大家的习惯做出妥协)。
<a name="packaging"></a>
### 7.书写格式
* 选择器与大括号之间保留一个空格;
* 分号之后保留一个空格;
* 逗号之后保留一个空格;
* 所有规则需换行;
* 多组选择器之间需换行。
不推荐:
main{
display:inline-block;
}
h1,h2,h3{
margin:0;
background-color:rgba(0,0,0,.5);
}
推荐:
main {
display: inline-block;
}
h1,
h2,
h3 {
margin: 0;
background-color: rgba(0, 0, 0, .5);
}
<a name="semicolon"></a>
### 8.规则与分号
每条规则结束后都必须加上分号
不推荐:
body {
margin: 0;
padding: 0;
font-size: 14px
}
推荐:
body {
margin: 0;
padding: 0;
font-size: 14px;
}
<a name="unit"></a>
### 9.0与单位
如果属性值为0,则不需要为0加单位
不推荐:
body {
margin: 0px;
padding: 0px;
}
推荐:
body {
margin: 0;
padding: 0;
}
<a name="decimal"></a>
### 10.0与小数
如果是0开始的小数,前面的0可以省略不写
不推荐:
body {
opacity: 0.6;
text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);
}
推荐:
body {
opacity: .6;
text-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
}
<a name="non-quotes"></a>
### 11.去掉uri中引用资源的引号
不要在url()里对引用资源加引号
不推荐:
body {
background-image: url("sprites.png");
}
@import url("global.css");
推荐:
body {
background-image: url(sprites.png);
}
@import url(global.css);
<a name="hex"></a>
### 12.HEX颜色值写法
* 将所有的颜色值小写;
* 可以缩写的缩写至3位。
不推荐:
body {
background-color: #FF0000;
}
推荐:
body {
background-color: #f00;
}
<a name="order"></a>
### 13.属性书写顺序
* 遵循先布局后内容的顺序。
```
.g-box {
display: block;
float: left;
width: 500px;
height: 200px;
margin: 10px;
padding: 10px;
border: 10px solid;
background: #aaa;
color: #000;
font: 14px/1.5 sans-serif;
}
```
> 这个应该好理解,比如优先布局,我们知道布局属性有 display, float, overflow 等等;内容次之,比如 color, font, text-align 之类。
* 组概念。
拿上例的代码来说,如果我们还需要进行定位及堆叠,规则我们可以改成如下:
```
.g-box {
display: block;
position: relative;
z-index: 2;
top: 10px;
left: 100px;
float: left;
width: 500px;
height: 200px;
margin: 10px;
padding: 10px;
border: 10px solid;
background: #aaa;
color: #000;
font: 14px/1.5 sans-serif;
}
```
> 从代码中可以看到,我们直接将z-index, top, left 紧跟在 position 之后,因为这几个属性其实是一组的,如果去掉position,则后3条属性规则都将失效。
* 私有属性在前标准属性在后
```
.g-box {
-webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
-moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
-o-box-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
box-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
}
```
> 当有一天你的浏览器升级后,可能不再支持私有写法,那么这时写在后面的标准写法将生效,避免无法向后兼容的情况发生。
<a name="css-comment"></a>
### 14.注释规范
保持注释内容与星号之间有一个空格的距离
**普通注释(单行)**
/* 普通注释 */
**区块注释**
/**
* 模块: m-detail
* 描述:酒店详情模块
* 应用:page detail, info and etc...etc
*/
> 有特殊作用的规则一定要有注释说明
> 应用了高级技巧的地方一定要注释说明
<a name="hack"></a>
### 15.hack规范
* 尽可能的减少对Hack的使用和依赖,如果在项目中对Hack的使用太多太复杂,对项目的维护将是一个巨大的挑战;
* 使用其它的解决方案代替Hack思路;
* 如果非Hack不可,选择稳定且常用并易于理解的。
```
.test {
color: #000; /* For all */
color: #111\9; /* For all IE */
color: #222\0; /* For IE8 and later, Opera without Webkit */
color: #333\9\0; /* For IE8 and later */
color: #444\0/; /* For IE8 and later */
*color: #666; /* For IE7 and earlier */
_color: #777; /* For IE6 and earlier */
}
```
* 严谨且长期的项目,针对IE可以使用条件注释作为预留Hack或者在当前使用
IE条件注释语法:
<!--[if <keywords>? IE <version>?]>
<link rel="stylesheet" href="*.css" />
<![endif]-->
语法说明:
```
<keywords>
if条件共包含6种选择方式:是否、大于、大于或等于、小于、小于或等于、非指定版本
是否:指定是否IE或IE某个版本。关键字:空
大于:选择大于指定版本的IE版本。关键字:gt(greater than)
大于或等于:选择大于或等于指定版本的IE版本。关键字:gte(greater than or equal)
小于:选择小于指定版本的IE版本。关键字:lt(less than)
小于或等于:选择小于或等于指定版本的IE版本。关键字:lte(less than or equal)
非指定版本:选择除指定版本外的所有IE版本。关键字:!
```
```
<version>
目前的常用IE版本为6.0及以上,推荐酌情忽略低版本,把精力花在为使用高级浏览器的用户提供更好的体验上,另从IE10开始已无此特性
```
<a name="low-selector"></a>
### 16.避免低效率选择器
* 避免类型选择器
不允许:
div#doc { sRules; }
li.first { sRules; }
应该:
#doc { sRules; }
.first { sRules; }
> CSS选择器是由右到左进行解析的,所以 div#doc 本身并不会比 #doc 更快
* 避免多id选择器
不允许:
#xxx #yyy { sRules; }
应该:
#yyy { sRules; }
<a name="override"></a>
### 17.属性缩写与分拆
* 无继承关系时,使用缩写
不推荐:
```
body {
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
}
```
推荐:
```
body {
margin: 10px;
}
```
* 存在继承关系时,使用分拆方式
不推荐:
```
.m-detail {
font: bold 12px/1.5 arial, sans-serif;
}
.m-detail .info {
font: normal 14px/1.5 arial, sans-serif;
}
```
要避免错误的覆盖:
```
.m-detail .info {
font: 14px sans;
}
```
> 如果你只是想改字号和字体,然后写成了上面这样,这是错误的写法,因为 `font` 复合属性里的其他属性将会被重置为 user agent 的默认值,比如 `font-weight` 就会被重置为 `normal`。
推荐:
```
.m-detail {
font: bold 12px/1.5 arial, sans-serif;
}
.m-detail .info {
font-weight: normal;
font-size: 14px;
}
```
> 在存在继承关系的情况下,只将需要变更的属性重定义,不进行缩写,避免不需要的重写的属性被覆盖定义
* 根据规则条数选择缩写和拆分
不推荐:
```
.m-detail {
border-width: 1px;
border-style: solid;
border-color: #000 #000 #f00;
}
```
推荐:
```
.m-detail {
border: 1px solid #000;
border-bottom-color: #f00;
}
```
<a name="css-module"></a>
### 18.模块化
* 每个模块必须是一个独立的样式文件,文件名与模块名一致;
* 模块样式的选择器必须以模块名开头以作范围约定;
假定有一个模块如前文 [HTML模块化](#html-module),那么 `m-detail.scss` 的写法大致如下:
.m-detail {
background: #fff;
color: #333;
&-hd {
padding: 5px 10px;
background: #eee;
.title {
background: #eee;
}
}
&-bd {
padding: 10px;
.info {
font-size: 14px;
text-indent: 2em;
}
}
&-ft {
text-align: center;
.more {
color: blue;
}
}
}
编译之后代码如下:
.m-detail {
background: #fff;
color: #333;
}
.m-detail-hd {
padding: 5px 10px;
background: #eee;
}
.m-detail-hd .title {
background: #eee;
}
.m-detail-bd {
padding: 10px;
}
.m-detail-bd .info {
font-size: 14px;
text-indent: 2em;
}
.m-detail-ft {
text-align: center;
}
.m-detail-ft .more {
color: blue;
}
> 任何超过3级的选择器,需要思考是否必要,是否有无歧义的,能唯一命中的更简短的写法
<a name="img"></a>
## 图像约定
<a name="img-compress"></a>
### 1.图像压缩
所有图片必须经过一定的压缩和优化才能发布
<a name="background-image"></a>
### 2.背景图
* 使用PNG格式而不是GIF格式,因为PNG格式色彩更丰富,还能提供更好的压缩比;
* 在需要兼容IE6的项目中,尽可能选择PNG8,而不是使用PNG24+滤镜。
<a name="image"></a>
### 3.前景图
* 内容图片建议使用JPG,可以拥有更好地显示效果;
* 装饰性图片使用PNG。
<a name="sprite"></a>
### 4.Sprite
* CSS Sprite是一种将数个图片合成为一张大图的技术(既可以是背景图也可以是前景图),然后通过偏移来进行图像位置选取;
* CSS Sprite可以减少http请求。
<a name="end"></a>
## 结语
坚持一致性的原则。
一个团队的代码风格如果统一了,首先可以培养良好的协同和编码习惯,其次可以减少无谓的思考,再次可以提升代码质量和可维护性。
统一的代码风格,团队内部阅读或编辑代码,将会变得非常轻松,因为所有组员都处在一致思维环境中。