整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML5之canves绘图

HTML5之canves绘图

lt;canvas id="" width="" height=""></canvas>

<canvas>只是一个图像的容器,相当于画布。本身没有绘图能力。所有的绘制工作必须在JS中完成。

使用JS绘制图像

<script>

// 找到定义的canvas元素。

var c=document.getElementById("ID");

//创建 context对象

//getContext("2d") 对象是内建的

//HTML5对象

//拥有多种绘制路径。

var ctx=c.getContext("2d");

// fillStyle 属性可以是css颜色,渐变

//或图案。 默认值为黑色。

ctx.fillStyle="#FF0000";

// 定义填充方式

//fillRect( x , y , width , height)

ctx.fillRect(0,0,150,75);

</script>

Canvas 路径

画线:

moveTo( x ,y ) --定义线条开始坐标。

lineTo( x ,y ) -- 定义线条结束坐标。

var c=document.getElementById("ID");

var ctx=c.getContext("2d");

ctx.moveTo(0,0);

ctx.lineTo(200,100);

ctx.stroke();

画圆:

arc(x, y, r, start, stop)

var c=document.getElementById("ID");

var ctx=c.getContext("2d");

ctx.beginPath();

ctx.arc(95,50,40,0,2*Math.PI);

ctx.stroke();

文本:

  • font - 定义字体

  • fillText(text,x,y) - 在 canvas 上绘制实心的文本

  • strokeText(text,x,y) - 在 canvas 上绘制空心的文本

var c=document.getElementById("ID");

var ctx=c.getContext("2d");

ctx.font="30px Arial";

ctx.fillText("Hello World",10,50);

Canvas 渐变

  • createLinearGradient(x,y,x1,y1) - 创建线条渐变

  • x渐变开始点的x坐标

  • y渐变开始点的y坐标

  • x1渐变结束点的x坐标

  • y1渐变结束点的y坐标

  • createRadialGradient(x,y,r,x1,y1,r1) - 创建一个径向/圆渐变

  • x、y渐变的开始圆x、y坐标

  • r开始圆半径

  • x1、y1渐变的结束圆x、y坐标

  • r1结束圆半径

  • addColorStop()方法指定颜色停止,参数使用坐标来描述,可以是0-1;中间值采用0-1之间的小数可以实现添加多种颜色

  • 使用渐变,设置fillStyle或是strokeStyle的值为渐变,然后绘制形状。

线性渐变

var c=document.getElementById("ID");

var ctx=c.getContext("2d");

// Create gradient

var grd=ctx.createLinearGradient(0,0,200,0);

grd.addColorStop(0,"red");

grd.addColorStop(1,"white");

// Fill with gradient

ctx.fillStyle=grd;

ctx.fillRect(10,10,150,80);

线性渐变

径向渐变

本原则

结构、样式、行为分离

尽量确保文档和模板只包含 HTML 结构,样式都放到样式表里,行为都放到脚本里。

缩进

统一两个空格缩进(总之缩进统一即可),不要使用 Tab 或者 Tab、空格混搭。

文件编码

使用不带 BOM 的 UTF-8 编码。

在 HTML中指定编码 <meta charset="utf-8"> ;

无需使用 @charset 指定样式表的编码,它默认为 UTF-8 (参考 @charset);

一律使用小写字母

省略外链资源 URL 协议部分

省略外链资源(图片及其它媒体资源)URL 中的 http / https 协议,使 URL 成为相对地址,避免Mixed Content 问题,减小文件字节数。

其它协议(ftp 等)的 URL 不省略。

统一注释

通过配置编辑器,可以提供快捷键来输出一致认可的注释模式。


HTML篇

标签

  • 自闭合(self-closing)标签,无需闭合 ( 例如: img input br hr 等 );
  • 可选的闭合标签(closing tag),需闭合 ( 例如:</li> 或 </body> );
  • 尽量减少标签数量;

Class 与 ID

  • class 应以功能或内容命名,不以表现形式命名;
  • class 与 id 单词字母小写,多个单词组成时,采用中划线-分隔;
  • 使用唯一的 id 作为 Javascript hook, 同时避免创建无样式信息的 class;

属性顺序

HTML 属性应该按照特定的顺序出现以保证易读性。

  • id
  • class
  • name
  • data-xxx
  • src, for, type, href
  • title, alt
  • aria-xxx, role

引号

属性的定义,统一使用双引号。

嵌套

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>等。

