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

关于css中的单位

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

其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局。不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观。

em和rem

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

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

用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单位。

通过这些在方法在进行自适应布局的时候就可以更加的得心应手了~~

结论

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

<!DOCTYPE HTML>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
	<script>
		;(function(psdWidth,dividendFontSize,maxRootFontSize){
			// 为了代码更短
			var d = document
			var de = d.documentElement
			var w = window
			var on = ‘addEventListener‘
			var gbcr = ‘getBoundingClientRect‘
			var ps = ‘pageshow‘
			var head = d.head || d.getElementsByTagName(‘HEAD‘)[0]
			var style = d.createElement(‘STYLE‘) // 采用拼css的形式,而不是直接用document.documentElement.style.fontSize的形式的原因是,拼css可以通过加入!important获得最高优先级,http://jsbin.com/dopupudago/2/edit?html,js,output
			var resizeEventThrottleTimer
			// 移除任何text-size-adjust对字体大小的改变效果
			var textSizeAdjustCSS = ‘text-size-adjust:100%;‘
			var textSizeAdjustCSSAll =
				‘-webkit-‘+textSizeAdjustCSS
				+‘-moz-‘+textSizeAdjustCSS
				+‘-ms-‘+textSizeAdjustCSS
				+‘-o-‘+textSizeAdjustCSS
				+textSizeAdjustCSS

			var hasGbcr = gbcr in de
			var lastRootFontSize = null // 上一次设置的html的font-size
			function setRem(){
				var rootFontSize = Math.min(
					(
						hasGbcr?
							de[gbcr]().width // document.documentElement.getBoundingClientRect() iOS4.0+ 安卓2.0+  https://developer.mozilla.org/zh-CN/docs/Web/API/Element.getBoundingClientRect
							:w.innerWidth
					)
						/(psdWidth/dividendFontSize)
					,maxRootFontSize
				)
				// alert(‘2 iW_‘+w.innerWidth+‘  sw_‘+w.screen.width+‘  dpr_‘+devicePixelRatio+‘  or_‘+w.orientation+‘  gbcrw_‘+d.documentElement.getBoundingClientRect().width)
				if(rootFontSize != lastRootFontSize){
					// return
					style.innerHTML =
						‘html{‘
						+	‘font-size:‘+rootFontSize+‘px!important;‘ // 20=320/16 // 取16为默认html的font-size是因为浏览器都默认为16,不会导致抖动
						+	textSizeAdjustCSSAll
						+‘}‘
					lastRootFontSize = rootFontSize
				}
			}
			// 在一定延时内稀释setRem的调用
			function trySetRem(){
				clearTimeout(resizeEventThrottleTimer)
				resizeEventThrottleTimer = setTimeout(setRem,500)
			}
			psdWidth = psdWidth || 320
			dividendFontSize = dividendFontSize || 16
			maxRootFontSize = maxRootFontSize || 32
			head.appendChild(style)

			d[on](‘DOMContentLoaded‘,setRem,false)
			// 安卓在页面刚载入时w.screen.width不一定正确,特别是从一个未设置viewport meta的页面跳转过来时,需要多调整几次。见图:“show/2.3.6_从一个未设置viewport的页面跳转过来时,起初innerWidth和screen.width都是不对的.png”,于是在pageshow或onload事件触发时再设置一次
			if(‘on‘+ps in w){
				w[on](ps,function(e){
					if(e.persisted){
						trySetRem()
					}
				},false)
			}else{
				w[on](‘load‘,trySetRem,false)
			}
			w[on](‘resize‘,trySetRem,false)
			setRem()
		})(
			320, // 设置设计稿基准宽度
			16, // 设置开发时的被除数(见HOW TO USE第4步) 在设计稿基准宽度为320时最好设置为16(在在设计稿基准宽度为其他值时等比放大,如640时设置为32等)。因为浏览器默认的值就是16,这样代码失效或尚未起效时,不会有布局问题
			32 // 设置最大根元素font-size,请注意这是一个css像素值,而非物理像素值。它的作用是,当用户用非常宽的屏幕(pad、pc)访问页面时,不至于使得根元素的font-size超过这个值,使得布局非常难看。见图“show/wide_max_rem.jpg”
		)
	</script>
	<title>rem</title>
	<style>
		html,body{margin: 0;padding: 0;}
	</style>
