移动端开发常见问题(三)

关闭iOS输入自动修正

和英文输入默认自动首字母大写那样,IOS还做了一个功能,默认输入法会开启自动修正输入内容,这样的话,用户经常要操作两次。如果不希望开启此功能,我们可以通过input标签属性来关闭掉:

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

禁止文本缩放

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

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

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

移动端如何清除输入框内阴影

在iOS上,输入框默认有内部阴影,但无法使用 box-shadow 来清除,如果不需要阴影,可以这样关闭:

1
2
3
4
input,textarea {
  border: 0; /* 方法1 */
  -webkit-appearance: none; /* 方法2 */
}

快速回弹滚动

我们先来看看回弹滚动在手机浏览器发展的历史:

  • 早期的时候,移动端的浏览器都不支持非body元素的滚动条,所以一般都借助 iScroll;
  • Android 3.0/iOS解决了非body元素的滚动问题,但滚动条不可见,同时iOS上只能通过2个手指进行滚动;
  • Android 4.0解决了滚动条不可见及增加了快速回弹滚动效果,不过随后这个特性又被移除;
  • iOS从5.0开始解决了滚动条不可见及增加了快速回弹滚动效果
    在iOS上如果你想让一个元素拥有像 Native 的滚动效果,你可以这样做:
    1
    2
    3
    4
    .xxx {
    overflow: auto; /* auto | scroll */
    -webkit-overflow-scrolling: touch;
    }

PS:iScroll用过之后感觉不是很好,有一些诡异的bug,这里推荐另外一个 iDangero Swiper,这个插件集成了滑屏滚动的强大功能(支持3D),而且还有回弹滚动的内置滚动条。iDangero官方地址: http://www.idangero.us/swiper/#.VX_t9PmEB8Y

移动端禁止选中内容

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

1
2
3
4
5
.user-select-none {
-webkit-user-select: none; /* Chrome all / Safari all */
-moz-user-select: none; /* Firefox all (移动端不需要) */
-ms-user-select: none; /* IE 10+ */
}

移动端取消touch高亮效果

在做移动端页面时,会发现所有a标签在触发点击时或者所有设置了伪类 :active 的元素,默认都会在激活状态时,显示高亮框,如果不想要这个高亮,那么你可以通过css以下方法来进行全局的禁止:

