技术控

    今日:53| 主题:49507
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 收集移动端开发所需要的一些资源与小技巧

[复制链接]
什麽者β不懂 发表于 2016-10-5 07:44:58
136 5

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
mobileTech

  A useful tools or tips list for mobile web application developing
  这个项目收集移动端开发所需要的一些资源与小技巧
  移动端统计 (from BiosSun)

  可基于下方所列出的统计数据来决定您要兼容的设备及浏览器。
   百度移动统计
   友盟指数
   CNZZ 桌面及移动端浏览器统计
   全球移动端浏览器统计
  工具类网站

   HTML5 与 CSS3 技术应用评估
   各种奇妙的hack
   几乎所有设备的屏幕尺寸与像素密度表
   移动设备参数表
   ios端移动设备参数速查
   浏览器兼容表
   移动设备查询器
   移动设备适配库
   移动设备适配库2
   viewport与设备尺寸在线检测器
   html5 移动端兼容性速查
   在线转换字体
   css3 选择器测试
   测试浏览器对 ECMAScript6 的支持度
   兼容性速查表
   浏览器的一些独特参数
   各种各样的媒体查询收集
   css3 动画在线制作器
   css3 渐变在线制作器
   移动端手势表
   webkit独有的样式分析
   HTML5 Cross Browser Polyfills
   HTML5 POLYFILLS
  iphone6的那些事

   iPhone 6 屏幕揭秘
  响应式测试工具

   Firefox 浏览器内置了 自定义设计视图 的功能,可以通过 Firefox->Web 开发者->自定义设计视图 (或者摁下 Shift + Ctrl + m )。相比网络工具,运行更加流畅,无需联网。
   判断 iPad 和 iPhone 的版本和状态的 CSS 媒体查询代码
   Viewport Resizer
   http://beta.screenqueri.es/
   http://responsivepx.com
   http://www.responsinator.com/
   http://resizemybrowser.com/
   https://quirktools.com/screenfly/
  媒体查询常用样式表:
  [code]    // 竖放加载
   // 横放加载

//竖屏时使用的样式


//横屏时使用的样式
[/code]  Web app 开发的最佳实践与中文总结

   It’s not a web app. It’s an app you install from the web.
   当前 WEB APP 开发的最佳实践
   如何自适应网页屏幕 以及配套的解决方案
   手Q开发过程中经验沉淀
   来自maxzhang的一些移动端经验总结干货

   移动Web单页应用开发实践——页面结构化
   移动Web产品前端开发口诀——“快”
   移动Web开发,4行代码检测浏览器是否支持position:fixed
   使用border-image实现类似iOS7的1px底边
   移动端web页面使用position:fixed问题总结
   移动Web开发实践——解决position:fixed自适应BUG
   移动手机浏览器m3u8格式视频流播放支持程度测试
  本资料很多引用了指尖上的js系列

   指尖下的js ——多触式web前端开发之一:对于Touch的处理
   指尖下的js ——多触式web前端开发之二:处理简单手势
   指尖下的js —— 多触式web前端开发之三:处理复杂手势
  基础知识

  meta标签

   meta标签大全 http://segmentfault.com/blog/ciaocc/1190000002407912
  meta标签,这些meta标签在开发webapp时起到非常重要的作用
  [code]


[/code]  第一个meta标签表示:强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏幕放大浏览; 尤其要注意的是content里多个属性的设置一定要用分号+空格来隔开,如果不规范将不会起作用。
   注意根据public_00 提供的资料补充,content 使用分号作为分隔,在老的浏览器是支持的,但不是规范写法。
   规范的写法应该是使用逗号分隔,参考 Safari HTML Reference - Supported Meta Tags 和 Android - Supporting Different Screens in Web Apps
  其中:
  
       
  • width - viewport的宽度   
  • height - viewport的高度   
  • initial-scale - 初始的缩放比例   
  • minimum-scale - 允许用户缩放到的最小比例   
  • maximum-scale - 允许用户缩放到的最大比例   
  • user-scalable - 用户是否可以手动缩放  
  第二个meta标签是iphone设备中的safari私有meta标签,它表示:允许全屏模式浏览; 第三个meta标签也是iphone的私有标签,它指定的iphone中safari顶端的状态条的样式; 第四个meta标签表示:告诉设备忽略将页面中的数字识别为电话号码
  在设置了initial-scale=1 之后,我们终于可以以1:1 的比例进行页面设计了。 关于viewport,还有一个很重要的概念是:iphone 的safari 浏览器完全没有滚动条,而且不是简单的“隐藏滚动条”, 是根本没有这个功能。iphone 的safari 浏览器实际上从一开始就完整显示了这个网页,然后用viewport 查看其中的一部分。 当你用手指拖动时,其实拖的不是页面,而是viewport。浏览器行为的改变不止是滚动条,交互事件也跟普通桌面不一样。 (请参考:指尖的下JS 系列文章)
  更详细的 viewport 相关的知识也可以参考
   此像素非彼像素
  适配类文章

   移动端高清、多屏适配方案
   手机淘宝的flexible设计与实现
  移动开发事件

   手机浏览器常用手势动作监听封装
  手势事件

  
       
  • touchstart //当手指接触屏幕时触发   
  • touchmove //当已经接触屏幕的手指开始移动后触发   
  • touchend //当手指离开屏幕时触发   
  • touchcancel  
  触摸事件

  
       
  • gesturestart //当两个手指接触屏幕时触发   
  • gesturechange //当两个手指接触屏幕后开始移动时触发   
  • gestureend  
  屏幕旋转事件

  
       
  • onorientationchange  
  检测触摸屏幕的手指何时改变方向

  
       
  • orientationchange  
  touch事件支持的相关属性

  
       
  • touches   
  • targetTouches   
  • changedTouches   
  • clientX // X coordinate of touch relative to the viewport (excludes scroll offset)   
  • clientY // Y coordinate of touch relative to the viewport (excludes scroll offset)   
  • screenX // Relative to the screen   
  • screenY // Relative to the screen   
  • pageX // Relative to the full page (includes scrolling)   
  • pageY // Relative to the full page (includes scrolling)   
  • target // Node the touch event originated from   
  • identifier // An identifying number, unique to each touch event   
  • 屏幕旋转事件:onorientationchange  
  判断屏幕是否旋转

  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};[/code]  添加事件监听

  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});[/code]  JS 单击延迟

  click 事件因为要等待单击确认,会有 300ms 的延迟,体验并不是很好。
  开发者大多数会使用封装的 tap 事件来代替click 事件,所谓的 tap 事件由 touchstart 事件 + touchmove 判断 + touchend 事件封装组成。
   Creating Fast Buttons for Mobile Web Applications
   Eliminate 300ms delay on click events in mobile Safari
  WebKit CSS:

   携程 UED 整理的 Webkit CSS 文档 ,全面、方便查询,下面为常用属性。
  ①“盒模型”的具体描述性质的包围盒块内容,包括边界,填充等等。
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button[/code]  ②“视觉格式化模型”描述性质,确定了位置和大小的块元素。
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal[/code]  ③“视觉效果”描述属性,调整的视觉效果块内容,包括溢出行为,调整行为,能见度,动画,变换,和过渡。
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)[/code]  ④“生成的内容,自动编号,并列出”描述属性,允许您更改内容的一个组成部分,创建自动编号的章节和标题,和操纵的风格清单的内容。
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;[/code]  ⑤“分页媒体”描述性能与外观的属性,控制印刷版本的网页,如分页符的行为。
  [code]page-break-after: auto; 常量:always/auto/avoid/left/right
