关于使用rem单位、css函数calc()进行自适应布局

一、关于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(20);
}) //初始化执行 setHtmlFontSize(20);
//动态设置html元素的font-size的方法
function setHtmlFontSize(num){
    //页面的宽度,其中17为页面默认的导航条的宽度
    var _w=document.documentElement.clientWidth-17;
    $(‘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()方法在进行自适应布局非常强大,可以配合媒介查询,可以非常灵活的控制各种元素的自适应。

原文地址:https://www.cnblogs.com/goloving/p/9363373.html

时间: 2024-08-06 19:21:37

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

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

关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局.不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观. em和rem 首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算的,即1e

calc()制作自适应布局

本文由大漠根据Osvaldas Valutis的<Imitating calc() Fallback or Fixed-Width Sidebar In Responsive Layout>所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点.如需转载此译文,需注明英文出处:http://osvaldas.info/imitating-calc-fallback-fixed-width-sidebar-in-responsive-layout,以及作者相关信息 ——作

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

我之前写九宫格自适应布局的时候,每个格子是使用媒体查询器(@media)或者js动态设置css,根据不同的手机屏幕宽度,适配不同手机,但是这样有个很大的缺点,那就是移动端的屏幕尺寸太多了,就得写很多代码,才能实现我们想要的效果. 今天突发奇想,使用了纯css实现了我想要的效果,下面就和大家来分享,上代码; <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>九

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

来源:http://blog.csdn.net/cinderella_hou/article/details/52156333 所谓三列自适应布局指的是两边定宽,中间block宽度自适应.这道题在今年网易内推前端工程师面试的时候也被问到. 我这里主要分为两大类,一类是基于position传统的实现,一类是基于css3新特性弹性盒模型布局实现. 1. 基于传统的position和margin等属性进行布局 这里也分为三种方法,分别为绝对定位法,圣杯布局,自身浮动法. 1).绝对定位法 绝对定位法原

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

所谓三列自适应布局指的是两边定宽,中间block宽度自适应.这道题在今年网易内推前端工程师面试的时候也被问到. 我这里主要分为两大类,一类是基于position传统的实现,一类是基于CSS3新特性弹性盒模型布局实现. 1. 基于传统的position和margin等属性进行布局 这里也分为三种方法,分别为绝对定位法,圣杯布局,自身浮动法. 1).绝对定位法 绝对定位法原理是将左右两边使用absolute定位,因为绝对定位使其脱离文档流,后面的center会自然流动到他们上面,然后使用margin

div css左边固定右边自适应布局

web前端开发之布局:先看效果图,最简单的左右布局.有可能还会被面试问道哈哈哈.一看也没什么特别之处,就是左边固定,右边自适应,就这么简单. 原理:通过设置一个margin-left;或者margin-right就可以搞定.方法有很多,这次就只介绍这种设置margin的. 代码: <!doctype html> <html>  <head>   <meta charset="UTF-8">   <title>Document&

写一个Sublime Text 2插件(CSS文件里px单位替换成rem单位)

三年前我就知道了sublime text 不过那时候用DW还是很爽的样子,后来有天想为难自己了,于是用了两年的vim和五笔,最近又觉得这么好编辑器也可以试试,改变一下自己,用一下的,不过由于工作的原因,没有坚持下来,有时候顺手似乎比先进更重要一些. 最近工作都是做一些移动端的页面,而微信的长按出现二维码有个bug,在ios里缩放的页面长按是不会出现"识别二维码"的.所以需要转换一下,不要让页面缩放,要自适应,这个时候就用rem单位来做的会比较好一些,而我的同事之前开发了一个px to

使用rem单位时css sprites的坑

在使用rem单位时,用雪碧图(我不喜欢这个名字!)做背景图片在移动端有时会有错位.pc模拟是没有问题的,而且错位的情况不同的手机还不太一样.这里说几个解决的办法.出现这个问题的原因我找了很久都找不到,再接着找吧! background-size和background-position都用rem 我实际使用中是用这个方法解决问题的.但是据说这样还是会有错位的时候. 转换为px 这个是一定有效的方法.background-size 和 position都用px写死.然后动态增加.zoom{trans

css之calc();

关于calc()这个css函数,有太大的作用了,相信熟悉css的朋友们,对这个函数都不会陌生,如果你属于这一类,那么你可以跳过了,因为这篇也没什么很重要的,只是对它的一些基本的介绍. 好了我是怎么开始接触到这个属性的呢,一定是当时遇到了什么问题,然后才发现了有这种方法.见下图: 那么由于要实现这种效果,开就真的用到这个css函数了,不然就得用js来做了,就太麻烦了.(如果这个例子有点牵强将将就一下吧),于是我与calc()就这样在茫茫码海中见面相遇了. calc()是可以在任何地方使用的<len