更多详情,参考WEB标准系列-HTML元素嵌套

布尔值属性

HTML5 规范中 disabled、checked、selected 等属性不用设置值。

语义化

没有 CSS 的 HTML 是一个语义系统而不是 UI 系统。

通常情况下,每个标签都是有语义的,所谓语义就是你的衣服分为外套, 裤子,裙子,内裤等,各自有对应的功能和含义。所以你总不能把内裤套在脖子上吧。– 一丝

此外语义化的 HTML 结构,有助于机器(搜索引擎)理解,另一方面多人协作时,能迅速了解开发者意图。

HEAD

文档类型

为每个 HTML 页面的第一行添加标准模式(standard mode)的声明, 这样能够确保在每个浏览器中拥有一致的表现。

语言属性

lang属性的取值应该遵循 BCP 47 - Tags for Identifying Languages。

字符编码

以无 BOM 的 utf-8 编码作为文件格式;

指定字符编码的 meta 必须是 head 的第一个直接子元素;

IE 兼容模式

优先使用最新版本的IE 和 Chrome 内核

SEO 优化

viewport

viewport: 一般指的是浏览器窗口内容区的大小,不包含工具条、选项卡等内容;

width: 浏览器宽度,输出设备中的页面可见区域宽度;

device-width: 设备分辨率宽度,输出设备的屏幕可见宽度;

initial-scale: 初始缩放比例;

maximum-scale: 最大缩放比例;

为移动端设备优化,设置可见区域的宽度和初始缩放比例。

iOS 图标

apple-touch-icon 图片自动处理成圆角和高光等效果;

apple-touch-icon-precomposed 禁止系统自动添加效果,直接显示设计原图;

favicon

在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证 favicon 可访问,避免404,必须遵循以下两种方法之一:

  • 在 Web Server 根目录放置 favicon.ico 文件;
  • 使用 link 指定 favicon;

HEAD 模板

、语义化标签

  1. 列表使用 ul li
  2. 文字使用 p span em cite 等标签
  3. 标题使用 h1 h2 等标签
  4. 布局使用 section aside header footer article 等 HTML5 布局标签

2、自定义标签

使用自闭合标签的写法 小写加下划线

<template>
  <my-owner-components />
</template>

3、多特性分行写

为提高可读性 组件应用时换行 按照 ref、class、传入、传出 顺序书写

<template>
  <my-components
    ref="myComponents"
    class="home-my-components"
    :data="data"
    @changeHandle="changeHandle"
  />
</template>

4、行内使用表达式

在模版中 简单情况使用表达式 复杂情况使用计算属性或函数

<template>
  <!-- 简单情况 -->
  <div v-show="data.type===1">
    ...
  </div>
  <!-- 复杂情况 -->
  <div v-show="getTypeShow(data)">
    ...
  </div>
</template>

<script>
export default {
  methods: {
    /**
    * ***显示判断
    * @param data **
    */
    getTypeShow(data) {
      return data.type===1 && ...
    }
  }
}
</script>

5、避免重复

避免过多重复代码 果超过三行类似的代码 配置数据再循环遍历

6、代码嵌套

根据元素嵌套规范 每个块状元素独立一行 内联元素可选

<template>
  <!-- 情况1 -->
  <div>
    <h1></h1>
    <p></p>
    <p><span></span><span></span></p>
  </div>
  <!-- 情况2 -->
  <div>
    <h1></h1>
    <p></p>
    <p>
      <span></span>
      <span></span>
    </p>
  </div>
</template>

7、活用v-if v-show

v-show 不会改变dom树 不会导致重新渲染 用于频繁的切换显示隐藏
v-if 会改变dom树 会导致重新渲染 用于只控制一次显示隐藏

8、注释规范

<template>
  <!-- 标签注释 -->
  <div>
    ...
  </div>
  <!-- 组件注释 -->
  <my-owner-components />
</template>

CSS规范

1、避免使用

  1. 避免使用标签选择器 因为在 Vue 中 特别是在局部组件 使用标签选择器效率特别低 损耗性能 建议需要的情况直接定义 class
  2. 非特殊情况下 禁止使用 ID 选择器定义样式(有 JS 逻辑的情况除外)
  3. 避免使用important选择器
  4. 避免大量的嵌套规则 控制在3级之内 对于超过4级的嵌套 考虑重写或新建子项
  5. 避免使用ID选择器及全局标签选择器防止污染全局样式

