一、关于css中的单位

  大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem。

  其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局。

  不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观。

1、em和rem

  首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算的,即1em为其父元素的字体大小,例如父元素的字体大小为12px则其子元素的1em为12px,2em则为24px。但是因为其只能针对父元素来进行计算,使用起来因为涉及到大量的运算,很不方便,因此平时使用不是很多。

  css3针对这种情况在css3的规范下推出了一个新的单位rem,rem的使用方式和em类似,只不过em是基于其父元素的字体大小来进行计算,而rem则是针对根元素即HTML这个标签的字体大小来进行计算,在这种情况下假如html的字体大小为12px,则在页面中左右元素的1个rem即为12px,2rem为24px。

2、用rem进行自适应布局:简单的自动适配所有屏幕

  使用rem进行自适应布局的关键就是给html赋值一个动态的font-size,在这里我们可以在页面dom加载完毕之后使用js获取到页面宽度(高度也可以),然后将其除以一个固定的定量,比如20,然后将结果赋给html的font-size,这样我们就得到了一个会根据页面宽度的变化而不断变化的值,这个值即是1rem。代码如下:

//页面大小出现变化的时候再次获取新的font-size值
$(window).resize(function(){
setHtmlFontSize();
}) //初始化执行 setHtmlFontSize(20);
//动态设置html元素的font-size的方法
function setHtmlFontSize(num){
//页面的宽度,其中17为页面默认的导航条的宽度
var _w=document.documentElement.clientWidth-;
$('html').css('fontSize',_w/num);
}

  举个例子,我们先用js获取页面的宽度,除以20进行计算之后,把这个值赋给html的font-size,得到一个根据页面宽度变化而变化的单位1rem,这个时候假如我们拿到的设计稿的宽度是640px,将其除以20,这样我们就得到在页面宽度为640px的情况下1rem即为32px,如果设计稿中的banner图部分的宽度是320px,而高度则是160px,这个部分需要进行自适应,那么我们就可以给这个banner图宽度为320/32=10rem,而高度为160/32=5rem。这样赋值之后假如页面的宽度就是640px,那banner的尺寸为320px160px,宽度是屏幕尺寸的一半,高度为1/4,这个时候假如屏幕变宽为1280px,那这个时候页面中1rem所代表的尺寸就变成了1280/20=64px,banner的尺寸变成了相应的640px320px,宽度依然是屏幕尺寸的一半,高度为1/4。这样就非常简单的实现了自适应的布局赋值。

  通过这种动态的设定html的font-size的值之后,我们可以很轻易的给页面上任何地方,例如padding,width,height,margin设置大小,并且这个大小都是自适应的。

二、关于calc()

  在进行自适应布局的时候有时候会碰到需要有给固定宽高的地方,比如一个div宽度为屏幕尺寸的一半,但是有10px的padding,那在这种情况下假如我们直接给宽度50%,或者计算完之后的rem单位,再给padding,因为盒模型的关系导致其宽度为50%+20px。但是又因为50%是一个不固定的值,导致很难计算出一个具体的值,在这种情况下我们就可以使用css3中的一个计算方法:calc(),可以设置

div{
width:calc(50% - 20px);
}

  这样设置之后得到的结果就是计算之后的结果,任何需要给具体的值的地方都可以使用calc来进行计算,不过需要注意目前此方法只能进行  + - * /  的四则运算,并且在计算符号前后都需要有一个空格。当然上面的50%也可以换成计算之后的rem单位。

  注意点:calc 内部的表达式,在使用运算符号时,两遍必须加上空格(虽然乘除可以无视,但还是建议带上),不然会解析错误。

总结:

  使用rem单位以及calc()方法在进行自适应布局非常强大,可以配合媒介查询,可以非常灵活的控制各种元素的自适应。