page-break-before: auto; 常量:always/auto/avoid/left/right
page-break-inside: auto; 常量:auto/avoid[/code]  ⑥“颜色和背景”描述属性控制背景下的块级元素和颜色的文本内容的组成部分。
  [code]-webkit-background-clip: content; 常量:border/content/padding/text
-webkit-background-origin: padding; 常量:border/content/padding/text
-webkit-background-size: 55px; 常量:length/length_x/length_y[/code]  ⑦ “字型”的具体描述性质的文字字体的选择范围内的一个因素。报告还描述属性用于下载字体定义。
  [code]


0[/code]  ⑧“文本”描述属性的特定文字样式,间距和自动滚屏。
  [code]


1[/code]  ⑨“表格”描述的布局和设计性能表的具体内容。
  [code]


2[/code]  ⑩“用户界面”描述属性,涉及到用户界面元素在浏览器中,如滚动文字区,滚动条,等等。报告还描述属性,范围以外的网页内容,如光标的标注样式和显示当您按住触摸触摸 目标,如在iPhone上的链接。
  [code]


3[/code]  动画过渡 这是 Webkit 中最具创新力的特性:使用过渡函数定义动画。
  [code]


4[/code]  这些同样是可以简写的。但真正让我觉的很爽的是keyframes,它能定义一个动画的转变过程供调用,过程为0%到100%或from(0%)到to(100%)。简单点说,只要你有想法,你想让元素在这个过程中以什么样的方式改变都是很简单的。
  [code]


5[/code]  ###自定义滚动条 from unknown
  有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了。那webkit浏览器是如何自定义滚动条的呢? 参考:
  
       
  • http://www.xuanfengge.com/css3-webkit-scrollbar.html   
  •   http://www.zhaoan.org/849.html
    后记:有时候,我们开发H5页面时为了美观,可能会隐藏滚动条,那么此时只要使用如下CSS代码即可实现
    ::-webkit-scrollbar { width: 0; height: 0; }
      
  页面描述

  [code]


6[/code]  这个属性是当用户把连接保存到手机桌面时使用的图标,如果不设置,则会用网页的截图。有了这,就可以让你的网页像APP一样存在手机里了
  [code]


7[/code]  这个是APP启动画面图片,用途和上面的类似,如果不设置,启动画面就是白屏,图片像素就是手机全屏的像素
  [code]


8[/code]   这个描述是表示打开的web app的最上面的时间、信号栏是黑色的,当然也可以设置其它参数,详细参数说明请参照: Safari HTML Reference - Supported Meta Tags
  [code]