1
2
3
html {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

但这个方法在三星的机子上无效,有一种妥协的方法是把页面非真实跳转链接的a标签换成其它标签,可以解决这个问题。

如何禁止保存或拷贝图像(IOS)

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

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

模拟按钮hover效果

移动端触摸按钮的效果,可明示用户有些事情正要发生,是一个比较好体验,但是移动设备中并没有鼠标指针,使用css的hover并不能满足我们的需求,还好国外有个激活css的active效果,代码如下

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="telephone=no" name="format-detection">
<meta content="email=no" name="format-detection">
<style type="text/css">
a{-webkit-tap-highlight-color: rgba(0,0,0,0);}
.btn-blue{display:block;height:42px;line-height:42px;text-align:center;border-radius:4px;font-size:18px;color:#FFFFFF;background-color: #4185F3;}
.btn-blue:active{background-color: #357AE8;}
</style>
</head>
<body>
<div class="btn-blue">按钮</div>
<script type="text/javascript">
document.addEventListener("touchstart", function(){}, true)
</script>
</body>
</html>
兼容性ios5+、部分android 4+、winphone 8
要做到全兼容的办法,可通过绑定ontouchstart和ontouchend来控制按钮的类名。
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="telephone=no" name="format-detection">
<meta content="email=no" name="format-detection">
<style type="text/css">
a{-webkit-tap-highlight-color: rgba(0,0,0,0);}
.btn-blue{
display:block;
height:42px;line-height:42px;
text-align:center;border-radius:4px;
font-size:18px;color:#FFFFFF;background-color: #4185F3;}
.btn-blue-on{background-color: #357AE8;}
</style>
</head>
<body>
<div class="btn-blue">按钮</div>
<script type="text/javascript">
var btnBlue = document.querySelector(".btn-blue");
btnBlue.ontouchstart = function(){
this.className = "btn-blue btn-blue-on"
}
btnBlue.ontouchend = function(){
this.className = "btn-blue"
}
</script>
</body>
</html>

屏幕旋转的事件和样式

事件
window.orientation,取值:正负90表示横屏模式、0和180表现为竖屏模式

1
2
3
4
5
6
7
8
9
10
11
window.onorientationchange = function(){
switch(window.orientation){
case -90:
case 90:
alert("横屏:" + window.orientation);
case 0:
case 180:
alert("竖屏:" + window.orientation);
break;
}
}

样式

1
2
3
4
5
6
7
8
9
//竖屏时使用的样式
@media all and (orientation:portrait) {
.css{}
}
//横屏时使用的样式
@media all and (orientation:landscape) {
.css{}
}

audio元素和video元素在ios和andriod中无法自动播放

应对方案:触屏即播

1
2
3
$('html').one('touchstart',function(){
audio.play()
})

摇一摇功能

HTML5 deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据。

手机拍照和上传图片

1
2
3
4
5
<input type="file">的accept 属性
<!-- 选择照片 -->
<input type=file accept="image/*">
<!-- 选择视频 -->
<input type=file accept="video/*">

使用总结:

  • iOS有拍照、录像、选取本地图片功能
  • 部分android只有选取本地图片功能
  • winphone不支持
  • input控件默认外观丑陋

消除transition闪屏

1
2
3
4
5
6
.css{
/*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/
-webkit-transform-style: preserve-3d;
/*(设置进行转换的元素的背面在面对用户时是否可见:隐藏)*/
-webkit-backface-visibility: hidden;
}

开启硬件加速

  • 解决页面闪白
  • 保证动画流畅
    1
    2
    3
    4
    5
    6
    .css {
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0);
    -ms-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
    }

设计高性能CSS3动画的几个要素

  • 尽可能地使用合成属性transform和opacity来设计CSS3动画
  • 不使用position的left和top来定位
  • 利用translate3D开启GPU加速

android 上去掉语音输入按钮

1
input::-webkit-input-speech-button {display: none}

常用框架

移动端基础框架

  • zepto.js语法与jquery几乎一样,会jquery基本会zepto;
  • iscroll.js解决页面不支持弹性滚动,不支持fixed引起的问题~ 实现下拉刷新,滑屏,缩放等功能;
  • underscore.js该库提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象;
  • fastclick加快移动端点击响应时间
  • animate.css CSS3动画效果库

    滑屏框架

    适合上下滑屏、左右滑屏等滑屏切换页面的效果
  • slip.js
  • iSlider.js
  • fullpage.js

    瀑布流框架

  • masonry

    工具推荐

  • caniuse 各浏览器支持html5属性查询
  • paletton 调色搭配
文章目录
  1. 1. 关闭iOS输入自动修正
  2. 2. 禁止文本缩放
  3. 3. 移动端如何清除输入框内阴影
  4. 4. 快速回弹滚动
  5. 5. 移动端禁止选中内容
  6. 6. 移动端取消touch高亮效果
  7. 7. 如何禁止保存或拷贝图像(IOS)
  8. 8. 模拟按钮hover效果
  9. 9. 屏幕旋转的事件和样式
  10. 10. audio元素和video元素在ios和andriod中无法自动播放
  11. 11. 摇一摇功能
  12. 12. 手机拍照和上传图片
  13. 13. 消除transition闪屏
  14. 14. 开启硬件加速
  15. 15. android 上去掉语音输入按钮
  16. 16. 常用框架
    1. 16.1. 移动端基础框架
    2. 16.2. 滑屏框架
    3. 16.3. 瀑布流框架
    4. 16.4. 工具推荐
|