移动端布局那点事—多种布局总有你需要的

随着网络的快速发展,移动端设备页面也越来越重要。但由于各个手机的屏幕大小不一,那么如何让一个页面匹配各个页面呢。现在我们来看看下面的几种布局方式。
注意我们要想在移动端完美显示效果,需要在head标签内加一个viewport的meta标签

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

弹性盒模型布局

  1. 需要在父级开启弹性盒模型:display:-webkit-box;
  2. 自己设置需要的大小(份数):-webkit-box-flex:1;(份数/总份数)
  3. 如果有固定宽度(设置好的px宽度),先剔除掉固定的宽度再按照份数划分
  4. 注意 不要用浮动和定位
    我们先简单的用一下:
<div id="box">    
      <div style="background:red">left</div>    
      <div style="background:green">center</div> 
      <div style="background:blue">right</div>
</div>

CSS样式开启弹性盒模型,并设置子级的宽度

#box{ display:-webkit-box;}
#box div{  
      /* 当然了这里我们也可根据具体需求设置我们所需的大小 */
      -webkit-box-flex:1;  
      height:300px;
}

效果如下:


  1. 设置子级div竖直排列(每个占一行,高度分割):-webkit-box-orient: vertical;要给父级加哦
  2. 将子级div进行倒序排列:-webkit-box-direction: reverse;要给父级加哦
<div id="box">   
     <div style="background: red;">1</div>    
     <div style="background: yellow;">2</div> 
     <div style="background: blue;">3</div> 
     <div style="background: green;">4</div>
</div>

在CSS中设置子级div所占份数,并竖直倒序排列

html,body{  
    height:100%;  
    overflow: hidden;
}
#box{  
     display:-webkit-box; 
     -webkit-box-orient: vertical;
     -webkit-box-direction: reverse; 
     height:100%;   
     font-size:100px;   
     text-align: center; 
     color: #fff;
}
#box div{ -webkit-box-flex:1;}

效果如下:



接下来我们,回到一个老问题让未知宽高的div,在父级内垂直水平居中呢?这里我们加深点难度让一组未知宽高的div在父级内垂直水平居中。
我们不得不说的是弹性盒模型里正好有此属性

  1. 让子级元素垂直方向居中:-webkit-box-align: center;要给父级加哦
  2. 让子级元素水平方向居中:-webkit-box-pack: center;要给父级加哦
<div id="box">   
     <div class="div1" style="background-color: lawngreen">div1</div>  
     <div class="div2" style="background-color: red">div2</div>
</div>

在父级元素下设置弹性盒模型和相关样式

#box{ 
     display: -webkit-box;  
     width: 300px;height: 300px;   
     border: 1px solid #000;    
     margin: 100px auto; 
     /* 子级水平居中 */
    -webkit-box-pack: center;
   /* 子级垂直居中 */
   -webkit-box-align: center;
}
#box div{    width: 100px;height: 100px;}

效果如下:

流体式布局

基本思想就是:用100%来时div与父级的宽度一致并与浮动一起(width:100%+float);
缺点:每一个设备上最终的显示效果都与设计图有出入。不完美
例(iphone4屏幕):

<div id="wrap">   
   [站外图片上传中……(1)]
</div>

设置css样式

*{margin: 0;padding: 0}
#wrap  { width: 100%;}
#wrap img{    width: 100%;}

效果如下:


针对流体式布局的缺点有改进方式,就是设置一下min-width与max-width的值(某东用的)。但依然有缺点,就是让屏幕宽度大于max-width时,两侧会有留白
例:

<div id="wrap">   
   [站外图片上传中……(2)]
</div>

设置css样式

*{margin: 0;padding: 0}
#wrap  { 
   width: 100%;
   min-width:320px;
   max-width:640px;
}
#wrap img{    width: 100%;}

效果如下:


响应式布局

基本思想就是:利用媒体查询(@media)设置针对不同尺寸的设备展现不同的效果。用一套css兼容所有设备
注意写条件的时候,从大值往小值写,否则后面的会覆盖前面的

第一种方式,将判断条件写在style内

例:

<div></div>
<div></div>
<div></div>
<div></div>

CSS媒体查询设置

/* 设置默认的情况显示效果 */
div{    
    width:25%;  height: 100px;
    background: red; 
    /* css3的盒模型属性,内缩,border算在宽度(width)内 */
    box-sizing: border-box; 
    border:1px solid green; 
    float: left;
}
/* 平板情况显示效果  */
@media (max-width:1023px) {   
   div{ 
        width:50%; height: 100px;  
        background: red;     
        box-sizing: border-box;  
        border:1px solid green;    
       float: left;   
    }
}
/* 大屏手机情况显示效果 */
@media (max-width:480px) {   
 div{        
       width:100%; height: 100px; 
       background: red;     
       box-sizing: border-box;   
      border:1px solid green;        float: left;  
    }
}

效果如下:


默认情况
平板情况
大屏手机情况
第二种方式,将判断条件写在head的link标签内,需要创建对应的css文件
<link rel="stylesheet" href="css-1023.css" media="(min-width:1024px)">
<link rel="stylesheet" href="css-481-1023.css" media="(min-width: 481px) and (max-width: 1023px)">
<link rel="stylesheet" href="css-480.css" media="(max-width: 480px)">

相对单位布局(rem)

基本思路就是:利用rem单位,就是相对于跟(html)字体的大小,来计算相应元素的宽高

  1. 一般将html的font-size设置为:20px或30px或50px或100px
  2. 还有利用浏览器默认自己大小(16px)也就是16px*62.5%=10px,这样就是html{font-size:62.5%;},而不是html{font-size:10px;}因为浏览器(PC)最小就是12px。这样一来1rem = 10px;
    我们来简单的看一下:
<div id="wrap"> 
     <div id="div1">我是一个div标签</div>
</div>

CSS设置样式

#wrap{    font-size: 20px;}
#div1{    
  font-size: 1em;  
  width: 16em;   
  height: 2em; 
  background-color: lawngreen;
}

效果如下:


这里说一下为啥不用em,因为em是相对于父级字体大小的,这样一层套一层比较麻烦,还有就是当我想改变其中一个div的字体大小时,整个布局就乱套了
还有一个问题就是当我们的浏览器窗口发生大小变化时,原来的布局是不是也应该完美的显示呢。这里我们就利用js来根据浏览器可视区(clientWidth)来重新给html设置响应的字体大小

/* 这里我们利用了一个自执行函数 */
(function(){  
    change();  
    function change(){     
         /* 这里的html字体大小利用了一个简单书序公式(十字相乘),当我们默认设置以屏幕320px位基准此时的字体大小为20px(320    20px),那么浏览器窗口大小改变的时候新的html的fontSize(clientWidth  新的值)就是clientWidth*20/320 */
         document.documentElement.style.fontSize = document.documentElement.clientWidth*20/320 + 'px';  
    }    
 /* 监听窗口大小发生改变时 */
  window.addEventListener('resize',change,false);})();

注意:一般情况下我们利用rem单位来设置元素的宽高就行,没必要页面中的所有元素都用rem来弄(当然了这个也得看具体需求了)

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,282评论 0 26
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,377评论 0 6
  • 我是个害怕孤独的人,双子座都害怕孤独,不像天蝎以孤独为食,所以我不喜欢异地恋,也接受不了… 我嘘寒问暖无微不至...
    路不成双阅读 329评论 0 1
  • 车已经驶出家很远了,但是母亲和父亲的身影还是好像在我的眼前,心里难受的厉害。三十到家,初三,就离开了家。。。 在家...
    Echo_long阅读 174评论 1 3