9[/code]  常见的 iPhone 和 Android 屏幕参数。

  
       
  • 设备 分辨率 设备像素比率   
  • Android LDPI 320×240 0.75   
  • Iphone 3 & Android MDPI 320×480 1   
  • Android HDPI 480×800 1.5   
  • Iphone 4 960×640 2.0  
  iPhone 4的一个 CSS 像素实际上表现为一块 2×2 的像素。所以图片像是被放大2倍一样,模糊不清晰。
  解决办法:
  1、页面引用
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};0[/code]  2、CSS文件里
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};1[/code]  移动 Web 开发经验技巧

  性能优化(来自同事 李文 的分享与整理)

  技术相关

  
       
  • 离线缓存   
  • css优化【3d动画优化】   
  • js优化 【js worker】   
  • spdy,http2   
  • service worker   
  • 入口dns预解析   
  • 域名收敛   
  • cookie压缩   
  • 网速及网络情况侦测   
  • webp  
  策略相关

  
       
  • 前端资源压缩去重   
  • 首屏前置与资源lazyload   
  • 页面模板与数据分离   
  • 适当的base64,首屏css不建议使用   
  • script 异步   
  • 后台智能加载下一页   
  • 图片渐进显示  
  参考资料

   7 天打造前端性能监控系统
   16_ms_optimization—web_front-end_performance_optimization
   velocity 2011 移动互联网应用的性能优化
   Medium图片加载模式
   Web性能权威指南
   Google 性能优化
   http2资料汇总
   离线缓存使用规范
   12步创建高性能Web APP
   css加载方式
   Google AMP (AMP is a way to build web pages for static content that render fast)
   缓存最佳实践
   以层为基础的渲染加速-chrome
  点击与click事件

  对于a标记的点击导航,默认是在onclick事件中处理的。而移动客户端对onclick的响应相比PC浏览器有着明显的几百毫秒延迟。
  在移动浏览器中对触摸事件的响应顺序应当是:
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};2[/code]  因此,如果确实要加快对点击事件的响应,就应当绑定ontouchend事件。
  使用click会出现绑定点击区域闪一下的情况,解决:给该元素一个样式如下
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};3[/code]  如果不使用click,也不能简单的用touchstart或touchend替代,需要用touchstart的模拟一个click事件,并且不能发生touchmove事件,或者用zepto中的tap(轻击)事件。
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};4[/code]   用iphone或ipad浏览很长的网页滚动时的滑动效果很不错吧?不过如果是一个div,然后设置 height:200px;overflow:auto; 的话,可以滚动但是完全没有那滑动效果,很郁闷吧?
   我看到很多网站为了实现这一效果,用了第三方类库,最常用的是iscroll(包括新浪手机页,百度等) 我一开始也使用,不过自从用了 -webkit-overflow-scrolling: touch; 样式后,就完全可以抛弃第三方类库了,把它加在body{}区域,所有的overflow需要滚动的都可以生效了。
   另外有一篇比较全的移动端点击解决方案 http://www.zhihu.com/question/28979857
  锁定 viewport

  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};5[/code]  利用 Media Query监听

  Media Query 相信大部分人已经使用过了。其实 JavaScript可以配合 Media Query这么用:
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};6[/code]  借助了 Media Query 接口做的事件监听,所以很强大!
   也可以通过获取 CSS 值来使用 Media Query 判断设备情况,详情请看: JavaScript 依据 CSS Media Queries 判断设备的方法 。
  rem最佳实践

  rem是非常好用的一个属性,可以根据html来设定基准值,而且兼容性也很不错。不过有的时候还是需要对一些莫名其妙的浏览器优雅降级。以下是两个实践
  
       
  • http://jsbin.com/vaqexuge/4/edit 这有个demo,发现chrome当font-size小于12时,rem会按照12来计算。因此设置基准值要考虑这一点   
  • 可以用以下的代码片段保证在低端浏览器下也不会出问题
      html { font-size: 62.5%; } body { font-size: 14px; font-size: 1.4rem; } /* =14px / h1 { font-size: 24px; font-size: 2.4rem; } / =24px */
      
  被点击元素的外观变化,可以使用样式来设定:

  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};7[/code]  检测判断 iPhone/iPod

  开发特定设备的移动网站,首先要做的就是设备侦测了。下面是使用Javascript侦测iPhone/iPod的UA,然后转向到专属的URL。
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};8[/code]  判断软键盘弹出

  
       
  • android上,当软键盘状态改变的时候,会触发window的resize事件,所以我们可以进入页面的时候保存一次window.innerHeight的值,当window的resize事件触发的时候,比较window.innerHeight的值与前一次保存的window.innerHeight的值大小来判断软键盘的收拢和弹出状态。
    var winHeight = window.innerHeight; if (isAndroid) { window.addEventListener('resize', function(e) { var tempHeight = window.innerHeight if (tempHeight < winHeight) { bShowRec = false; } else { bShowRec = true; } }); }
       
  • ios上,软键盘状态改变的时候,不会触发window的resize事件,但是当软键盘的“完成”按钮被点击的时候,会触发onblur事件。所以正常通过onfocus和onblur事件来判断就行。
      
  虽然Javascript是可以在水果设备上运行的,但是用户还是可以禁用。它也会造成客户端刷新和额外的数据传输,所以下面是服务器端侦测和转向:
  [code]function orientationChange() {
    switch(window.orientation) {
      case 0:
            alert("肖像模式 0,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case -90:
            alert("左旋 -90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 90:
            alert("右旋 90,screen-width: " + screen.width + "; screen-height:" + screen.height);
            break;
      case 180:
          alert("风景模式 180,screen-width: " + screen.width + "; screen-height:" + screen.height);
          break;
    };};9[/code]  阻止旋转屏幕时自动调整字体大小

  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});0[/code]  禁止body滚动

  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});1[/code]  页面长按,高亮全选文本

  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});2[/code]  模拟:hover伪类

  因为iPhone并没有鼠标指针,所以没有hover事件。那么CSS :hover伪类就没用了。但是iPhone有Touch事件,onTouchStart 类似 onMouseOver,onTouchEnd 类似 onMouseOut。所以我们可以用它来模拟hover。使用Javascript:
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});3[/code]  然后用CSS增加hover效果:
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});4[/code]  这样设计一个链接,感觉可以更像按钮。并且,这个模拟可以用在任何元素上。
  Flexbox 布局

   Flex 模板和实例
   深入了解 Flexbox 伸缩盒模型
   CSS Flexbox Intro
   http://www.w3.org/TR/css3-flexbox/
  居中问题

  居中是移动端跟pc端共同的噩梦。这里有两种兼容性比较好的新方案。
  
       
  • table布局法
    .box{ text-align:center; display:table-cell; vertical-align:middle; }
       
  • 老版本flex布局法
    .box{ display:-webkit-box; -webkit-box-pack: center; -webkit-box-align: center; text-align:center; }
      
  以上两种其实分别是retchat跟ionic的布局基石。
   这里有更详细的更多的选择 http://www.zhouwenbin.com/%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/ 来自周文彬的博客
  h5底部输入框被键盘遮挡问题

  h5页面有个很蛋疼的问题就是,当输入框在最底部,点击软键盘后输入框会被遮挡。
   可以使用这个api,在点击input的时候调用即可 https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView
  如果切换输入法,由于不同输入法高度不同,又会出现被遮挡问题。由于无法捕获切换输入法的事件,因此可以开一个计时器,不断执行sscrollintoview即可。
  移动端实现标题文字截断

   http://www.75team.com/archives/611
  placeholder--line-height

  input 的placeholder会出现文本位置偏上的情况:PC端设置line-height等于height能够对齐,而移动端仍然是偏上,解决是设置line-height:normal,(stackoverflow也可查到这种解决办法)。
  处理 Retina 双倍屏幕

   (经典)Using CSS Sprites to optimize your website for Retina Displays
   使用CSS3的background-size优化苹果的Retina屏幕的图像显示
   使用 CSS sprites 来优化你的网站在 Retina 屏幕下显示
   (案例)CSS IMAGE SPRITES FOR RETINA (HIRES) DEVICES
  input类型为date情况下不支持placeholder(来自于江水)

  这其实是浏览器自己的处理。因为浏览器会针对此类型 input 增加 datepicker 模块。
  对 input type date 使用 placeholder 的目的是为了让用户更准确的输入日期格式,iOS 上会有 datepicker 不会显示 placeholder 文字,但是为了统一表单外观,往往需要显示。Android 部分机型没有 datepicker 也不会显示 placeholder 文字。
  桌面端(Mac)
  
       
  • Safari 不支持 datepicker,placeholder 正常显示。   
  • Firefox 不支持 datepicker,placeholder 正常显示。   
  • Chrome 支持 datepicker,显示 年、月、日 格式,忽略 placeholder。  
  移动端
  
       
  • iPhone5 iOS7 有 datepicker 功能,但是不显示 placeholder。   
  • Andorid 4.0.4 无 datepicker 功能,不显示 placeholder  
  解决方法:
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});5[/code]  因为text是支持placeholder的。因此当用户focus的时候自动把type类型改变为date,这样既有placeholder也有datepicker了
  判断照片的横竖排列

  有这样一种需求,需要判断用户照片是横着拍出来的还是竖着拍出来的,这里需要使用照片得exif信息:
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});6[/code]   可以使用这两个库 来取exif信息 http://www.nihilogic.dk/labs/binaryajax/binaryajax.js http://www.nihilogic.dk/labs/exif/exif.js
  Android上当viewport的width大于device-width时出现文字无故折行的解决办法

   http://www.iunbug.com/archives/2013/04/23/798.html
  白屏解决与优化方案

  当前很多无线页面都使用前端模板进行数据渲染,那么在糟糕的网速情况下,一进去页面,看到的不是白屏就是 loading,这成为白屏问题。
  此问题发生的原因基本可以归结为网速跟静态资源
  1、css文件加载需要一些时间,在加载的过程中页面是空白的。 解决:可以考虑将css代码前置和内联。 2、首屏无实际的数据内容,等待异步加载数据再渲染页面导致白屏。 解决:在首屏直接同步渲染html,后续的滚屏等再采用异步请求数据和渲染html。 3、首屏内联js的执行会阻塞页面的渲染。 解决:尽量不在首屏html代码中放置内联脚本。(来自翔歌)
  解决方案
  根本原因是客户端渲染的无力,因此最简单的方法是在服务器端,使用模板引擎渲染所有页面。同时
  1减少文件加载体积,如html压缩,js压缩 2加快js执行速度 比如常见的无限滚动的页面,可以使用js先渲染一个屏幕范围内的东西 3提供一些友好的交互,比如提供一些假的滚动条 4使用本地存储处理静态文件。
  h5 小特效实践

  加速度感应(摇一摇)

  if (window.DeviceMotionEvent) { window.addEventListener('devicemotion',deviceMotionHandler, false);
  } var speed = 30;//speed var x = y = z = lastX = lastY = lastZ = 0; function deviceMotionHandler(eventData) {
  var acceleration =event.accelerationIncludingGravity; x = acceleration.x; y = acceleration.y; z = acceleration.z; if(Math.abs(x-lastX) > speed || Math.abs(y-lastY) > speed || Math.abs(z-lastZ) > speed) { alert('别摇那么大力嘛...'); // your code here } lastX = x; lastY = y; lastZ = z; }
  抽奖转盘

  刮彩票

  全景效果

  描边动画

  翻书

  如何实现打开已安装的app,若未安装则引导用户安装?

   来自 http://gallery.kissyui.com/redirectToNative/1.2/guide/index.html kissy mobile 通过iframe src发送请求打开app自定义url scheme,如taobao://home(淘宝首页) 、etao://scan(一淘扫描)); 如果安装了客户端则会直接唤起,直接唤起后,之前浏览器窗口(或者扫码工具的webview)推入后台; 如果在指定的时间内客户端没有被唤起,则js重定向到app下载地址。 大概实现代码如下
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});7[/code]   需要注意的是 如果是android chrome 25版本以后,在iframe src不会发送请求, 原因如下 https://developers.google.com/chrome/mobile/docs/intents ,通过location href使用intent机制拉起客户端可行并且当前页面不跳转。
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});8[/code]   补充一个来自三水清的详细讲解 http://js8.in/2013/12/16/ios%E4%BD%BF%E7%94%A8schema%E5%8D%8F%E8%AE%AE%E8%B0%83%E8%B5%B7app/
  active的兼容(来自薛端阳)

  今天发现,要让a链接的CSS active伪类生效,只需要给这个a链接的touch系列的任意事件touchstart/touchend绑定一个空的匿名方法即可hack成功
  [code]addEventListener('load', function(){
    orientationChange();
    window.onorientationchange = orientationChange;
});9[/code]  消除transition闪屏

  两个方法:使用css3动画的时尽量利用3D加速,从而使得动画变得流畅。动画过程中的动画闪白可以通过 backface-visibility 隐藏。
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button0[/code]  测试是否支持svg图片

  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button1[/code]   考虑兼容“隐私模式”(from http://blog.youyo.name/archives/smarty-phones-webapp-deverlop-advance.html )

  ios的safari提供一种“隐私模式”,如果你的webapp考虑兼容这个模式,那么在使用html5的本地存储的一种————localStorage时,可能因为“隐私模式”下没有权限读写localstorge而使代码抛出错误,导致后续的js代码都无法运行了。
  既然在safari的“隐私模式”下,没有调用localStorage的权限,首先想到的是先判断是否支持localStorage,代码如下:
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button2[/code]  测试发现,即使在safari的“隐私模式”下,’localStorage’ in window的返回值依然为true,也就是说,if代码块内部的代码依然会运行,问题没有得到解决。 接下来只能相当使用try catch了,虽然这是一个不太推荐被使用的方法,使用try catch捕获错误,使后续的js代码可以继续运行,代码如下:
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button3[/code]  所以,提醒大家注意,在需要兼容ios的safari的“隐私模式”的情况下,本地存储相关的代码需要使用try catch包裹并降级兼容。
  安卓手机点击锁定页面效果问题

   有些安卓手机,页面点击时会停止页面的javascript,css3动画等的执行,这个比较蛋疼。不过可以用阻止默认事件解决。详细见 http://stackoverflow.com/questions/10246305/android-browser-touch-events-stop-display-being-updated-inc-canvas-elements-h
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button4[/code]  消除ie10里面的那个叉号

   IE Pseudo-elements
  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button5[/code]  关于ios与os端字体的优化(横竖屏会出现字体加粗不一致等)

   mac下网页中文字体优化
   UIWebView font is thinner in portrait than landscape
  判断用户是否是“将网页添加到主屏后,再从主屏幕打开这个网页”的

  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button6[/code]  隐藏地址栏 & 处理事件的时候,防止滚动条出现:

  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button7[/code]  ios7 可以通过meta标签的minimal来隐藏地址栏了

   http://darkblue.sdf.org/weblog/ios-7-dot-1-mobile-safari-minimal-ui.html
  判断是否为iPhone:

  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button8[/code]  localStorage:

  [code]-webkit-border-bottom-left-radius: radius;
-webkit-border-top-left-radius: horizontal_radius vertical_radius;
-webkit-border-radius: radius;      //容器圆角
-webkit-box-sizing: sizing_model; 边框常量值:border-box/content-box
-webkit-box-shadow: hoff voff blur color; //容器阴影(参数分别为:水平X 方向偏移量;垂直Y 方向偏移量;高斯模糊半径值;阴影颜色值)
-webkit-margin-bottom-collapse: collapse_behavior; 常量值:collapse/discard/separate
-webkit-margin-start: width;
-webkit-padding-start: width;
-webkit-border-image: url(borderimg.gif) 25 25 25 25 round/stretch round/stretch;
-webkit-appearance: push-button;   //内置的CSS 表现,暂时只支持push-button9[/code]  使用特殊链接:

  如果你关闭自动识别后 ,又希望某些电话号码能够链接到 iPhone 的拨号功能 ,那么可以通过这样来声明电话链接 ,
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal0[/code]  或用于单元格:
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal1[/code]  自动大写与自动修正

  要关闭这两项功能,可以通过autocapitalize 与autocorrect 这两个选项:
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal2[/code]  不让 Android 识别邮箱

  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal3[/code]  禁止 iOS 弹出各种操作窗口

  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal4[/code]  禁止用户选中文字

  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal5[/code]  动画效果中,使用 translate 比使用定位性能高

   Why Moving Elements With Translate() Is Better Than Pos:abs Top/left
  拿到滚动条

  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal6[/code]  比如要绑定一个touchmove的事件,正常的情况下类似这样(来自呼吸二氧化碳)
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal7[/code]  而如果中间的code需要处理的东西多的话,fps就会下降影响程序顺滑度,而如果改成这样
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal8[/code]  把代码放在setTimeout中,会发现程序变快.
  关于 iOS 系统中,Web APP 启动图片在不同设备上的适应性设置

   http://stackoverflow.com/questions/4687698/mulitple-apple-touch-startup-image-resolutions-for-ios-web-app-esp-for-ipad/10011893#10011893
  position:sticky与position:fixed布局

   http://www.zhouwenbin.com/positionsticky-%E7%B2%98%E6%80%A7%E5%B8%83%E5%B1%80/ http://www.zhouwenbin.com/sticky%E6%A8%A1%E6%8B%9F%E9%97%AE%E9%A2%98/
  关于 iOS 系统中,中文输入法输入英文时,字母之间可能会出现一个六分之一空格

  可以通过正则去掉
  [code]direction: rtl
unicode-bidi: bidi-override; 常量:bidi-override/embed/normal9[/code]  关于android webview中,input元素输入时出现的怪异情况

  见下图
   
收集移动端开发所需要的一些资源与小技巧-1 (iPhone,Browser,在线转换,在线制作,百度移动)

  Android Web 视图,至少在 HTC EVO 和三星的 Galaxy Nexus 中,文本输入框在输入时表现的就像占位符。情况为一个类似水印的东西在用户输入区域,一旦用户开始输入便会消失(见图片)。
  在 Android 的默认样式下当输入框获得焦点后,若存在一个绝对定位或者 fixed 的元素,布局会被破坏,其他元素与系统输入字段会发生重叠(如搜索图标将消失为搜索字段),可以观察到布局与原始输入字段有偏差(见截图)。
  这是一个相当复杂的问题,以下简单布局可以重现这个问题:
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)0[/code]  解决方法
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)1[/code]   详细参考 http://www.bielousov.com/2012/android-label-text-appears-in-input-field-as-a-placeholder/ 注意,该属性会导致中文不能输入词组,只能单个字。感谢鬼哥与飞(游勇飞)贡献此问题与解决方案
   另外,在position:fixed后的元素里,尽量不要使用输入框。更多的bug可参考 http://www.cosdiv.com/page/M0/S882/882353.html
  依旧无法解决(摩托罗拉ME863手机),则使用input:text类型而非password类型,并设置其设置 -webkit-text-security: disc; 隐藏输入密码从而解决。
  JS动态生成的select下拉菜单在Android2.x版本的默认浏览器里不起作用

  解决方法删除了overflow-x:hidden; 然后在JS生成下来菜单之后focus聚焦,这两步操作之后解决了问题。(来自岛都-小Qi)
   参考 http://stackoverflow.com/questions/4697908/html-select-control-disabled-in-android-webview-in-emulator
  Andriod 上去掉语音输入按钮

  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)2[/code]  IE10 的特殊鼠标事件

   IE10 事件监听
  iOS 输入框最佳实践

   Mobile-friendly input of a digits + spaces string (a credit card number)
   HTML5 input type number vs tel
   iPhone: numeric keyboard for text input
   Text Programming Guide for iOS - Managing the Keyboard
   HTML5 inputs and attribute support
  往返缓存问题

   点击浏览器的回退,有时候不会自动执行js,特别是在mobilesafari中。这与 往返缓存(bfcache) 有关系。有很多hack的处理方法,可以参考
   http://stackoverflow.com/questions/24046/the-safari-back-button-problem
   http://stackoverflow.com/questions/11979156/mobile-safari-back-button
  不暂停的计时器(safari的进程冻结)

   https://www.imququ.com/post/ios-none-freeze-timer.html 或者可以用postmessage方式: 主页面:
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)3[/code]  worker:
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)4[/code]  Web移动端Fixed布局的解决方案

   http://efe.baidu.com/blog/mobile-fixed-layout/
  ios上background-attachment:fixed不能正常工作

   参考 http://stackoverflow.com/questions/20443574/fixed-background-image-with-ios7
  如何让音频跟视频在ios跟android上自动播放

  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)5[/code]  系统默认情况下 audio的autoplay属性是无法生效的,这也是手机为节省用户流量做的考虑。 如果必须要自动播放,有两种方式可以解决。
  1.捕捉一次用户输入后,让音频加载,下次即可播放。
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)6[/code]  这种方法需要捕获一次用户的点击事件来促使音频跟视频加载。当加载后,你就可以用javascript控制音频的播放了,如调用audio.play()
  2.利用iframe加载资源
  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)7[/code]  这种方式其实跟第一种原理是一样的。当资源加载了你就可以控制播放了,但是这里使用iframe来加载,相当于直接触发资源加载。 注意,使用创建audio标签并让其加载的方式是不可行的。 慎用这种方法,会对用户造成很糟糕的影响。。
  iOS 6 跟 iPhone 5 的那些事

  IP5 的媒体查询

  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)8[/code]  使用媒体查询,提供不同的启动图片:

  [code]clip: rect(10px, 5px, 10px, 5px)
