前端----移动

所有经验适用于:iOS6.0+Android4.0+

目录

兼容性

CSS伪类:active

如果你想使用元素的伪类来实现 按下激活 状态,那么你需要知道以下问题:

  • iOS上的几乎任何浏览器,定义元素的伪类 :active 都是无效;
  • Android上,Android Browser 和 Chrome 都支持伪类 :active ,其它第三方浏览器有部分不支持;
  • 定义了 :active 并且当前浏览器环境支持,当手指在滚动或者无意间的划过时,:active 状态都会被激活;

为了规避上述所有的问题,如果需要 按下激活 状态,推荐使用 js 新增一个 className

清除输入框内阴影

iOS上的几乎任何浏览器输入框(input, textarea)默认有内部阴影,但无法使用 box-shadow 来清除,如果不需要阴影,可以这样关闭:

input,
textarea {
	/* 方法1: 去掉边框 */
	border: 0;

	/* 方法2: 边框色透明 */
	border-color: transparent;

	/* 方法3: 重置输入框默认外观 */
	-webkit-appearance: none;
	appearance: none;
}

Samsung S4圆角Bug

Samsung S4 手机在 Android Browser4.4.2 上(其他版本未测),如果你使用了 border-radius,并且使用了 -webkit-transform 属性,当使用了 translatez 或者 translate3d 值,圆角会出现问题:

.test {
	border: 2px solid red;
	width: 50px;
	height: 50px;
	border-radius: 50%;
	background-color: gray;
	box-shadow: 0 2px 5px rgba(0, 0, 0, .3);
	-webkit-transform: translate(0, 0) translatez(0);
	transform: translate(0, 0) translatez(0);
}
<div class="test"></div>

如上代码,-webkit-transform: translate(0, 0) translatez(0) 将会导致圆角无法包裹住 background-color

当然,-webkit-transform: translate3d(0, 0, 0) 也是一样的,所以如果你的某个场景是这样的,那么可以直接使用 -webkit-transform: translate(0, 0) 来避免这个问题。

边框圆角致背景溢出

在红米和OPPO等手机某些版本的 Android Webview 中,如果一个元素定义了 border + border-radius,这时如果该元素有背景,那么背景将会溢出圆角之外。

之所以会出现这个问题:其主要原因是因为CSS对背景裁剪(background-clip)有不同的处理方式,通常它可以是 border-box | padding-box | content-box 这3种方式。

浏览器的默认裁减方式是 border-box,即溢出 border 之外的背景都将被裁减。

对于上述无法裁减边框之外背景的手机,将值定义为 padding-box | content-box 都能fix这问题,不过更推荐使用 padding-box。因为使用 content-box,如果定义了 padding 不为 0,背景将无法铺满元素。

一个失败的圆(圆角)

在移动平台上开发时,用CSS画一个圆很简单,只需要一句代码:

.circle {
	border-radius: 50%;
}

不过,在 Android Browser2.* 上,这个定义将会失效,而显示为默认的矩形。

因为 Android Browser2.* 不支持以 百分比 作为 border-radius 的值,所以如果你需要兼容 Android Browser2.*,那么你可以这样:

.circle {
	width: 10rem;
	height: 10rem;
	border-radius: 5rem;
}

如果你觉得这样定义不够灵活,想懒一点,那么其实可以给 border-radius 预设一个比较大的值,比如 100rem,用以避免当元素的尺寸变了,圆角半径也得跟着变,除非元素的尺寸超出了你预设的阀值。

不要使用伪元素动画

有的时候你可能会为了减少页面上的DOM数,而使用伪元素。但如果你想给伪元素增加 animation 或者 transition 动画,这时候会碰上支持性问题。

如果你的项目需要支持以下系统版本,那么建议直接使用真实元素:

  • iOS Safari6.1及以下
  • Android Browser4.1.*及以下,包括一些深度定制的系统,比如:
    • 魅族 - Flyme OS 4.1.1.1C及以下(比这高的版本尚未测试过)- 咱国产能别这么坑么(安卓版本为4.4.4的魅族MX4 pro)

:checked与兄弟选择符一起使用的bug

