移动端开发笔记

一. 移动端基本环境

视口 基于设备坐标

  • viewport 视口 默认不设置在移动端是980
  • width (number||device-width)
  • user-scalable =no
  • initial-scale
  • maximum-scale
  • minimum-scale

二. 移动端常见的一些问题

  • 清除点击阴影 : -webkit-tap-highlight-color:rgba(0,0,0,0)
  • 消除圆角按钮 : -webkit-appearance:none
  • 选中文字设置 :-webkit-user-select:none //(安卓不兼容)
  • 禁止文字缩放 :-webkit-text-size-adjust:100%
适配
  • viewport
  • 百分比
  • rem适配
  • 弹性盒模型(box版和flex版)
(function(){
  var w = window.screen.width;
    var targetW = 320;
    var scale = w/targetW; //当前尺寸/目标尺寸
    var meta = document.createElement("meta");
    meta.name = "viewport";
    meta.content = "user-scalable=no,initial-scale="+scale+",minimum-scale="+scale+",maximum-scale="+scale+""
    //console.log(scale);
    document.head.appendChild(meta);
})()

三.移动端布局

rem计算
  • 设计图选取 建议最小750
  • 利用less计算rem
  • 怪异盒模型
  • font-face
  • boodstrap字体组件
Less搭建环境

Less 的语法不能直接被浏览器解析需要 编译器 -->转换css

(1) 在客户端使用less

在HTML页面中引入.less文件,再引入一个Less转换程序(是一个.js文件),让客户端同时下载html/less/js 转换器,在客户端运行.js把less转换成css样式

 <link rel="stylesheet/less" href="css/index.less"/>
 <script src="js/less.min.js"></script>
(2) 在服务器端使用less(推荐使用)

开发人员使用一个命令行工具(less编译器),把.less编译为.css,在HTML页面中,直接引入编译好的.css文件即可

less用法1 - 服务器端使用npm在线安装less编译器.png

(1)下载并安装一款服务器端的JS解释器:Node .JS(独立于浏览器的V8引擎解释器,用来运行js脚本)
(2)下载并安装Less编译器程序:lessc(Compiler)--是一个运行在服务器端的JS脚本程序
(3)运行Node,执行lessc转换程序,把一个.less文件编译为一个.css即可

  • 直接在命令行中执行lessc xx.less
  • 把lessc 编译器配置为webStorm中的FileWatcher,只要用户在WS中创建/保存一个.less文件,即会自动编译出对应的.css文件(推荐)
webStorm配置示例.png

webStorm设置监听less文件自动转化css -----> settings==>Tools==>file watcher ==> +less

保存后,修改任意的.less文件并保存,即可自动生成一个.css文件
提示:若无法生成,检查npm配置步骤,重启WebStorm,再次检查上述几步过程,再次尝试
less中文网: http://lesscss.cn/

关于rem的介绍以及less动态计算

//可以引用这句话
document.getElementsByTagName("html")[0].style.fontSize=document.documentElement.clientWidth+"px";

但是再写的完成一些 相当于jq里的$.ready() 至于DOMContentLoaded的兼容性问题 还可以再研究一下

(function () {
    document.addEventListener('DOMContentLoaded', function () {
       document.getElementsByTagName("html")[0].style.fontSize=document.documentElement.clientWidth+"px";
    }, false);
})();

rem--em | r-->rood 根据根节点字体大小计算 | em 根据父元素计算单位
来了
1.html中默认的 font-size:16px; 也就是 1rem = 16px
2.以设计宽度为750px为例,那么定义 font-size:50px; 那么 1rem = 50px,比例为:750/50=15
3.定义页面中的尺寸,就是: 宽度/50 rem(比例为15)。例如:设计稿中dom(20px)的尺寸为:20px/50=0.4rem
4.针对不同屏幕尺寸,按同比例设置font-size(比例仍为15)。相当于1rem 变成对应大小(font-size变小多少,1rem就同比例变小多少)。
5.例如:
屏幕宽度为750px,则html设置的font-size为:750/15 = 50,设计稿中dom(20px)的尺寸为:20px/50=0.4rem,1rem = 50px
屏幕宽度为320px,则html设置的font-size为:320/15 = 21.33....,设计稿中dom(20px)的尺寸依然为:20px/50=0.4rem,1rem = 320/750*50px


rem比例公式.png
//配置好less监听,了解rem就可以开始写啦!要配置一样根节点的字体大小
  document.getElementsByTagName("html")[0].style.fontSize=document.documentElement.clientWidth/15+"px";
