web移动端

移动端基本环境

viewport 视口

可视区窗口

默认不设置, 一般可视区宽度在移动端是980

参数:

  • width: 可视区的宽度 (number||device-width(设备宽度))

使用number在安卓下有问题

  • user-scalable: 是否允许用户缩放 (yes||no)

这个参数在ios10下无效

  • initial-scale 初始缩放比例
  • minimum-scale 最小缩放比例
  • maximum-scale 最大缩放比例

单独设置initial-scale没有作用, 还必须设置minimum-scale,maximum-scale与initial-scale的值相同

(另外在测试的时候,ios下,修改initial-scale之后,必须要重开网页才有效, 刷新无效)

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

devicePixelRatio 像素比

把一个像素 放大至 N个像素去显示(N就是我们像素比的值)

举个例子:

如果像素比为2

<div style="width: 10px;height: 5px;background: black"></div>

那么,我们div实际所占的物理像素为20*10

我的电脑像素比是1.25

console.log(window.devicePixelRatio);//1.25

同样是上面的html代码, 显示出来截图后再ps测量, div宽为13像素(101.25=12.5), 高为6像素(51.25=6.25), 因为显示最小单位就是一个像素, 所以0.5也会被当做一个像素

如果改为:

<div style="width: 100px;height: 100px;background: black"></div>

测量结果为宽为125像素, 高为125像素

像素比应该是设备属性, 尝试修改(没有效果):

window.devicePixelRatio=3

另外: 放大或缩小网页,会改变像素比

在移动端的物理分辨率实际已经非常大了, iphone6的分辨率为(4.7英寸1334x750)

如果没有像素比, 你的正常显示在pc的网页, 在移动端会非常小

移动端的像素比一般都是大于1的, iphone6的像素就是2, 所以在iphone6中window.innerWidth的值为375, 正好为物理分辨率的一半

有时我们查看screen.width属性和我们电脑的设置的分辨率不一样, 也是这个原因
我的电脑的分辨率设置为: 1920*1080

但是我的screen.width和screen.height为:

screen.width;//1536
screen.height;//864

因为我的devicePixelRatio像素比为1.25

1536*1.25;//1920
864*1.25;//864

注意:

在移动端, 图片的分辨率相应要比pc的图片要大, 不然就会出现图片发虚

和移动端相关的其他meta属性

x5内核的浏览器:qq浏览器已经qq微信内置浏览器

x5内核的浏览器强制横屏或竖屏显示

<meta name="x5-orientation" content="portrait|landscape">

landscape((文件的)横向打印格式)

x5内核的浏览器设置全屏

<meta name="x5-fullscreen" content="true"/>

uc强制横屏或竖屏显示

<meta name="screen-orientation" content="portrait|landscape">

uc设置全屏

<meta name="full-screen" content="yes"/>

禁止识别电话号码和邮件地址

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

默认的, 在移动端, 如果出现数字(电话号码)或邮件格式的字符串,点击会唤起打电话或发生邮件功能

<p>13000000000</p>
<p>xxx@qq.com</p>

可以通过<meta name="format-detection" content="telphone=no,email=no">来禁止

如果需要使用这个特性, 可以通过a标签明确指定

<a href="tel:13000000000">13000000000</a>
<a href="mailto:xxx@qq.com">xxx@qq.com</a>

移动的一些问题

默认样式

清除点击阴影 -webkit-tap-highlight-color

在移动端, 默认按钮和a标签等点击会有黑色阴影

<style>
button, a, input{
    /*-webkit-tap-highlight-color: red;*/
    -webkit-tap-highlight-color: transparent;
}
</style>
<a href="">sadfsadfsadf</a>

消除按钮圆角 -webkit-appearance

在iphone中, 按钮默认是有圆角的, 不能通过设置border-radius消除

还需要设置-webkit-appearance: none

button{
    -webkit-appearance: none;
    border-radius: 0; 
}

选中文字设置 -webkit-user-select

body *{
    -webkit-user-select: none;
}

禁止文字缩放 -webkit-text-size-adjust

body *{
    -webkit-text-size-adjust: 100%;
}

在移动端, 用户通常可以设置显示字体的大小,

加上上面的这句话了, 就可以禁止用户调整字体大小

默认字体设置 Helvetica

我们通常设置字体为宋体或微软雅黑, 但移动端大部分都没有这两种字体,
Helvetica这种字体是都有的,但它是英文字体, 中文字体用默认的就好

其他的问题

Font Boosting

在一段文字我们没有给他设置高度的时候,在webkit内核下,文字的大小被浏览器放大了

(可能会遇到, 并不是每次都会遇到)

产生原因: -webkit的人性化设置, 防止字体太小不好看

<style type="text/css">
#p1 {
    font-size: 18px;
    line-height: 30px;
    height: 30px;
}   
#p2 {
    font-size: 18px;
    line-height: 30px;
}
</style>

<p id="p1">我是文字呦~~</p>
<!-- p2的字可能会变得很大 -->
<p id="p2">文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字</p>

解决办法:
1.设置高度
2.设置最大高度 max-height

fixed 固定定位

在移动端,尽量不要固定定位

可以使用绝对定位模拟固定定位

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
html{
    height: 100%;
    overflow: hidden;
    position: relative;
}
body{
    height: 100%;
    overflow: auto;
}

header{
    height: 100px;
    width: 100%;
    background: red;
    position: absolute;
    top: 0;
}


</style>
<header></header>
<section>
    <p>001</p>
    <p>002</p>
    ....
    <p>099</p>
</section>