在 Android Browser4.2.*及以下(可能版本稍有出入)(包括坑爹的Flyme),如果你有这样一段代码:

input:checked ~ .test {
  background-color: #f00;
}

那么将无任何效果,如果你想使得上述代码生效,有2种方式:

第一种,使用 input 和 + 进行激活:

html + input {}
input:checked ~ .test {
  background-color: #f00;
}

只要存在 input和 + 选择符配合使用的选择器(空规则集也行)即可使得上述代码激活生效。

第二种,直接换成 +

input:checked + .test {
  background-color: #f00;
}

为什么flex布局不生效

Android Browser4.3及以下iOS Safari6.1及以下 的 flex子项 需要使用块级元素,在这些版本之上还可以使用行内块元素

在这些版本中,如果你发现flex子项之间出现了间隙,或者在未定义换行的情况下子项自身抑或子项之间换行了,或者出现了其它不正常的情况,那么仔细看一下flex子项可能是使用了行内级元素;

  • 当横向布局时,给 flex子项 子项定义 width 为非 auto 的值

Android Browser4.3及以下iOS Safari6.1及以下 的 flex子项 如果没有显式的定义 width 为非 auto 的值,那么子项分配父元素剩余空间时将会不符合标准预期;

  • 当纵向布局时,给 flex子项 子项定义 height 为非 auto 的值

Android Browser4.3及以下iOS Safari6.1及以下 的 flex子项 如果没有显式的定义 height 为非 auto 的值,那么子项分配父元素剩余空间时将会不符合标准预期;

为什么小于12px字号不生效

如果你是从pc开发转到移动平台的,或者应该记得在pc端,Chrome及后来加入Webkit阵营的Opera都不支持页面字号小于12px,当然你可以通过更改浏览器设置来改变这一情况,然后这并没有什么卵用,不是么?

不幸的是,在移动端这个限制也依然存在,在Android Chrome上(包括部分版本上的Android Browser),仍然不支持小于12px的字号(测试至Android5.0.2, Chrome46),除此之外,其他浏览器包括iOS上众浏览器都能够很好的支持超小字体。

所以,如果希望你的程序足够安全,尽量不要定义小于12px的字号,或者换一种方式来实现。

题外话:假设你的项目使用了rem,那么不要使用10作为换算因子,原因也如上

chrome中body使用rem失效

我知道很多人已经开始使用 rem 作为项目中的单位了。但是遗憾的是,在 Chrome 和 Opera 上,如果我们给 body 元素应用了 rem,那么这个取值将会计算错误。

假设我们有如下代码:

html {
  font-size: 62.5%;
}
body {
  font-size: 1.4rem;
}

因为大部分浏览器的默认字号都是 16px,所以 html 的字号计算出来应该是 16px * 62.5% = 10px。此时,我们预期 body的 font-size 为 14px。然而实际情况与我们想象的不太一样,最终 body 的计算值并不是 14px,它忽略了 html 的定义,而是直接使用了浏览器的默认字号作为参照。于是最终计算值为:16px * 1.4rem = 22.4px。测至 chrome 45.0 和 Opera 33.0 仍然存在这个问题,不过 chrome 49.0 和 Opera 37.0 看起来已经被修复了。

为了有效的绕过这个问题,并且实现相同的效果,我们可以将代码修改如下:

html {
  font-size: 62.5%;
}
body {
  font-size: 1.4em;
}

由于 body 是 html 的直接子元素,所以此时对 body 使用 em 与 rem 的效果是相同的。

不要对html设置百分比字号

很严肃的和大家说,如果你在使用 rem 这项技术,那么尽可能不要对html设置百分比大小的字号。比如这样的:

html {
  font-size: 62.5%;
}

由于大部分浏览器的默认字号是 16px,所以能计算出 html 的字号实际为 10px。我们在 为什么小于12px字号不生效 中说过,部分浏览器会将小于 12px 的字变成 12px 来显示。那么此时,在这些浏览器下,如果我做了这样的定义:

.demo {
	width: 10rem;
}

你预期得到 10px * 10rem = 100px,但实际上得到的确是 12px * 10rem = 120px。这是非常大的错误,我们应当尽量避免。