关于使用rem单位、css函数calc()进行自适应布局的更多相关文章

  1. 利用CSS函数calc(...)实现Web页面左右布局

    前言 因为自己的网站需要,想要做一个左右布局的页面: 左边是导航菜单之类的东西.右边是文档内容(因为最近看的一些软件的文档页面都是这么布局的): 左边固定宽度——300像素.右边使用剩余的宽度: 左边 ...

  2. 关于使用rem单位,calc()进行自适应布局

    关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在 ...

  3. css函数——calc()和attr()

    css也有函数?好吧,我孤陋寡闻了.这里记录一下学习情况. calc()函数 定义:用于动态计算长度值 支持版本:css3 运算符前后都需要保留一个空格,例如:width: calc(100% - 1 ...

  4. 使用css3中calc()进行自适应布局

    calc()能做什么? calc()可以通过计算得到元素的宽度或者高度,让我们很容易进行自适应布局. 你可以为一个div元素,使用百分比.em.px和rem单位值计算出其宽度或者高度,比如说“widt ...

  5. CSS 负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head>     <meta charset="UTF-8"& ...

  6. CSS负边距自适应布局三例

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset=”UTF-8″> <title& ...

  7. css负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> ...

  8. 使用CSS实现三栏自适应布局(两边宽度固定,中间自适应)

    来源:http://blog.csdn.net/cinderella_hou/article/details/52156333 所谓三列自适应布局指的是两边定宽,中间block宽度自适应.这道题在今年 ...

  9. css实现九宫格图片自适应布局

    我之前写九宫格自适应布局的时候,每个格子是使用媒体查询器(@media)或者js动态设置css,根据不同的手机屏幕宽度,适配不同手机,但是这样有个很大的缺点,那就是移动端的屏幕尺寸太多了,就得写很多代 ...

随机推荐

  1. XXX on tree

    %了发树上莫队 nlognsqrt(n) // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; in ...

  2. BZOJ1171 : 大sz的游戏

    f[i]=min(f[j])+1,线段j与线段i有交,且l[i]-l[j]<=L. 线段j与线段i有交等价于y[j]>=x[i],x[j]<=y[i]. 因为l[i]递增,所以可以维 ...

  3. C++中如何访问全局变量和全局函数

    全局变量和全局函数是相对局部变量和局部函数而言的,不在{}或者for, if 等范围内的都是全局变量或者全局函数,最简单的是在同一个文件中去声明. 例如在mian.cpp中 #include < ...

  4. JAVA初学练手项目,学生管理系统

    github地址:https://github.com/qscqesze/StudentManager 简单描述一下: UI层面用于接受用户的处理信息,然后移交给StudentDao去处理数据. 其中 ...

  5. Android应用程序模型:应用程序,任务,进程,线程

    大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的.exe).它所运行的进程以及和用户交互的图标和应用之间有一种严格的1对1关系.在Android系统里,这些关联要松散得多.并 ...

  6. stat,fstate,lstat函数

    #include <sys/stat.h> int stat (const char *restrict pathname,struct stat* restrict buf) int f ...

  7. discuz修改太阳,月亮,星星等级图标

    想必大家都想修改一下默认的等级图标吧,刚才在论坛上看见很多大神的方法都是要修改文件的,不过为了安全起见需要事先备份好才改,这种方法是可行的,但可能有些新手站长不会修改,又或者改错了恢复不来,现在我教大 ...

  8. [Winform]默认以管理员身份运行程序

    摘要 在使用setupfactory打包之后,想让程序默认以管理员身份运行,因为涉及到创建文件删除文件的操作,如果权限比较低的话,会出现没有权限操作的bug. 解决办法 在项目中找到app.manif ...

  9. android模拟器修改时间

        我们看右上角的模拟器的时间,是不是和我们现在时间不同步呢   点击主菜单之后,我们找到下边的设置的按钮   下边找到时间和日期, 怎么把页面修改中文, 可以看(安卓模拟器怎么修改语言)的经验 ...

  10. android加密DESede/CBC/PKCS5Padding

    from://http://my.oschina.net/u/269082/blog/56163 工作中需要和HPH对接,接口一些敏感信息,讨论后用3DES加密,由于我做的android邮件客户端是依 ...