移动端web开发的小技巧以及适配问题

1:小bug处理

安卓手机上点击a标签会有阴影出现,处理的方式为在body和element上加上下面这几句css样式

body{
     -webkit-tap-highlight-color:rgba(0, 0, 0, 0);
     -moz-tap-highlight-color:rgba(0, 0, 0, 0);
     -ms-tap-highlight-color:rgba(0, 0, 0, 0);
     -o-tap-highlight-color:rgba(0, 0, 0, 0);
     tap-highlight-color:rgba(0, 0, 0, 0);
   }
 Element {
     -webkit-tap-highlight-color:rgba(255,255,255,0);
  }

移动端禁止页面缩放

<meta name="viewpoint" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

禁止页面把数字当成电话号码

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

禁止微信浏览器调整页面字体大小

body{

    /*禁止微信内置浏览器调整字体大小*/
    -webkit-text-size-adjust: 100% !important;
    -moz-user-select: none; /*火狐*/
    -webkit-user-select: none; /*webkit浏览器*/
    -ms-user-select: none; /*IE10*/
    -khtml-user-select: none; /*早期浏览器*/
    user-select: none;

}

禁止用户选中页面文字

body{
    -moz-user-select: none; /*火狐*/
    -webkit-user-select: none; /*webkit浏览器*/
    -ms-user-select: none; /*IE10*/
    -khtml-user-select: none; /*早期浏览器*/
    user-select: none;
}
<body onselectstart="return false;"></body>

在iphone关闭长按图片保存图片弹窗

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

设置输入框placeholder字体样式