2、推荐使用

  1. 提取公用样式进assets文件styles里 按模块/功能区分
  2. 使用 scoped 关键字 约束样式生效的范围
  3. 可复用属性尽量抽离为页面变量 易于统一维护
  4. 使用混合(mixin)根据功能定义模块 然后在需要使用的地方通过 @include 调用 避免编码时重复输入代码段

3、书写顺序

CSS 属性书写顺序 先决定定位宽高显示大小 再做局部细节修饰
定位属性(或显示属性 display)=> 宽高属性=> 边距属性(margin padding)=> 背景 颜色 字体等修饰属性的定义 这样定义为了更好的可读性 让别人只要看一眼就能在脑海中浮现最终显示的效果

.class-name {
  position: fixed;
  top: 100px;
  left: 0;
  right: 0;
  bottom: 0;
  display: block;
  width: 100%;
  height: 100%;
  margin: 10px;
  padding: 10px;
  background-color: red; 
  border-radius: 2px;
  font-size: 14px;
  color: #000;
  line-height: 1.42;
}

4、样式覆盖

组件内部需要覆盖UI框架样式 必须在最外层组件加类名

<template>
  <div class="input-container">
    <el-input class="name-input"></el-input>
  </div>
</template>

<style lang="scss">
.input-container {
  .name-input {
    .el-input__inner {
      font-size: 16px;
    }
  }
}
</style>

5、注释规范

/ 注释内容 / 格式注释 前后空格 嵌套子类需要一个回车分割开

/* 注释内容 */
.class-name {
  width: 20px;
  
   /* 这里需要换行 */
  .class-name-l {
    color: blue
  }
}

JS规范

1、用法规范

  1. 在vue-cli 脚手架使用架自带的指向 src 开发目录的 '@' 符号引入文件资源
  2. 使用 template 或计算属性规避 v-if 和 v-for 用在一起
  3. 统一使用单引号
  4. 坚持单一原则 函数内仅做该函数应该做的 尽量避免通过传入标记控制不同行为
  5. 优先考虑三目运算符 但不要写超过3层的三目运算符
  6. 对于无用代码必须及时删除 例如:一些调试的 console 语句、无用的弃用功能代码
  7. 请求数据的方法使用try catch 错误捕捉 注意执行回调

2、组件顺序规范

<script>
export default {
  name: 'ExampleName',        // 这个名字推荐:大写字母开头驼峰法命名
  props: {},                  // Props 定义
  components: {},             // 组件定义
  directives: {},             // 指令定义
  mixins: [],                 // 混入 Mixin 定义。
  data () {                   // Data 定义。
    return {
      dataProps: ''           // Data 属性的每一个变量都需要在后面写注释说明用途,就像这样
    }
},
  computed: {},               // 计算属性定义。
  watch: {},                  // 属性变化监听器。
  created () {},              // 生命钩子函数,按照他们调用的顺序。
  mounted () {},              // 挂载到元素。
  activated () {},            // 使用 keep-alive 包裹的组件激活触发的钩子函数。
  deactivated () {},          // 使用 keep-alive 包裹的组件离开时触发的钩子函数
  methods: {                  // 组件方法定义。
    publicbFunction () {}     // 公共方法的定义,可以提供外面使用
    _privateFunction () {}    // 私有方法,下划线定义,仅供组件内使用。多单词,注意与系统名字冲突!
  }
}
</script>

3、注释规范

函数/方法注释必须包含函数说明,有参数和返回值时必须使用注释标识,它的作者, 依赖关系和兼容性信息。

  1. 单行注释:双斜线后应跟空格,且缩进与上下文的代码保持一致;或在行尾注释,在行尾依然需要左右空格
// 注释
const userID=24
const userID=12 // 注释
  1. 多行注释:一般用于注释难以理解的、可能存在错误的、逻辑强的代码,且缩进一致
/*
 * 针对下方代码的说明
 * 第一行太长写第二行
 */
const aa=1
  1. 函数注释:写明传入参数名称、类型推荐完整注释以下格式
/**
 * @Description 加入购物车
 * @Author luochen_ya
 * @Date 2024-03-13
 * @param {Number} goodId 商品id
 * @param {Array<Number>} specs sku规格
 * @param {Number} amount 数量
 * @param {String} remarks 备注
 * @returns <Promise> 购物车信息
 */
apiProductAddCard=(goodId, specs, amount, remarks)=> {
  return axios.post('***', { goodId, specs, amount, remarks })
}
  1. 文件注释:写明文件描述