resize: auto; 常量:auto/both/horizontal/none/vertical
visibility: visible; 常量: collapse/hidden/visible
-webkit-transition: opacity 1s linear; 动画效果 ease/linear/ease-in/ease-out/ease-in-out
-webkit-backface-visibility: visibler; 常量:visible(默认值)/hidden
-webkit-box-reflect: right 1px; 镜向反转
-webkit-box-reflect: below 4px -webkit-gradient(linear, left top, left bottom,
from(transparent), color-stop(0.5, transparent), to(white));
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));;   //CSS 遮罩/蒙板效果
-webkit-mask-attachment: fixed; 常量:fixed/scroll
-webkit-perspective: value; 常量:none(默认)
-webkit-perspective-origin: left top;
-webkit-transform: rotate(5deg);
-webkit-transform-style: preserve-3d; 常量:flat/preserve-3d; (2D 与3D)9[/code]  拍照上传

  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;0[/code]  不支持其他类型的文件 ,如音频,Pages文档或PDF文件。 也没有getUserMedia摄像头的实时流媒体支持。
  可以使用的 HTML5 高级 api

  
       
  • multipart POST 表单提交上传   
  • XMLHttpRequest 2 AJAX 上传(甚至进度支持)   
  • 文件 API ,在 iOS 6 允许 JavaScript 直接读取的字节数和客户端操作文件。  
  智能应用程序横幅

  有了智能应用程序横幅,当网站上有一个相关联的本机应用程序时,Safari浏览器可以显示一个横幅。 如果用户没有安装这个应用程序将显示“安装”按钮,或已经安装的显示“查看”按钮可打开它。
  在 iTunes Link Maker 搜索我们的应用程序和应用程序ID。
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;1[/code]  可以使用 app-argument 提供字符串值,如果参加iTunes联盟计划,可以添加元标记数据
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;2[/code]  横幅需要156像素(设备是312 hi-dpi)在顶部,直到用户在下方点击内容或关闭按钮,你的网站才会展现全部的高度。 它就像HTML的DOM对象,但它不是一个真正的DOM。
  CSS3 滤镜
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;3[/code]  交叉淡变
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;4[/code]  Safari中的全屏幕
  除了chrome-less 主屏幕meta标签,现在的iPhone和iPod Touch(而不是在iPad)支持全屏幕模式的窗口。 没有办法强制全屏模式,它需要由用户启动(工具栏上的最后一个图标)。需要引导用户按下屏幕上的全屏图标来激活全屏效果。 可以使用onresize事件检测是否用户切换到全屏幕。
  支持requestAnimationFrameAPI
  支持image-set,retina屏幕的利器
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;5[/code]  应用程序缓存限制增加至25MB。
  Web View(pseudobrowsers,PhoneGap/Cordova应用程序,嵌入式浏览器) 上Javascript运行比Safari慢3.3倍(或者说,Nitro引擎在Safari浏览器是Web应用程序是3.3倍速度)。
  autocomplete属性的输入遵循DOM规范
  来自DOM4的Mutation Observers已经实现。 您可以使用WebKitMutationObserver构造器捕获DOM的变化
  Safari不再总是对用 -webkit-transform:preserve-3d 的元素创建硬件加速
  支持window.selection 的Selection API
  Canvas更新 :createImageData有一个参数,现在有两个新的功能做好准备,用webkitGetImageDataHD和webkitPutImageDataHD提供高分辨率图像 。
  更新SVG处理器和事件构造函数
  IOS7的大更新

   iOS 7 的 Safari 和 HTML5:问题,变化和新 API (张金龙翻译)
   iOS 7 的一些坑(英文)
   ios7的一些坑2(英文)
  webview相关

  Cache开启和设置

  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;6[/code]  LocalStorage相关设置

  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;7[/code]  浏览器自带缩放按钮取消显示

  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;8[/code]  几个比较好的实践

  使用localstorage缓存html
  使用lazyload,还要记得lazyload占位图虽然小,但是最好能提前加载到缓存
  延时加载执行js
  主要原因就在于Android Webview的onPageFinished事件,Android端一般是用这个事件来标识页面加载完成并显示的,也就是说在此之前,会一直loading,但是Android的OnPageFinished事件会在Javascript脚本执行完成之后才会触发。如果在页面中使用JQuery,会在处理完DOM对象,执行完$(document).ready(function() {});事件自会后才会渲染并显示页面。
  manifest与缓存相关:

   http://www.alloyteam.com/2013/12/web-cache-6-hybrid-app-tailored-cache/ 相关解决方案 http://mt.tencent.com/
  移动端调适篇

  手机抓包与配host

  在PC上,我们可以很方便地配host,但是手机上如何配host,这是一个问题。
  这里主要使用fiddler和远程代理,实现手机配host的操作,具体操作如下:
  首先,保证PC和移动设备在同一个局域网下;
  PC上开启fiddler,并在设置中勾选“allow remote computers to connect”
  
       
  • 首先,保证PC和移动设备在同一个局域网下;
       
  •   PC上开启fiddler,并在设置中勾选“allow remote computers to connect”

    收集移动端开发所需要的一些资源与小技巧-2 (iPhone,Browser,在线转换,在线制作,百度移动)

       
  • 手机上设置代理,代理IP为PC的IP地址,端口为8888(这是fiddler的默认端口)。通常手机上可以直接设置代理,如果没有,可以去下载一个叫ProxyDroid的APP来实现代理的设置。
       
  • 此时你会发现,用手机上网,走的其实是PC上的fiddler,所有的请求包都会在fiddler中列出来,配合willow使用,即可实现配host,甚至是反向代理的操作。
      
  也可以用CCProxy之类软件,还有一种方法就是买一个随身wifi,然后手机连接就可以了!
  高级抓包

   iPhone上使用Burp Suite捕捉HTTPS通信包方法
   mobile app 通信分析方法小议(iOS/Android)
   实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)
  静态资源缓存问题

  一般用代理软件代理过来的静态资源可以设置nocache避免缓存,但是有的手机比较诡异,会一直缓存住css等资源文件。由于静态资源一般都是用版本号管理的,我们以charles为例子来处理这个问题
  charles 选择静态的html页面文件-saveResponse。之后把这个文件保存一下,修改一下版本号。之后继续发请求, 刚才的html页面文件 右键选择 --map local 选择我们修改过版本号的html文件即ok。这其实也是fiddler远程映射并修改文件的一个应用场景。
  安卓模拟器和真机区别

   http://www.farsight.com.cn/news/emb105.htm
   http://testerhome.com/topics/388
   http://www.cnblogs.com/zdz8207/archive/2012/01/30/2332436.html
  移动浏览器篇

  微信浏览器

   微信浏览器的调试技巧 http://www.html-js.com/article/WeChat-cock-burst-perfect-debugging-WeChat-WebView-x5%203076
   微信浏览器的各种bug汇总 (x5内核) http://www.qianduan.net/qqliu-lan-qi-x5nei-he-wen-ti-hui-zong/
  因为微信浏览器屏蔽了一部分链接图片,所以需要引导用户去打开新页面,可以用以下方式判断微信浏览器的ua
  [code]content: “Item” counter(section) ” “;