::-moz-placeholder { color: #A9A9A9; font-family: "PingFangTC-Light";}
::-webkit-input-placeholder { color:#A9A9A9; font-family: "PingFangTC-Light";}
::-ms-input-placeholder { color:#A9A9A9; font-family: "PingFangTC-Light";}

在ios中 输入框的光标发生位移,上移或者下移,解决方法是不要设置line-height

2:在微信浏览器中,链接到appstore的跳转全都被屏蔽了

解决办法一是通过跳转到腾讯的微应用(应用宝)中,才能通过它接着跳转到appstore,但是应用宝规定,必须把app上传到他们平台审核通过后才能有这个功能,和苹果商店类似,但是如果没有安卓版本的app,只有ios版本的话也不可以。也就是说要在应用宝上传安卓和苹果的app才能用应用包的这个功能。

解决办法二是当用户点击下载按钮之后提示用户在浏览器中打开,只要不是微信浏览器,其他浏览器都可以跳转到appstore下载app。现在大部分的公司是这样做的。

解决办法三是扫描二维码进行跳转,这在微信浏览器中是可以的,把链接生成二维码的网站一大堆,随便百度一个就可以了,当用户点击下载按钮之后,弹出二维码供用户扫描。但是问题来了,如果图片不大的话,长按图片是出不来扫描图中二维码那个按钮的。解决办法就是再设置一个全屏的二维码,让它的透明度为0,当用户长按时,其实是点的大的二维码,这样随便按哪都会弹出来扫描图中的二维码那个按钮。。。(本人也是这样做的)

3:

在ios移动端浏览器中,如果给视频video不设置controller的话,视频播放控件依旧会显示出来,很丑,解决办法就是用一个蒙版盖住视频,自己写播放按钮在上面,让视频的透明度为0,给包裹video标签的div设置背景图片,当点击播放时,才让视屏的透明度为1,这样就好看多了。。。现在一些大的科技公司就是有自己的播放器插件,也就是模拟视频播放器,这样就可以随心所欲的改变视频播放器的样式了。

4:(不同的手机屏幕适配问题)

我相信身为一名前端开发攻城狮刚开始最头疼的应该是手机适配问题了,怎样才能让自己写的页面在各种手机上都能达到一致效果没有固定的解决方法,各位童鞋可以根据自己的需要来进行适配,下面分别为几种适配方法:
(1)使用媒体查询的方式,在页面的css中加入以下代码:

@media only screen and (min-width: 1024px){
  body{zoom:3.2;}
}
@media only screen and (min-width: 768px) and (max-width: 1023px) {
  body{zoom:2.4;}
}
@media only screen and (min-width: 640px) and (max-width: 767px) {
  body{zoom:2;}
}
@media only screen and (min-width: 540px) and (max-width: 639px) {
  body{zoom:1.68;}
}
@media only screen and (min-width: 480px) and (max-width: 539px) {
  body{zoom:1.5;}
}
@media only screen and (min-width: 414px) and (max-width: 479px) {
  body{zoom:1.29;}
}
@media only screen and (min-width: 400px) and (max-width: 413px) {
  body{zoom:1.25;}
}
@media only screen and (min-width: 375px) and (max-width: 413px) {
  body{zoom:1.17;}
}
@media only screen and (min-width: 360px) and (max-width:374px) {
  body{zoom:1.125;}
}
`
但是对于横屏是不好处理,判断横竖屏的媒体查询为:
`@media all and (orientation : landscape) {
  h2{color:red;}/*横屏时字体红色*/
}
@media all and (orientation : portrait){
  h2{color:green;}/*竖屏时字体绿色*/
}

(2)使用百分比布局:
不同的手机有着不同的分辨率,这时再用我们pc端布局常用的px就不合适了。使用百分比布局要时时刻刻清楚其父元素,因为子元素的百分比高度是根据父元素的高度来确定的,当父元素的高度为不确定值时,或者说父元素的高度未定义时,子元素的高度百分比将没有用(没有参照物)。所以只有设置了父元素的高度,子元素的高度百分比才会有用。
通常使用百分比布局的人不多,因为计算太麻烦了。

(3)单位使用em与rem
em是根据相对单位,不是固定的,他会继承父级元素的字体大小,若没有父级则em的相对基准点为浏览器的字体大小,浏览器的字体默认为16px,因此若无父级元素,相对于浏览器大小:Xem=X*16px; rem是css3新增属性,是完全相对于HTML根元素大小设定的,默认为10px,因此无论父级字体大小,1rem=10px。所以可以根据屏幕的大小来动态的改变html的字体大小,然后使用rem为单位就可以进行适配了,改变浏览器字体的代码为:

function resetHtmlFont(){//改变浏览器字体大小
    var HTML= document.getElementsByTagName('html')[0];
    var deviceWidth = document.documentElement.clientWidth;
    var scale = deviceWidth/640;
    HTML.style.fontSize =( 100 \* scale)+'px';//乘以100的目的是浏览器最小的字体大小为12px,所以会出现屏幕过小会不执行,这样就可以按照正常的px大小除以100就是rem的值了
}
function resize(){
 if (window.orientation == 90 || window.orientation == -90) {
      //ipad、iphone竖屏;Andriod横屏
     resetHtmlFont();
      orientation = 'landscape';
       return false;
} else if (window.orientation == 0 || window.orientation == 180) {
       //ipad、iphone横屏;Andriod竖屏 
       resetHtmlFont();
      orientation = 'portrait';
      return false;
    }
}
//window.addEventListener("orientationchange",function(){//手机横屏或者竖屏事件
//  resize();
//});
window.onresize = window.onorientationchange = function(){
  resize();
}
resize();

但是这个如果在电脑端打开的话,屏幕多大就会多大,如果需求是在PC端打开也和移动端一样的话,用这种方法还得加一个判断,就是:
if (deviceWidth >=750) {//如果屏幕宽度大于750px的话,让deviceWidth为750 deviceWidth = 750; }
把这段加到resetHtmlFont这个函数里就可以了。

(4)栅格布局&&弹性布局
box-sizing:border-box;可以改变盒子模型的计算方式方便你设置宽进行自适应流式布局。
弹性布局为CSS3新出现的属性,简单的用法看下面一个例子:

<ul class="flex-container">
   <li class="flex-item">![](/images/1.jpg)</li>
   <li class="flex-item">![](/images/2.jpg)</li>
   <li class="flex-item">![](/images/3.jpg)</li>
   <li class="flex-item">![](/images/4.jpg)</li>
</ul>

上面的html结构为一个弹性布局的ul标签内包含了4张400*400的图片,css代码为:

.flex-container {
  list-style: none;

   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
}

.flex-item {
   padding: 5px;
}

关于css3的弹性布局这里不必多说,具体的可以产靠这篇博文,写的不错。
深入理解css3弹性盒布局

(5)动态的改变页面的zoom值(和第三个类似)

开发者也可以根据屏幕的大小来动态的改变页面的zoom值来进行适配,具体的思路和第三个方法类似,就是动态的控制页面的缩放,具体的代码为:

function resetHtmlFont(){//改变浏览器字体大小
    var deviceWidth = document.documentElement.clientWidth;//获取设备宽度
    var scale = deviceWidth/640;//640是psd设计图宽度
    document.body.style.zoom = scale;
}
function resize(){
 if (window.orientation == 90 || window.orientation == -90) {
      //ipad、iphone竖屏;Andriod横屏
     resetHtmlFont();
      orientation = 'landscape';
       return false;
} else if (window.orientation == 0 || window.orientation == 180) {
       //ipad、iphone横屏;Andriod竖屏 
       resetHtmlFont();
      orientation = 'portrait';
      return false;
    }
}
//window.addEventListener("orientationchange",function(){//手机横屏或者竖屏事件
//  resize();
//});
window.onresize = window.onorientationchange = function(){
  resize();
}
resize();

(6)动态的改变页面的viewport来进行适配
个人觉得动态的改变页面的viewport值来进行适配是比较好的解决方案,包括本人以及很多大公司都在使用这种方法,这种方法的具体思路是通过js动态的改变页面的viewport来控制页面的显示区域进行适配,我们公司有个大神写了一个基于jquery的动态改变viewport的插件,通熟易懂,引入完jq再引入这个文件就可以适配了,无需进行别的操作,其它的布局什么的直接按照PC端的来写就可以了,下面来贴出代码:

+function(){
    adaptUILayout()
    function adaptUILayout(){

        var deviceWidth,
            devicePixelRatio,
            targetDensitydpi,
            //meta,
            initialContent,
            head,
            viewport,
            ua;

        ua = navigator.userAgent.toLowerCase();
        //whether it is the iPhone or iPad
        isiOS = ua.indexOf('ipad') > -1 || ua.indexOf('iphone') > -1;

        //设置像素比
        devicePixelRatio = window.devicePixelRatio;
        devicePixelRatio < 1.5 ? 2  : devicePixelRatio;

        if(window.orientation == 0 || window.orientation == 180){//ios的横屏,安卓的竖屏
            if(window.screen.width < window.screen.height){
                deviceWidth = window.screen.width; 
            }else{
                deviceWidth = window.screen.height; 
            }
        }else{//ios的竖屏,安卓的横屏
            if(window.screen.width > window.screen.height){
                deviceWidth = window.screen.width; 
            }else{
                deviceWidth = window.screen.height; 
            }
        }
        //动态的改变像素比
        if(devicePixelRatio==2 && (deviceWidth==320 || deviceWidth==360 || deviceWidth==592 || deviceWidth==640)){
            deviceWidth*=2;
        }

        if(devicePixelRatio==1.5 && (deviceWidth==320)){
            deviceWidth*=2;
            devicePixelRatio = 2;
        }
        if(devicePixelRatio==1.5 && (deviceWidth==750)){
            devicePixelRatio = 2;
        }

        //设置设备的独立像素比api
        targetDensitydpi = 750 / deviceWidth * devicePixelRatio * 160;
        创建meta标签
        initialContent   = isiOS 
            ? 'width=' + 750 + 'px, user-scalable=no, minimal-ui'
            : 'target-densitydpi=' + targetDensitydpi + ', width='+ 750 +', user-scalable=no';

        $("#viewport").remove();
        var head = document.getElementsByTagName('head');
        var viewport = document.createElement('meta');
        viewport.name = 'viewport';
        viewport.id = 'viewport';
        viewport.content = initialContent;

        head.length > 0 && head[head.length - 1].appendChild(viewport);
    }

    $(window).bind( 'orientationchange', function(e){
        adaptUILayout()
    });
}();

(7)使用css3的transiform的scale来改变页面的缩放值
对于一般的web展示页面,dom结构不算复杂的话可以使用css3的scale来动态的收缩页面,比我上面提到的动态的改变zoom值要流畅很多,腾讯里面的好多简单页面就是采用的这种方法,具体的思路和代码为:

var autoScale = function() {
    var ratio = 320/504, //原设计稿的宽高比(504是iPhone5的高度去掉标题栏高度)
        winW = document.documentElement.clientWidth,
        winH = document.documentElement.clientHeight,
        ratio2 = winW/winH,
        scale;

    if (ratio < ratio2) {
        scale = (winH/504).toString().substring(0, 6);
    }else{
        scale = (winH/504).toString().substring(0, 6);
    }
    var cssText = "-webkit-transform: scale("+ scale +"); -webkit-transform-origin:top; opacity:1;";
    $("body").attr('style', cssText);//如果给body添加不可以,就给一个最外层的div添加
};

//设定一定时间保证获取页面宽高正确
setTimeout(function(){
    if (document.documentElement.clientWidth/document.documentElement.clientHeight !== 320/504) {
        autoScale();
    }
},300);

//横屏竖屏切换
window.addEventListener('onorientationchange' in window ? 'orientationchange' : 'resize', autoScale, false);

具体的可以参考:腾讯ISUX

更新于2017-3-10

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

推荐阅读更多精彩内容