/**
 * @Description: 文件描述
 * @Author: luochen_ya
 * @Date: 2024-03-13
 */

命名规范

1、目录命名

按照小驼峰命名 首字母小写

  1. 项目文件夹:projectName
  2. 样式文件夹:css / scss
  3. 脚本文件夹:js

2、图片命名

图片就是img开头 图标就是icon开头

  1. img_功能_模块_编号
  2. icon_功能_模块_编号

3、文件命名

  1. 按照小驼峰命令 英文单词过长或超出2个以上 可缩略至前四位 列如:comming_soon.png 等
  2. 有复数含义 采用复数命名 列如:minixs styles images icons 等
  3. 静态资源命名格式为小写 + 下划线 列如:icon_arrow.png img_logo.png 等
  4. 组件命名为小驼峰 公用组件加上gd前缀 列如:gdOwnerComponents 等

4、方法命名

method 方法命名不同于文件命名,尽量完整英文命名,语义表达需完整清楚

  1. 按照小驼峰命名法 可使用常见动词约定
  • can: 判断是否可执行某个动作 函数返回一个布尔值 true可执行 false不可执行
  • has: 判断是否含有某个值 函数返回一个布尔值 true含有此值 false不含有此值
  • is: 判断是否为某个值,函数返回一个布尔值 true为某个值 false不为某个值
  • get: 获取某个值 函数返回一个非布尔值
  • set: 设置某个值 无返回值或者返回是否加载完成的结果
  1. 语义化英文命名 仅组件内部使用方法前加上_(下划线)区分
<script>
export default {
  methods: { // 组件方法定义
    publicbFunction () {} // 公共方法的定义 可以提供外面使用
    _privateFunction () {} // 私有方法 下划线定义 仅供组件内使用
  }
}
</script>
  1. 引入组件:首字母大写的驼峰法命名
import MyOwnerComponents from '@/components/MyOwnerComponents'
  1. 变量:使用驼峰式命名 优先使用 let const 避免使用 var
let userName='luochen_ya'
const userInfo={
  name: 'luochen_ya',
  age: 24
}
  1. 常量:字母全部大写 以下横线 _ 划分
const Constant={
  // 公用状态
  COMMON_STATUS_ENABLE=1, // 启用
  COMMON_STATUS_DISABLE=2, // 停用
}

5、样式命名

class命名以小写字母开头 小写字母、中划线和数字组成 以下是一些常用到的 class的名字

  1. 包裹层: .xxx-wrap
  2. 列表: .xxx-list
  3. 列表项: .xxx-list-item
  4. 左边内容: .xxx-left
  5. 中间内容: .xxx-middle
  6. 右边内容: .xxx-right
  7. 某个页面:.xxx-page

6、常用词

  1. 常用动词
  • get=> 取值
  • set=> 给值
  • add=> 新增
  • remove=> 移除
  • show=> 显示
  • hide=> 隐藏
  • view=> 查看
  • browse=> 浏览
  • edit=> 修改
  • save=> 保存
  • delete=> 删除
  • find=> 查询
  • undo=> 撤销
  • redo=> 重做
  • clean=> 清除
  • index=> 索引
  • observe=> 观察
  • send=> 发送
  • receive=> 接收
  • refresh=> 刷新
  • synchronize=> 同步
  1. 常用缩写
  • object=> obj
  • array=> arr
  • function=> fn
  • message=> msg
  • button=> btn

工程结构

1、目录构建

├── api                       所有api接口
├── assets                    靜態資源
│   ├── fonts                   全局公用字体
│   ├── icons                   全局公用图标
│   ├── images                  全局公用图片
│   └── styles                  全局公用样式
├── components                公用組件
│   ├── base                    基础组件
│   └── business                业务组件
├── constants                 常量 统一管理
├── locales                   多语言管理
├── plugins                   插件 统一管理
├── router                    路由 统一管理
│   └── index.js               
├── store                     vuex 统一管理
│   ├── modules                 
│   ├── getters.js              
│   └── index.js                
├── utils                     工具函数 统一管理
├── views                     视图目录(所有业务逻辑的页面)

2、代码风格

可以直接使用eslint 强制统一代码规范 还能规避一些语法错误 或者按照以下自己定义的去配置eslint来使用
以下是个人习惯 仅供参考

  1. 首行缩进2空格
  2. js代码去除分号
  3. html代码超出255字符一行进行换行操作
  4. js代码统一使用单引号或双引号