布局
使用flex布局方案
屏幕适配
设置meta标签。
使用VW单位控制元素大小
例如:750px = 100vw; 1vw = 7.5px
iPhone X 适配
1 | @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) { /* iPhone X 独有样式写在这里*/ } |
获取设备像素比
1 | /** |
样式
个性字体引入及使用
1 | @font-face{ |
去除iOS中元素被点击时出现的阴影
1 | *{-webkit-transition: -webkit-transform .3s;-o-transition: transform .3s;transition: -webkit-transform .3s;transition: transform .3s;transition: transform .3s, -webkit-transform .3s;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} |
书写模式:竖向、从右往左
1 | .write_mode_vertical{z-index: 999;margin: 0 auto;-webkit-writing-mode: vertical-rl;-ms-writing-mode: tb-rl;writing-mode: vertical-rl;} |
全屏背景图
1 | body{margin: 0;width: 100%;height: 100%;background: url(../img/background.jpg) no-repeat 0 0 / 100% 100% ;font-family: customFont;display: none} |
遮罩层
1 | .weui-mask{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1000;display: none;background: rgba(0, 0, 0, 0.6);} |
弹出层
1 | .absoluteCenter{position: fixed;top: 50%;bottom: auto;left: 50%;-webkit-box-sizing: border-box;box-sizing: border-box;-webkit-transition: -webkit-transform .3s;-o-transition: transform .3s;transition: -webkit-transform .3s;transition: transform .3s;transition: transform .3s, -webkit-transform .3s;-webkit-transform: translate(-50%, -50%);transform: translate(-50%, -50%);-ms-transform: translate(-50%, -50%);-webkit-backface-visibility: hidden;backface-visibility: hidden;} |
上下左右居中
1 | display: -webkit-box;display: -ms-flexbox;display: flex;margin: 0 auto;width:12.9333vw;height:105.7333vw;background: url(../img/lot.png) no-repeat 0 0 / 100% ;-webkit-box-align: center;-ms-flex-align: center;align-items: center;} |
营销活动类单页H5注意事项
- 由于是单页效果,尽量不要出现Y轴滚动条
- 登陆功能:注意判断登陆状态,是否需要跳转,缓存用户信息等。
- 图像处理:用户上传的照片可能是各种比例,需要注意图片展示容器与图像的匹配性
- DOM状态较多时,每屏可考虑用div包裹元素,展示下一屏时隐藏上一屏,方便控制。
meat 标签
1 | <meta charset="UTF-8"> |
按钮点击时去除阴影
1 | -webkit-tap-highlight-color:transparent |
隐藏滚动条
1 | .content::-webkit-scrollbar{display:none} |
滚动卡顿优化
1 | overflow:scroll 滑动卡顿 ,加上 |
网页调起手机相机拍照或相册选择照片 input type=’file’
1 | <!--如果该元素的 type 属性的值是file,accept则该属性表明了服务器端可接受的文件类型 capture="user、camera"强制指定调用摄像头--> |
注意:input type=’file’ 在所有的android webview中不兼容
FileReader对象读取 input file 文件
1 | /** |
1 | const selectPhotoElement = document.getElementById("selectPhoto"); |
注意:上传图像到后端时需要用EXIF.js读取图片信息,处理图像方向。
使用FormData对象模拟表单上传文件
1 | /** |
将H5 分享微信/QQ 需要接入微信sdk
登陆页
表单的验证
1
2<input id="phone" type="tel" placeholder="请输入手机号码" maxlength="11"
onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')" />手机号验证
1
2
3
4
5
6
7
8
9/**
* 校验是否是手机号
* @param value
* @returns
*/
function isMobile(value){
var reg = /^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))\d{8}$/;
return reg.test(value);
}短信验证码倒计时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35/**
* 短信倒计时
* @param beginFn
* @param updateFn
* @param completeFn
* @returns
*/
var timer;
var $btnSmsCode = $("#btn_smsCode");
function countDown(beginFn, updateFn, completeFn) {
var remain = 60;
beginFn(remain);
timer = setInterval(function () {
if (remain-- <= 0) {
completeFn();
} else {
updateFn(remain);
}
}, 1000);
}
function cdStart(remain) {
$btnSmsCode.removeClass("textBlue").addClass("textGray");
$btnSmsCode.text(remain + "s重发");
}
function cdUpdate(remain) {
$btnSmsCode.text(remain + "s重发");
}
function cdComplete() {
clearInterval(timer);
$btnSmsCode.removeClass("textGray").addClass("textBlue");
$btnSmsCode.text("免费获取");
}
APP下载引导页面
需要根据user agent 判断用户设备
根据ua进行跳转应用宝or App store
1 | // 判断访问终端跳转到不同的下载商店 |
HTML5新特性之摇一摇 shake.js
1 | /**摇一摇,触发签筒动画 */ |
HTML5新特性之存储 localStorage
1 | // 进入页面时调用此方法保存URL,存储当前页面的pathname到localstorage |
网页转图片 下载并保存 ——html2canvas.js
思路是:
1.先用html2canvas将网页转成图片。注意可以额外设置 scale 控制canvas的高清度。
2.再构造一个带图片下载链接 的a标签,调用saveFile方法就通过js 触发该标签点击事件,触发下载。
需要注意的是,在微信中无法调用下载方法,在iOS浏览器中下载图片会变成打开图片的新标签页,需提示用户自行长按图片保存。
1 | /**下载图片:构造一个 带图片下载链接 的a标签,调用saveFile方法就通过js 触发该标签点击事件,触发下载。*/ |
canvas使用注意点
设置canvas的大小
1
2
3
4
5
6
7
8//窗口尺寸改变响应(修改canvas大小)
function resizeCanvas() {
$("#canvas").attr("width", $(window).get(0).innerWidth);
$("#canvas").attr("height", $(window).get(0).innerHeight * 0.25);
};
//添加窗口尺寸改变响应监听
$(window).resize(resizeCanvas);
根据设备像素比渲染对应大小的图片
1 | function DPR() { |
Swiper 使用注意点
当Swiper中的元素是动态添加时,会导致Swiper停止自动切换。
解决方法是:
配置swiper属性:observer: true, observeParents: true
在拼接完成并使用mySwiper.appendSlide(swData)添加到dom后,mySwiper.autoplay.start();
当Swiper中的元素过多,需要回收时。
1
2
3
4
5on: {
slideChangeTransitionEnd: function(){// 滚动后删除
mySwiper.removeSlide(this.activeIndex -1)
},
}
修复input被键盘遮挡
1 | //输入法键盘挡住输入框的 bug |
判断访问终端跳转到不同的下载商店
1 | // 判断访问终端跳转到不同的下载商店 |
百度地图接入
百度地图web版有许多API,其中分为PC 3.0版和移动优化版 Lite,区别是移动版API少一些,并且两个版本不可同时引用,在使用之前需要考虑。
那么如何使用百度地图API呢?可以先参考官网的案例(示例demo),再查询更具体的技术文档(类参考),技术文档写得可能比较抽象,不清楚则结合百度搜索。
基本用法 地图初始化
1 | <!--地图容器--> |
工具函数
1 | /** |
利用GPS数据集绘制轨迹
绘制轨迹的原理是利用百度地图API的绘制线条api——polyline来实现,多个点之间利用线条连接即视为轨迹。
1 | let maker; // 播放时显示的maker |
循环添加轨迹点到地图上
1 | // 添加轨迹点 |
标点绑定点击事件
1 | /** |
使用drivingroute绘制动态行车guiji
1 | $(function($) { |
地图贴图
给百度地图贴上覆盖物——瓦片贴图,首先需要选取一个中心点,然后使用瓦片切图工具将贴图切碎成10-22级的贴图放到文件夹中。
1 | // 地图覆盖贴图 |
隐藏百度地图标示 (须注意法务风险)
1 | /** 隐藏百度地图信息窗口左侧阴影图片 **/ |
扫描二维码
- 前端扫描二维码——GitHub项目
- 调用微信JS SDK ,仅限于在微信中使用
- 在webview中调用native app进行扫码
摇一摇
使用shake.js监听手机摇一摇事件
代码段
弹出层 遮罩层 可以封装成一个小组件
1 | var $weui_mask = $(".weui-mask"); |
ajax可以封装成一个公共方法,传入请求url、携带数据、回调函数
1 | /** |
时间类型 2018-09-20 这种类型的时间转为年月日后,在iOS为变成NaN
解决办法是将时间 - 转为 /
1 | /** |
字符串转换为日期对象
1 | /** |
将时间切割为: 天,时,分,秒; 用于倒计时
1 | /** |
产生随机数
1 | /** |
获取URL参数
1 | /** |
1 | // 从播放器获取大屏播放时长、大屏编码参数 |