移动端爬坑记 --- (1)布局与样式上的奇葩偶遇

简介: Flex想要兼容众多花样式手机,要注意以下这么些• 前缀要考虑2009~2012年的语法[webkit-box,flex,flex-box]• 少用复合属性,比如flex:1,考虑兼容理应拆成[flex-grow,flex-shrink,flex-basis];flex-flow拆开成[flex-direction,flex-wra


原文链接: blog.csdn.net


前言


汇总下自己搞移动端遇到掉进去的坑,以及脱坑的方案;


Flex兼容


Flex想要兼容众多花样式手机,要注意以下这么些

  • 前缀要考虑2009~2012年的语法[webkit-box,flex,flex-box]
  • 少用复合属性,比如flex:1,考虑兼容理应拆成[flex-grow,flex-shrink,flex-basis];flex-flow拆开成[flex-direction,flex-wrap]


demo{
          display: -webkit-box;      /* OLD - iOS 6-, Safari 3.1-6 */
          display: -moz-box;         /* OLD - Firefox 19- (buggy but mostly works) */
          display: -ms-flexbox;      /* TWEENER - IE 10 */
          display: -webkit-flex;     /* NEW - Chrome */
          display: flex;             /* NEW, Spec - Opera 12.1, Firefox 20+ */


这些前缀很少手动去写,一般都用构建工具处理,我用的是gulp+autoprefixer来处理,这里我的处理范围


var AUTOPREFIXER_BROWSERS = [
  'ie >= 9',
  'ie_mob >= 9',
  'ff >= 30',
  'chrome >= 34',
  'safari >= 7',
  'opera >= 23',
  'ios >= 7',
  'android >= 2.3',
  'bb >= 10'
];


值的一提的是,添加前缀并不是万能的,有些国内的手机就不吃这一套了,今天小伙伴就遇到了;华为的一款手机不支持常规的flex写法。。。最终是原因是不能用行内元素,要改成block元素才能支持flex


2016-8-11 update: 使用flex:1的子元素,切记要增加width:0% .. 有些android不带这个很奇葩【错乱】,且不要使用margin:0 auto【作用于子元素】

在滚动包裹层添加这么一条私有前缀样式即可享受类似APP的滑动效果,不仅丝滑,还带弹性!


.contain{
    -webkit-overflow-scrolling : touch;    


IOS 遮罩层较好方案


拒绝采用fixed!!!!!


遮罩层采用position:absolute来置顶,内部元素采用flex来布局;

这种写法可以避免一大堆天坑!!!

若是实在不信邪,滚动的时候,微信端这些你就会感受到花儿为什么这样红了。。。


IOS滚动窗滑动到底部还能弹窗拖拉的奇葩修复


这个方案是通过计算离底部多远加状态来阻止touch事件

// 防止内容区域滚到底后引起页面整体的滚动
var content = document.querySelector('main');
var startY;
content.addEventListener('touchstart', function (e) {
    startY = e.touches[0].clientY;
});
content.addEventListener('touchmove', function (e) {
    // 高位表示向上滚动
    // 底位表示向下滚动
    // 1容许 0禁止
    var status = '11';
    var ele = this;
    var currentY = e.touches[0].clientY;
    if (ele.scrollTop === 0) {
        // 如果内容小于容器则同时禁止上下滚动
        status = ele.offsetHeight >= ele.scrollHeight ? '00' : '01';
    } else if (ele.scrollTop + ele.offsetHeight >= ele.scrollHeight) {
        // 已经滚到底部了只能向上滚动
        status = '10';
    }
    if (status != '11') {
        // 判断当前的滚动方向
        var direction = currentY - startY > 0 ? '10' : '01';
        // 操作方向和当前允许状态求与运算,运算结果为0,就说明不允许该方向滚动,则禁止默认事件,阻止滚动
        if (!(parseInt(status, 2) & parseInt(direction, 2))) {
            e.preventDefault();
            stopEvent(e);
        }
    }


ios和android下触摸元素时出现半透明灰色遮罩


-webkit-tap-highlight-color:rgba(255,255,255,0)


IOS 默认输入框内阴影重置


E{
     border: 0;  
     -webkit-appearance: none; 


旋转屏幕时,字体大小调整的问题


html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {
  -webkit-text-size-adjust:100%;


默认启用GPU渲染页面


这个具体要看你的实际作用范围,无非就通过一些特殊属性来强制开启

- transform:translateZ(0): Z轴会启用GPU,请自行带前缀

- 调用preserve-3d或者animation也会


transition闪屏


/设置内嵌的元素在 3D 空间如何呈现:保留3D /
-webkit-transform-style: preserve-3d;
/ 设置进行转换的元素的背面在面对用户时是否可见:隐藏 /
-webkit-backface-visibility:hidden;


placeholder的颜色值改变


input::-webkit-input-placeholder{color:#F40;}
input:focus::-webkit-input-placeholder{color:#F40;}


移动端禁止选中内容


E {
  -webkit-user-select: none;  
  -moz-user-select: none;     
  -ms-user-select: none;            


IOS禁止保存或拷贝图像


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


IOS中input键盘事件调用缓慢


直接改为监听input事件


document.getElementById('test').addEventListener('input',fn,false);复制代码


页面高度渲染错误


document.documentElement.style.height = window.innerHeight + 'px';


怪异悬浮的表单


在部分android 机型中的输入框可能会出现如图怪异的多余的浮出表单,经过观察与测试发现只有input:password类型的输入框存在,那么我们只要使用input:text类型的输入框并通过样式-webkit-text-security: disc; 隐藏输入密码从而解决。


input[type=text]{
    -webkit-text-security: disc;


其他一些建议


  • 能用transform实现的过渡的,可以不考虑animation实现;animation在部分机子过渡非常掉帧,体验非常糟糕,,遇到过好几次
  • 页面有滚动区域的建议引入iscroll5,可以避免很多天坑
  • 页面应该尽可能的减少复杂的DOM【一个功能点,DOM结构越直白,越好维护】,复杂DOM会增加维护难度
  • 考虑移动端响应布局,建议引入阿里巴巴出品的lib-flexible , IOS动态调整DPR,其他设备默认DPR1
  • 点透事件可以引入fastclick或者不用click,改为touch来写,亦或者引入zepto的tap事件


若是以后还有遇到哪些奇葩坑,爬出来了会继续更新此帖子

目录
相关文章
|
1月前
|
前端开发 JavaScript API
惊呆了!这些前端技术竟然能让你的网站实现无缝滚动效果!
【10月更文挑战第30天】本文介绍了几种实现网页无缝滚动的技术,包括CSS3的`scroll-snap`属性、JavaScript的Intersection Observer API以及现代前端框架如React和Vue的动画库。通过示例代码展示了如何使用这些技术,帮助开发者轻松实现流畅的滚动效果,提升用户体验。
131 29
|
4月前
|
移动开发 前端开发 JavaScript
惊爆!一键解锁HTML父页面神秘技能,子页面Dialog华丽登场,让你的网页交互瞬间高大上,用户体验飙升!
【8月更文挑战第4天】在Web开发中,常需从父页面弹出子页面或对话框(Dialog)进行互动。HTML5虽引入了<dialog>元素,但许多开发者偏好使用自定义方案以获得更好的兼容性和样式控制。本示例利用HTML、CSS及JavaScript创建一个可弹出子页面的模态框:首先,在父页面中定义一个按钮触发弹出效果;接着,设置隐藏的模态框容器,内含一个iframe用于加载子页面;然后,通过CSS设定模态框样式;最后,借助JavaScript控制模态框的显示与隐藏。此方案灵活且易于定制,适用于多种应用场景。
117 12
|
4月前
|
前端开发 容器
揭秘Web前端布局秘籍:浮动,那个让你又爱又恨的布局神器,你真的了解它吗?
【8月更文挑战第23天】在Web前端设计中,浮动是一种关键布局技术,能让元素在文档流中灵活移动,实现文本环绕图片、多列布局等效果。元素通过CSS的 `float` 属性脱离正常文档流并移动到容器边缘,后续非浮动内容则围绕该元素排列。浮动可用于多列布局、导航菜单及图文混排。需注意清除浮动以避免布局问题,并处理可能导致的父元素高度塌陷。
65 0
|
4月前
|
前端开发 开发者 UED
Web前端布局的救赎:掌握清除浮动的艺术,告别布局混乱!
【8月更文挑战第23天】在Web前端开发中,浮动(float)是一种常用的CSS布局技术,但会导致父元素高度塌陷。清除浮动至关重要,常用方法包括:使用额外的清除元素、伪元素、`overflow`属性、`flexbox`布局、`grid`布局以及`clearfix`方法。每种方法各有优缺点,适用于不同场景。随着新技术的发展,开发者应持续学习,选择合适的方法以确保布局稳定性和提升用户体验。
45 0
|
6月前
|
前端开发 开发工具 图形学
【你问我答】unity实现一个刮刮乐效果
【你问我答】unity实现一个刮刮乐效果
143 0
|
7月前
紫色星空月亮404网页模板源码
紫色星空月亮404网页模板源码
67 4
紫色星空月亮404网页模板源码
|
7月前
|
编解码 前端开发 JavaScript
前端css常用的几种布局方式(推)
前端css常用的几种布局方式(推)
118 0
|
JSON 前端开发 JavaScript
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告
92 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告
81 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百三十五题-定位-fixed-广告