这种做法的问题:

  1. header会遮盖滚动条
  2. 滚动不流畅, 会比较卡

html上的overflow:hidden问题

如果把header的width改为200%;

header{
    height: 100px;
    width: 200%;
    background: red;
    position: absolute;
    top: 0;
    text-align: center;
}

使用ios下测试, 页面的宽度会被header撑开, 造成可以横向滑动的效果

但是我们设置了html的overflow: hidden, 超出的部分应该隐藏才对

这ios下的一个问题, 在html上设置overflow: hidden没有效果

解决办法:

设置相对于body定位

那我们就需要在加一层div

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
html{
    height: 100%;
    overflow: hidden;
    
}
body{
    height: 100%;
    overflow: hidden;
    position: relative;
}
#wrap{
    height: 100%;
    overflow: auto;
}
header{
    height: 100px;
    width: 200%;
    background: red;
    position: absolute;
    top: 0;
    text-align: center;
}
</style>

不同屏幕的适配

移动端的屏幕分辨率很多, 不可能为每种单独写样式

所以我们需要一些适配的方案

百分比适配

百分比适配可以很好解决宽度的适配, 高度的适配就不是那么理想了

一个例子: 将四个div横排平均占满整个屏幕

<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
div{
    width: 25%;
    height: 100px;
    float: left;
    background: #777;
}
div:nth-child(1){
    background: #111;
}
div:nth-child(2){
    background: #222;
}
div:nth-child(3){
    background: #333;
}
</style>
<section>
    <div></div>
    <div></div>
    <div></div>
    <div></div> 
</section>

viewport适配

我们知道,我们其实可以指定视口的宽度,我们如果可以将视口设置成一个固定的值

则我们的网页就可以基于一个分辨率来设计

<meta name="viewport" content="width=320">
<style type="text/css">
*{
    margin: 0;
    padding: 0;
}
div{
    /*width: 25%;*/
    width: 80px;
    height: 100px;
    float: left;
    background: #777;
}
div:nth-child(1){
    background: #111;
}
div:nth-child(2){
    background: #222;
}
div:nth-child(3){
    background: #333;
}
</style>
<section>
    <div></div>
    <div></div>
    <div></div>
    <div></div> 
</section>

但是<meta name="viewport" content="width=320">width为number在安卓下不支持

所以我们可以通过计算设置initial-scale的,实际上改的也是width的值

举个例子,如果你的设备的device-width为360px(这里的px指定的css的像素,而不是物理像素), 我的网页的宽为320px,

则我们需要放大我们的网页(移动端对缩放的处理实际上是放大和缩小视口的大小,放大网页实际上是通过缩小我们的视口来实现的, 因为我们的设备大小是固定的, 视口越小, 则每个css像素就越大 )

则我们的initial-scale应该为device-width/320 (360/320==1.125)

<meta name="viewport" content="width=device-width,initial-scale=1.125,minimum-scale=1.125,maximum-scale=1.125">

注意:initial-scale minimum-scale maximum-scale 都必须写, 单写initial-scale是没有作用的

对于不同的设备, 我们可以通过计算

<script>
(function(){
    //设备宽度
    var deviceW = window.screen.width;
    //网页宽度
    var w = 320;
    //缩放比例
    var scale = deviceW/w;
    var meta = document.createElement('meta');
    meta.name = 'viewport';
    meta.content = 'width=device-width,initial-scale='+scale+',minimum-scale='+scale+',maximum-scale='+scale;
    document.head.appendChild(meta);
})();
</script>
<!-- <meta name="viewport" content="width=device-width,initial-scale=1.125,minimum-scale=1.125,maximum-scale=1.125"> -->

rem适配

rem是css的长度单位, 1rem为html元素的font-size的大小, r代表的是root(可以理解为我们的html)

*{
    margin: 0;
    padding: 0;
}
html{
    font-size: 20px;
}
div{
    height: 5rem;/* 100px */
    width: 5rem;/* 100px */
    background: red;
}

利用rem做移动端的适配

<script>
var html = document.documentElement;
var htmlW = html.clientWidth;
html.style.fontSize = htmlW/16 + 'px';//屏幕被分成了16份 1rem就是一份
</script>
<style>
*{
    margin: 0;
    padding: 0;
}
html{
    font-size: 20px;
}
div{
    float: left;
    height: 4rem;
    width: 4rem;
    background: red;
}
div:nth-of-type(1){
    background: #111;
}
div:nth-of-type(2){
    background: #222;
}
div:nth-of-type(3){
    background: #333;
}
div:nth-of-type(4){
    background: #444;
}

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

推荐阅读更多精彩内容

  • 移动端应该如何动态设置字体大小? rem由来:font size of the root element,那么re...
    a8d1e9528b1e阅读 514评论 0 0
  • 这周做了一个移动端的项目,在开发过程中,踩到了不少坑,也学到了不少东西。在此记录下来一些重要的东西。 一、单位 说...
    白_夜阅读 880评论 0 7
  • 刚开始做移动端web开发的同学应该都碰到过页面适配问题,为什么我在开发手机上调试好的页面在其他手机会有这样或那样的...
    留七七阅读 19,259评论 5 80
  • 移动端适应中各种名词 PPI(每英寸像素) 一个表示打印图像或显示器单位面积上像素数量的指数。一般用来计量电脑,电...
    岁月如同马匹阅读 336评论 0 0
  • 初春的街头迎来一股寒潮,男朋友回到公寓的时候,一脸的困倦,我是不是真的没办法给你好的生活。考研失败的他每天忙着找工...
    Cold_Mou阅读 762评论 13 22