美文网首页
2018-08-01

2018-08-01

作者: 玉_宸 | 来源:发表于2018-12-23 22:39 被阅读0次

    规范文档

    1:项目结构

    • 项目大致统一结构--结构规范化
    |————mangerName                             //项目名称
        |————node_modules                       //项目依赖包(通过npm i 或者npm install安装)
        |————src                                //项目文件
        |       |————api                        //与后端交互接口
        |       |————config                        //相关配置文件
        |       |————page                       //html页面文件
        |       |————assets                    //静态文件
        |       |        |————js             //js文件
        |       |        |————css           //css文件
        |       |        |————img           //图片
        |————components                     //组件
        |————plugins                        //插件
        |       |————loadsh                 //js处理数组的插件
        |————utils                                                  //工具文件
        |       |————requset.js     //requset请求方法的封装
        |       |————util.js            //常用方法模块
        |       |————md5.js             //md5加密方法
    

    2:html

    @2-1:语法

    1:用两个空格来代替制表符(tab)
    2:嵌套元素应当缩进一次(即两个空格)
    3:对于属性的定义请使用单引号
    4:不要省略可选的结束标签

    @2-2:结构
    • 合理的结构能够很好的快速了解项目的布局,有利于后期的维护。例如:
    <!DOCTYPE html>
    <html>
    <head>
       <title></title>
    </head>
    <body>
       <!-- 头部容器 -->
       <div class="top-box"></div>
       <!-- 内容容器 -->
       <div class="content-box">
           <!-- 内容标题容器 -->
           <h4 class="title-box"></h4>
           <!-- 详细相关内容容器 -->
           <div class="*-detail-box"></div>
       </div>
       <!-- 底部容器 -->
       <div class="bottom-box"></div>
            <!-- 合理的结构减少代码数量 -->
       <!-- 错误 -->
       <div class="avatar">
           <img src="...">
       </div>
       <!-- 正确 -->
       <img src="">
    </body>
    </html>
    

    容器标签包含-box后缀标识容器标签

    @2-3:属性顺序
    1:class
    2:id,name
    3:data-*
    4:src,for,type,href
    5:title,alt
    6:aria-*,role
    

    例子:

    <a class='...' id='...' data-modal='toggle' href='#'></a>
    <input class='form-control' type='text'>
    <img src='....' alt='...'> 
    
    @2-4:布尔型属性

    H5布尔型属性可以不赋值

    <input type='text' disabled>
    <input type='checkbox' value='1' checked>
    

    3:css

    @3-1:语法
    • 分类式命名法(在前端组件化下尤为重要)

      • 布局(grid)(.g-):将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等!
      • 模块(module)(.m-):通常是一个语义化的可以重复使用的较大的整体!比如导航、登录、注册等
      • 元件(unit)(.u-):通常是一个不可再分的较为小巧的个体,通常被重复用于各种模块中!比如按钮、输 入框、loading等!
      • 功能(function)(.f-):为方便一些常用样式的使用,我们将这些使用率较高的样式剥离出来,按需使用,通常这些选择器具有固定样式表现,比如清除浮动等!不可滥用!
      • 状态(.z-):为状态类样式加入前缀,统一标识,方便识别,她只能组合使用或作为后代出现(.u-ipt.z-dis{},.m-list li.z-sel{})
      • javascript(.j-):.j-将被专用于JS获取节点,请勿使用.j-定义样式
        不要使用 " _ " 下划线来命名css
        能良好的区分javascript变量名
        输入的时候少按一个shift键
    • 浏览器兼容性问题(比如使用_tips的选择器命名,在IE6是无效的)

    • id采用驼峰式命名(不要乱用id)

    • 相同语义的不同类命名方法:

      • 直接加数字或字母区分即可(如:.m-list、.m-list2、.m-list3等,都是列表模块,但是是完全不一样的模块)。其他举例:.f-fw0、.f-fw1、.s-fc0、.s-fc1、.m-logo2、.m-logo3、u-btn、u-btn2等等。
    • 命名方式(BEM):类-体(例:g-head)、类-体-修饰符(例:u-btn-active) BEM的意思就是块(block)、元素(element)、修饰符(modifier),是由Yandex团队提出的一种前端命名方法论。这种巧妙的命名方法让你的CSS类对其他开发者来说更加透明而且更有意义。BEM命名约定更加严格,而且包含更多的信息,它们用于一个团队开发一个耗时的大项目。

    • 后代选择器:体-修饰符即可(例:.m-page .cut{})注:后代选择器不要在页面布局中使用,因为污染的可能性较大;

    @3-2: 最佳写法
    /* 这是某个模块 */
    .m-nav{}/* 模块容器 */
    .m-nav li,.m-nav a{}/* 先共性  优化组合 */
    .m-nav li{}/* 后个性  语义化标签选择器 */
    .m-nav a{}/* 后个性中的共性 按结构顺序 */
    .m-nav a.a1{}/* 后个性中的个性 */
    .m-nav a.a2{}/* 后个性中的个性 */
    .m-nav .z-crt a{}/* 交互状态变化 */
    .m-nav .z-crt a.a1{}
    .m-nav .z-crt a.a2{}
    .m-nav .btn{}/* 典型后代选择器 */
    .m-nav .btn-1{}/* 典型后代选择器扩展 */
    .m-nav .btn-dis{}/* 典型后代选择器扩展(状态) */
    
    .m-nav .m-sch{}/* 控制内部其他模块位置 */
    .m-nav .u-sel{}/* 控制内部其他元件位置 */
    .m-nav-1{}/* 模块扩展 */
    .m-nav-1 li{}
    .m-nav-dis{}/* 模块扩展(状态) */
    
    @2-3: 最佳写法
    • 布局(.g-)
    语义 命名 简写
    文档 doc doc
    头部 head hd
    主体 body bd
    尾部 foot ft
    主栏 main mn
    主栏子容器 mainc mnc
    侧栏 side sd
    侧栏子容器 sidec sdc
    盒容器 wrap/box wrap/box
    • 模块 (.m-)、元件(.u-)
    语义 命名 简写
    导航 nav nav
    子导航 subnav snav
    面包屑 crumb crm
    菜单 menu menu
    选项卡 tab tab
    标题区 head/title hd/tt
    内容区 body/content bd/ct
    列表 list lst
    表格 table tb
    表单 form fm
    热点 hot hot
    排行 top top
    登录 login log
    标志 logo logo
    广告 advertise ad
    搜索 search sch
    幻灯 slide sld
    提示 tips tips
    帮助 help help
    新闻 news news
    下载 download dld
    注册 regist reg
    版权 vcopyright cprt
    投票 vote vote
    结果 result result
    标题 title tt
    按钮 button btn
    输入 input ipt
    • 功能(.f-)
    语义 命名 简写
    清除浮动 clearboth cb
    左浮动 floatleft fl
    内联 inlineblock ib
    文本居中 textaligncenter tac
    垂直居中 verticalalignmiddle vam
    溢出隐藏 overflowhidden oh
    完全消失 displaynone dn
    字体大小 fontsize fz
    字体粗细 fontweight fs
    • 皮肤(.s-)
    语义 命名 简写
    字体颜色 fontcolor fc
    背景颜色 backgroundcolor bgc
    边框颜色 bordercolor bdc
    • 状态(.z-)
    语义 命名 简写
    选中 selected sel
    当前 current crt
    显示 show show
    隐藏 hide hide
    打开 open open
    关闭 close close
    出错 error err
    不可用 disabled dis
    @3-4. 注意事项
    • 一律小写,中划线
    • 尽量不用缩写
    • 不要随便使用id
    • 去掉小数点前面的0: 0.9rem => .9rem 去掉小数点有浏览器兼容问题
    • 使用简写:margin: 0 1rem 3rem

    4:js

    @4-1.变量
    • 变量命名
      • 变量语义化。
      • 使用_连接。例如:time_obj
      • 方法名:
        • 接口方法使用_API_前缀
        • 类方法名首字母大写
    • 全局变量
      1:少使用全局变量--避免变量污染
      • (待参考)变量以功能进行模块划分, 一个模块对应一个对象。例如:
    let time_obj={
      hour:0,
      date:'2019-01-01'
    }
    let time_obj={
      name:'一个例子',
      listArray:[]
    }
    

    2:使用全局变量数组,不能更改原数组,应拷贝一份(适用一维数组)。例如:
    多维使用深拷贝

    //错误的写法
    let test=[0,1,2,3]
    let other=test;
    //当变量other变化时,test数组会受影响
    //正确的拷贝方法
    //1:for 循环实现数组的深拷贝
    let arr = [1,2,3,4,5]
    let arr2 = copyArr(arr)
    function copyArr(arr) {
        let res = []
        for (let i = 0; i < arr.length; i++) {
         res.push(arr[i])
        }
        return res
    }
    //2:slice 方法实现数组的拷贝
    let arr = [1,2,3,4,5]
    let arr2 = arr.slice(0)
    //3:concat 方法实现数组的拷贝
    let arr = [1,2,3,4,5]
    let arr2 = arr.concat()
    //4:ES6扩展运算符实现数组的拷贝
    let arr = [1,2,3,4,5]
    let [ ...arr2 ] = arr
    
    

    3:使用全局变量对象,不能更改原对象,应拷贝一份(适用一维对象)。例如:
    多维使用深拷贝

    //错误的写法
    let test = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    let other=test;
    //当变量other变化时,test数组会受影响
    //正确的拷贝方法
    //1:for 循环实现对象的拷贝
    let obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    let obj2 = copyObj(obj)
    function copyObj(obj) {
      let res = {}
      for (var key in obj) {
        res[key] = obj[key]
      }
      return res
    }
    //2:转换成json再转换成对象实现对象的拷贝
    let obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    let obj2 = JSON.parse(JSON.stringify(obj))
    
    //3:扩展运算符实现对象的拷贝
    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var { ...obj2 } = obj
    obj2.old = '22'
    
    
    @4-2.常量
    • 命名方法:名称全部大写。
    • 命名规范:使用大写字母和下划线来组合命名,下划线用以分割单词。
    @4-3.类

    类的成员包含:

    ① 公共属性和方法:跟变量和函数的命名一样。

    ② 私有属性和方法:前缀为_(下划线),后面跟公共属性和方法一样的命名方式。

    function Student(name) {
        let _name = name; // 私有成员
     
        // 公共方法
        this.getName = function () {
            return _name;
        }
     
        // 公共方式
        this.setName = function (value) {
            _name = value;
        }
    }
    
    @4-3.注释
    • 普通注释
      以 /* 开头,*/ 结尾

    • 函数方法注释
      说明:函数(方法)注释也是多行注释的一种,但是包含了特殊的注释要求。

      语法:

    /** 
    * 函数说明 
    * @关键字 
    */
    /**
    * 合并Grid的行
    * @param {Grid} grid 需要合并的Grid
    * @param {Array} cols 需要合并列的Index(序号)数组;从0开始计数,序号也包含。
    * @param {Boolean} isAllSome 是否2个tr的cols必须完成一样才能进行合并。true:完成一样;false(默认):不完全一样
    * @return void
    * @author polk6 2015/07/21 
    * @example
    * _________________                             _________________
    * |  年龄 |  姓名 |                             |  年龄 |  姓名 |
    * -----------------      mergeCells(grid,[0])   -----------------
    * |  18   |  张三 |              =>             |       |  张三 |
    * -----------------                             -  18   ---------
    * |  18   |  王五 |                             |       |  王五 |
    * -----------------                             -----------------
    */
    function mergeCells(grid, cols, isAllSome) {
        // Do Something
    }
    

    常用注释关键字:(只列出一部分,并不是全部)

    注释名 语法 含义 示例
    @param @param 参数名 {参数类型} 描述信息 描述参数的信息 @param name {String} 传入名称
    @return @return {返回类型} 描述信息 描述返回值的信息 @return {Boolean} true:可执行;false:不可执行
    @author @author 作者信息 [附属信息:如邮箱、日期] 描述此函数作者的信息 @author 张三 2015/07/21
    @version @version XX.XX.XX 描述此函数的版本号 @version 1.0.3
    @example @example 示例代码 演示函数的使用 @example setTitle('测试')

    相关文章

      网友评论

          本文标题:2018-08-01

          本文链接:https://www.haomeiwen.com/subject/tzirvftx.html