与此同时,虽然大部分浏览器的默认字号是 16px,但仍然有使用其它默认值的浏览器,比如我依稀记得 firefox 使用了 15px。而且最重要的是,用户是可以改变浏览器默认字号的,所以你认为的可能并不是你认为的。

所以不要对html设置百分比字号,尤其是不要对它使用计算值比 12px 小的字号。我推荐大家这样做:

html {
  font-size: 100px;
}

以 100px 作为因子,计算也非常方便。如果你想要设置一个元素的宽度是 20px,那么只需要:

.demo {
	width: .2rem;
}

经验

禁止保存或拷贝图像

通常当你在手机或者pad上长按图像 img ,会弹出选项 存储图像 或者 拷贝图像,如果你不想让用户这么操作,那么你可以通过以下方法来禁止:

img {
	-webkit-touch-callout: none;
}

需要注意的是,该方法只在 iOS 上有效。

取消touch高亮

在移动设备上,所有设置了伪类 :active 的元素,默认都会在激活状态时,显示高亮框,如果不想要这个高亮,那么你可以通过以下方法来禁止:

.xxx {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

禁止选中内容

如果你不想用户可以选中页面中的内容,那么你可以禁掉:

html {
	-webkit-user-select: none;
}

快速回弹滚动

  1. 早期的时候,移动端的浏览器都不支持非body元素的滚动条,所以一般都借助 iScroll;
  2. Android 3.0/iOS解决了非body元素的滚动问题,但滚动条不可见,同时iOS上只能通过2个手指进行滚动;
  3. Android 4.0解决了滚动条不可见及增加了快速回弹滚动效果,不过随后这个特性又被移除;
  4. iOS从5.0开始解决了滚动条不可见及增加了快速回弹滚动效果

在iOS上如果你想让一个元素拥有像 Native 的滚动效果,你可以这样做:

.xxx {
	overflow: auto; /* auto | scroll */
	-webkit-overflow-scrolling: touch; /* 该规则可能引起iOS UIWebView崩溃 */
}

设置添加到主屏幕的Web App标题

iOS Safari 允许用户将一个网页添加到主屏幕然后像 App 一样来操作它。我们知道每个 App 下方都会有一个名字,iOS Safari 提供了一个私有的 meta 来定义这个名字,代码如下:

<meta name="apple-mobile-web-app-title" content="Web App名称" />

Android Chrome31.0Android Browser5.0 也开始支持添加到主屏幕了,但并没有提供相应的定义标题的方式,所以如果你想统一 iOS 和 Android 平台定义 Web app 名称的方式,可以使用 title 标签来定义,代码如下:

<title>Web App名称</title>

但如果你想要网页标题和App名字不一样的话,那就只有iOS才行。

设置添加到主屏幕的Web App图标

当我们将一个网页添加到主屏幕时,除了会需要设置标题之外,肯定还需要能够自定义这个App的图标,代码如下:

<link rel="apple-touch-icon" href="app.png" />

不过该方案,在拟物设计的 iOS6及以前 会自动为图标添加一层高光效果,iOS7 已使用了扁平化设计,所以如果使用该方案,在不同版本下得到的效果会不一致。

当然,你也可以使用原图作为App的图标,用以保持各平台表现一致,代码如下:

<link rel="apple-touch-icon-precomposed" href="app.png" />

如果你想给不同的设备定不同的图标,可以通过 sizes 属性来定义,形如:

<link rel="apple-touch-icon" sizes="76x76" href="[email protected]" />
<link rel="apple-touch-icon" sizes="120x120" href="[email protected]" />
<link rel="apple-touch-icon" sizes="152x152" href="[email protected]" />
<link rel="apple-touch-icon" sizes="180x180" href="[email protected]" />

规则如下:

  • 如果没有跟相应设备推荐尺寸一致的图标,会优先选择比推荐尺寸大并且最接近推荐尺寸的图标。
  • 如果没有比推荐尺寸大的图标,会优先选择最接近推荐尺寸的图标。
  • 如果有多个图标符合推荐尺寸,会优先选择包含关键字precomposed的图标。

实际情况下,大部分智能手机都接近或者已经达到视网膜屏质量,所以如果想省事的话,可以分别为 iPhone 和 iPad 定义一种高质量的 icon 即可。

该方案在 iOS 和 Android5.0+ 上都通用。

添加到主屏幕时隐藏地址栏和状态栏(即全屏)

当我们将一个网页添加到主屏幕时,会更希望它能有像 App 一样的表现,没有地址栏和状态栏全屏显示,代码如下:

<meta name="apple-mobile-web-app-capable" content="yes" />

该方案在 iOS 和 Android5.0+ 上都通用。

添加到主屏幕时设置系统顶栏颜色

当我们将一个网页添加到主屏幕时,还可以对 系统显示手机信号、时间、电池的顶部状态栏 颜色进行设置,前提是开启了:

<meta name="apple-mobile-web-app-capable" content="yes" />

有了这个前提,你可以通过下面的方式来进行定义:

<meta name="apple-mobile-web-app-status-bar-style" content="black" />

content只有3个固定值可选:default | black | black-translucent

  • 如果设置为 default,状态栏将为正常的,即白色,网页从状态栏以下开始显示;
  • 如果设置为 black,状态栏将为黑色,网页从状态栏以下开始显示;
  • 如果设置为 black-translucent,状态栏将为灰色半透明,网页将充满整个屏幕,状态栏会盖在网页之上;

该设置只在 iOS 上有效。

电话号码识别

在 iOS Safari (其他浏览器和Android均不会)上会对那些看起来像是电话号码的数字处理为电话链接,比如:

  • 7位数字,形如:1234567
  • 带括号及加号的数字,形如:(+86)123456789
  • 双连接线的数字,形如:00-00-00111
  • 11位数字,形如:13800138000

可能还有其他类型的数字也会被识别,但在具体的业务场景中,有些时候这是不必须的,所以你可以关闭电话自动识别,然后在需要拨号的地方,开启电话呼出和短信功能。

  1. 关闭电话号码识别:
<meta name="format-detection" content="telephone=no" />
  1. 开启拨打电话功能:
<a href="tel:123456">123456</a>
  1. 开启发送短信功能:
<a href="sms:123456">123456</a>

邮箱地址识别

在 Android (iOS不会)上,浏览器会自动识别看起来像邮箱地址的字符串,不论有你没有加上邮箱链接,当你在这个字符串上长按,会弹出发邮件的提示。

  1. 关闭邮箱地址识别:
<meta name="format-detection" content="email=no" />
  1. 开启邮件发送:
<a href="mailto:[email protected]">[email protected]</a>

如果想同时关闭电话和邮箱识别,可以把它们写到一条 meta 内,代码如下:

<meta name="format-detection" content="telephone=no,email=no" />

关闭iOS键盘首字母自动大写

在iOS中,默认情况下键盘是开启首字母大写的功能的,如果业务不想出现首字母大写,可以这样:

<input type="text" autocapitalize="off" />

关闭iOS输入自动修正

在iOS中,默认输入法会开启自动修正输入内容的功能,如果不需要的话,可以这样:

<input type="text" autocorrect="off" />

禁止文本缩放

当移动设备横竖屏切换时,文本的大小会重新计算,进行相应的缩放,当我们不需要这种情况时,可以选择禁止:

html {
	-webkit-text-size-adjust: 100%;
}

需要注意的是,PC端的该属性已经被移除,该属性在移动端要生效,必须设置 `meta viewport‘

时间: 2024-10-11 22:40:56

前端----移动的相关文章

前端自动化之webstrom

在刚接触前端的时候,使用的就一直是webstrom,版本是webstrom 8. 前端自动画使用的时候,因为webstrom 8版本是没有集成gulp的.所以每次使用都默默跑到Hbuild中使用. 实际最近在webstrom 12中找到了简单的方法,就连cmd都省了. 上图: 在gulp的gulpfile.js文件上右击,点击Show Gulp Tasks 会弹出gulp的控制窗口: 然后右键服务,点击run即可.

Day12 前端html

前端基础之HTML 老师博客: http://www.cnblogs.com/yuanchenqi/articles/6835654.html http://www.cnblogs.com/yuanchenqi/articles/6856399.html html:静态的内容都是一个html标签,是有一组组标签构成的文件 css:对一个个标签做渲染定位 js:所有页面的动态效果做渲染定位 当写一个简单服务端的时候,一般这样写: 主要的是这:conn.send=("HTTP/1.1 201 OK

前端里移动端到底比pc端多哪些知识?

前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何? 我做过几年的web前端开发,就简单谈谈自己的感受吧. 首先来看看PC端和移动端在前端开发上的一些区别: (1)PC考虑的是浏览器兼容性,移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器用的都是webkit内核,所以做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化: (2)在部分事件的处理上,移动端自然是偏向于触屏的,所以触屏事件的一些规律要多摸索一下,

一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML 5.CSS 3.JavaScript 跨平台框架:React Native.Cordova 前端工程化:Grunt.Gulp.Webpack 前端预编译:Babel.Sass.Less 自动化测试:Jasmine.Mocha.Karma 一图在手,应有尽有! 更多信息参考:https://item.jd.com/12170351.h

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

前端页面适配的rem换算

为什么要使用rem 之前有些适配做法,是通过js动态计算viewport的缩放值(initial-scale). 例如以屏幕320像素为基准,设置1,那屏幕375像素就是375/320=1.18以此类推. 但直接这样强制页面缩放过于粗暴,会导致页面图片文字失真模糊. Px是相对固定单位,字号大小直接被定死,所以用户无法根据自己设置的浏览器字号而缩放,em和rem虽然都是相对单位,但em是相对于它的父元素的font-size,页面层级越深,em的换算就越复杂,而rem是直接相对于根元素,这就避开了

一个前端所需具备的PS能力

前端网页设计+静态实现案例 放一个2天半内给某公司完成的(设计 + 静态实现)的案例吧,静态阴影用CSS3实现的http://www.cnblogs.com/MuYunyun/p/5693615.html,我最开始设计的时候就想好要用什么实现,各个框的大小是多少(精确到1像素),以及颜色搭配等等. 还有很多素材我就不演示了,设计了好些网页模板,如果有大家想用PS进行网页制作,欢迎大家交流. 很多人做前端只是掌握了最基本的切图(甚至连切图都有不会的),就连小小改动都要麻烦设计师,这就大大浪费了时间

分享第二届中国前端开发者大会与会心得

第二届中国前端开发者大会(FDCon2017)是在上海举办的针对前端技术(HTML5,CSS,JS)的互联网开发者所举办的最盛大和权威的相关技术会议,由技术社区TopGeek主办.汇智Tek联合主办,致力于推动各类前端技术等在移动互联网领域的研发和应用. 随着新一代的前端技术的发展,给前端开发者带来巨大的创新应用实践机会,本大会以“高效前端开发实践和创新”为主题,内容涵盖电商.旅游.门户.搜索.分类广告.移动互联网等多种业态的技术经验分享,涉及各种WEB和APP前端开发技术和架构设计等方法论.

前端开发四

7.闭包问题 闭包:函数能被外部调用到,则该作用连上的所有变量都会被保存下来. 作用:①可以读取函数内部的变量:②相当于划出了一块私有作用域,避免数据污染:③让变量始终保存在内存中 使用全局变量被认为是不好的习惯,而且容易造成错误并且维护成本较高,所以js可以采用闭包的方式读取函数的内部变量.但是如果大量使用闭包就会造成过多的变量始终保存在内存中,会造成内存泄漏. 一个简单的闭包例子: function f1(){ var n=999; function f2(){ alert(n); } re

大公司里开发部署前端代码

作者:张云龙链接:https://www.zhihu.com/question/20790576/answer/32602154来源:知乎著作权归作者所有,转载请联系作者获得授权. 前百度工程师,曾负责百度 前端集成解决方案 的核心设计与开发工作.我现在称这个领域为[前端工程].没错,这是我最爱唠叨的问题域. 这是一个非常有趣的 非主流前端领域,这个领域要探索的是如何用工程手段解决前端开发和部署优化的综合问题,入行到现在一直在学习和实践中. 在我的印象中,facebook是这个领域的鼻祖,有兴趣