</head>
<body>
	<div id="debug">

	</div>
	<div id="wrapper">
		<!-- content text -->
		<p style="
		    font-size:1rem
		    /*通过 font-size:16px; 除以16计算出来*/
		">一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十</p>

		<!-- icon -->
		<img src="up.png" alt="向上" style="position:fixed;
		    bottom:0.625rem;right:0.625rem;width:3rem;height:3rem;
		    /*通过 bottom:10px;right:10px;width:48px;height:48px; 各除以16计算出来*/
		">

		<!-- photo -->
		<img src="p1.jpg" alt="向上" style="margin:0 auto;display:block;
		    width:18.75rem;height:12.5rem;
		    /*通过 width:300px;height:200px; 各除以16计算出来*/
		">

	</div>
	<script>
	</script>
</body>
</html>

  

时间: 2024-10-10 04:55:30

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

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

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

微信小程序新单位rpx与自适应布局

rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我们先简单了解一下目前的主流的自适应布局解决方案: 响应式(Responsive web design) rem 流式布局 scale伸缩布局 响应式 响应式布局的问题在于需要维护多个样式文件,维护成本太大,一般的移动H5页面都不会优先考虑. rem rem是近几年比较流行的方案,淘宝移动web端就是

rem是如何实现自适应布局的?

http://caibaojian.com/web-app-rem.html 使用rem 然后根据媒体查询实现自适应.跟使用JS来自适应适配也是同个道理,不过是js更精确一点.使用媒体查询: html { font-size: 62.5% } @media only screen and (min-width: 481px) { html { font-size:94%!important } } @media only screen and (min-width: 561px) { html

rem手机端页面自适应布局(待修正下一篇完美布局)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> <script> (f

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,以及作者相关信息 ——作

rem自适应布局的回顾总结

使用rem实现自适应布局,应该算是当前移动前端的一大趋势,有些人对此还有点迷惑,搞不懂rem是如何实现自适应布局,如何根据设计稿来调整rem的值?rem布局如何用雪碧背景图片?rem一定要加载JS吗?rem的根html font-size设置为多少合适?看看这篇文章,也许能帮到你. 这些问题整理来自之前发表过的文章,细心的读者也可以自己翻翻之前的内容找到答案,本文统一给个回复,如果对你有用,还请点个赞,谢谢! rem自适应原理 rem是根据html的font-size大小来变化,正是基于这个出发

rem自适应布局

rem自适应原理 rem是根据html的font-size大小来变化,正是基于这个出发,我们可以在每一个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局.更多介绍请看这篇文章:rem是如何实现自适应布局的. rem的值 目前有两种,一种是根据js来调整html的字号,另一种则是通过媒体查询来调整字号. 使用js (function(designWidth, maxWidth) { var doc = document, win = window; var docEl = doc.

处理移动端自适应布局的方法- calc()与vw

在处理移动端自适应布局时,目前前端最流行的方法应该就是使用媒体查询,来设置HTML的字体大小,然后用rem为单位对Dom的宽高进行设置,这个方法的优势在于兼容性方面很好,劣势则在于当前市场上不同的机型太多,尺寸种类比较杂,所以要想做到所以尺寸机型都能适应,工作量相对比较大.目前也有人会选择用百分比进行布局,这个布局方法在仅仅处理元素的宽高上面非常好用,但是当js中要对dom元素的尺寸进行设置时,百分比的局限性就出来了,还有就是dom元素的font-size没办法用页面宽度百分比对他进行大小设置,

移动端网页 rem 自适应布局

(function(doc , win){var DocElement = doc.documentElement;var RsizeEvent = 'orientationchange' in window ? 'orientationchange' : 'resize';function ResetSize(){var deviceWidth = DocElement.clientWidth;if(!deviceWidth){return false;}DocElement.style.fo