This resets the counter.
First section
>two section
three section
counter-increment: section 1;
counter-reset: section;9[/code]  后端判断也很简单,比如php
  [code]page-break-after: auto; 常量:always/auto/avoid/left/right
page-break-before: auto; 常量:always/auto/avoid/left/right
page-break-inside: auto; 常量:auto/avoid0[/code]   https://github.com/maxzhang/maxzhang.github.com/issues/31 微信浏览器踩坑,来自maxZhang https://github.com/maxzhang
  【UC浏览器】video标签脱离文档流

  场景:标签的父元素(祖辈元素)设置transform样式后,标签会脱离文档流。
  测试环境:UC浏览器 8.7/8.6 + Android 2.3/4.0 。
   Demo: http://t.cn/zj3xiyu
  解决方案:不使用transform属性。translate用top、margin等属性替代。
  【UC浏览器】video标签总在最前

  场景:标签总是在最前(可以理解为video标签的z-index属性是Max)。
  测试环境:UC浏览器 8.7/8.6 + Android 2.3/4.0 。
  【UC浏览器】position:fixed 属性在UC浏览器的奇葩现象

  场景:设置了position: fixed 的元素会遮挡z-index值更高的同辈元素。
  在8.6的版本,这个情况直接出现。
  在8.7之后的版本,当同辈元素的height大于713这个「神奇」的数值时,才会被遮挡。
  测试环境:UC浏览器 8.8_beta/8.7/8.6 + Android 2.3/4.0 。
   Demo: http://t.cn/zYLTSg6
  【UC浏览器】rem 不能正确计算的问题

  场景:使用以下代码,横竖屏操作后,rem并没有被重新计算,一开始以为是页面没有重绘,强制重绘页面后,发现问题并没有解决。
  [code]page-break-after: auto; 常量:always/auto/avoid/left/right