//可以在less文件里这样写 声明变量,然后计算
@r:50rem;
#header{height:120/@r;font-size:14/@r;width:750/@r;}

//解注: 以设计图为750为例,不然可以直接在变量处写成750 ,但是算下来小数位太长了,所以设置根节点的时候除15 (等同于15*50=750) 这样应该会提高性能吧~~

四.弹性盒模型 即flex布局

布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。
任何一个容器都可以指定为Flex布局。

注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
详细了解flex教程

Flex布局.png

举个栗子:

移动端淘宝布局.jpg
  <div class="wrap">
    <div><a href="javascript:;">天猫</a></div>
    <div><a href="javascript:;">聚划算</a></div>
    <div><a href="javascript:;">天猫国际</a></div>
    <div><a href="javascript:;">外卖</a></div>
    <div><a href="javascript:;">天猫超市</a></div>
    <div><a href="javascript:;">充值中心</a></div>
    <div><a href="javascript:;">飞猪旅行</a></div>
    <div><a href="javascript:;">领金币</a></div>
    <div><a href="javascript:;">充值中心</a></div>
    <div><a href="javascript:;">拍卖</a></div>
</div>

没有给"项目div"设置任何宽度高度,完全是图片撑起来的

示例.png
//示例css代码 利用伪类可以减少HTML代码的干预 一般还是习惯上img标签吧
.wrap{display:flex;display:-webkit-flex;flex-wrap:wrap;}
.wrap div{flex-grow:1;text-align: center;}
.wrap a{font-size:15/@a;display:block;}
.wrap a:before{content:"";display:block;width:150/@a;height:3rem;}
.wrap div:nth-child(1) a:before{background:url(../img/t1.png) no-repeat 0 center / 100%;}
.wrap div:nth-child(2) a:before{background:url(../img/t2.png) no-repeat 0 center / 100%;}
.wrap div:nth-child(3) a:before{background:url(../img/t3.png) no-repeat 0 center / 100%;}

如果是一排的话 flex-grow:1;可以直接平均分div

五.移动端事件

移动端三大事件:
手指按下: ontouchstart
手指移动: ontouchmove
手指离开: ontouchend
<small>注意: 在移动端开发的时候,浏览器的模拟器时好时坏,一般不用on的方式绑定事件函数,要用事件绑定的方式(addEventListener)</small>
<small>PC端的事件比移动端的事件略慢,大概在300ms左右</small>

移动端的点透: 当上层元素发生点击的时候,下层元素也有焦点特性,在300ms之后,如果上层元素消失或隐藏,目标点就会"漂移"到下层元素身上,就会触发点击行为.
解决:
<small>1.下层不要使用有点击(焦点)特性的元素
2.阻止PC事件</small>

document.addEventListener("touchstart",function(ev){
          ev.preventDefault();//阻止掉之后就尽量不要用PC端的事件了
})
  • 禁止用户缩放meta设置在ios10不生效,就可以加上以上语句
  • 解决ios10溢出隐藏的问题
  • 精致系统默认的滚动条,阻止橡皮筋效果
  • 禁止长按选中文字,选中图片,系统默认菜单
  • 解决点透问题
  • 也阻止了焦点行为(要正产更实用,ev.stopPropagation()阻止冒泡 )

<small>呼~~ 为什么我觉得它能阻止一切...</small>

移动端事件对象
当给某个元素加上了事件绑定函数之后,事件函数默认的第一个参数就是事件对象
事件对象:当用户在浏览器下触发了某个行为,事件对象会记录用户操作时一些细节信息。
touches 当前位于*屏幕*上的所有手指的一个列表
targetTouches 位于当前DOM元素上的手指的一个列表
changedTouches  涉及当前事件的手指的一个列表(正在滑动的手指)

六.Transform详解

div.style.WebkitTransform=div.style.transform="translate(100px)";

  • transform-origin:center center;
  • rotate(deg) 旋转
  • skew(deg) 斜切 skewX skewY
  • scale(num) 缩放(原来的多少倍)scala(x,y) scaleX scaleY
  • translate(100px) 位移 px 写法同上

<small>

3d变换

perspective 景深(我在多元之外来看这个元素)加载要写在3d变换的父级

  • transform-style 元素在做3d变换时,是否保留子元素的3d变换
  • flat不保留
  • preserve-3d保留子元素3d变换
  • perspective-origin:center center;

</small>

//父级
-webkit-perspective: 200px;
perspective: 200px;
//元素上
-webkit-transform-style:preserve-3d;
transform-style:preserve-3d;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容