page-break-before: auto; 常量:always/auto/avoid/left/right
page-break-inside: auto; 常量:auto/avoid1[/code]  测试环境:UC浏览器 V10.9 + Android 6.0+ 。
  解决方案:手动在head中插入style,给html设置font-size,并使用 !important 增加优先级,
  [code]page-break-after: auto; 常量:always/auto/avoid/left/right
page-break-before: auto; 常量:always/auto/avoid/left/right
page-break-inside: auto; 常量:auto/avoid2[/code]  【QQ手机浏览器】不支持HttpOnly

  场景:带有HttpOnly属性的Cookie,在QQ手机浏览器版本从4.0开始失效。JavaScript可以直接读取设置了HttpOnly的Cookie值。
  测试环境:QQ手机浏览器 4.0/4.1/4.2 + Android 4.0 。
  【MIUI原生浏览器】浏览器地址栏hash不改变

  场景:location.hash 被赋值后,地址栏的地址不会改变。
  但实际上 location.href 已经更新了,通过JavaScript可以顺利获取到更新后的地址。
  虽然不影响正常访问,但用户无法将访问过程中改变hash后的地址存为书签。
  测试环境:MIUI 4.0
  【Chrome Mobile】fixed元素无法点击

  场景:父元素设置position: fixed;
  子元素设置position: absolute;
  此时,如果父元素/子元素还设置了overflow: hidden 则出现“父元素遮挡该子元素“的bug。
  视觉(view)层并没有出现遮挡,只是无法触发绑定在该子元素上的事件。可理解为:「看到点不到」。
  补充: 页面往下滚动,触发position: fixed;的特性时,才会出现这个bug,在最顶不会出现。
  测试平台: 小米1S,Android4.0的Chrome18
   demo: http://maplejan.sinaapp.com/demo/fixed_chromemobile.html
  解决办法: 把父元素和子元素的overflow: hidden去掉。
   以上来源于 http://www.cnblogs.com/maplejan/archive/2013/04/26/3045928.html
  库的使用实践

  zepto.js

   zepto的一篇使用注意点讲解
   zepto的著名的tap“点透”bug
   zepto源码注释
  使用zeptojs内嵌到android webview影响正常滚动时

  

https://github.com/madrobby/zepto/blob/m

友荐云推荐




上一篇:Raspberry Pi, Send Me a Letter
下一篇:A Redesign with CSS Shapes
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

妙竹 发表于 2016-10-5 09:27:08
心里只有你一个频道,最可恨的是还没有广告。
回复 支持 反对

使用道具 举报

nkxpy 发表于 2016-10-5 23:22:01
脑残片今天吃了么?
回复 支持 反对

使用道具 举报

拼了命做自己 发表于 2016-10-10 11:54:24
有图,有真相!
回复 支持 反对

使用道具 举报

hellosweet 发表于 2016-11-11 04:25:36
我们都知道恶虎架不住群狼。说明:”团队很重要!”
回复 支持 反对

使用道具 举报

花田锁住流年 发表于 2016-11-20 02:41:47
请你吃包辣条
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表