CSS3有关响应式的原理学习过程

一、通过media query 和rem来进行响应式实现

原理:
1、media query媒体查询,通过判断不同的屏幕尺寸大小,来给html标签设置不同font-size
2、其他元素都采用rem控制大小,即可实现响应式的效果

缺点:
media query媒体查询设置多个不同的尺寸是一个范围,在当前范围内切换是没有响应式效果,在切换到另一个范围的瞬间时,会明显有一个卡顿的感觉。

代码:

// 常见的媒体查询尺寸(常用的手机尺寸):
// less
// 设计稿划分为10等份(750px的设计稿,一份就是75px了,375px的设计稿,一份就是37.5px,其它同理)
@divide:10
@media (min-width:320px){
	html{
		font-size: 320px / @divide
	}
}
@media (min-width:360px){
	html{
		font-size: 360px / @divide
	}
}
@media (min-width:375px){
	html{
		font-size: 375px / @divide
	}
}
@media (min-width:400px){
	html{
		font-size: 400px / @divide
	}
}
@media (min-width:480px){
	html{
		font-size: 480px / @divide
	}
}
@media (min-width:540px){
	html{
		font-size: 540px / @divide
	}
}
@media (min-width:720px){
	html{
		font-size: 720px / @divide
	}
}
@media (min-width:750px){
	html{
		font-size: 750px / @divide
	}
}

//使用举例:750px的设计稿,里面有个宽高100px的盒子,外边距是75px
// 先计算一下,按照你定的几等份,一份是多少px。那这里就是750 / 10 = 75px
@baseFontSize:75
div{
	// 用设计稿上的尺寸除一份的尺寸,单位注意得是rem哦,这样就ok了
	width: 100rem / @baseFontSize;
	height: 100rem / @baseFontSize;
	margin: 75rem / @baseFontSize;
}

二、通过js和rem来进行响应式实现

还记得第一种的缺点吗,媒体查询设置的是尺寸的某个范围,在当前范围内的切换是不会有响应式效果的,而且范围切换的一瞬间会有个明显的卡顿效果。
那就多设几个范围?
NoNoNo,我可以用js去一直监听呀,然后动态的修改根元素Html标签的font-size值呀。

原理:
1、js动态监听页面尺寸变化,然后动态的修改html的font-size
2、其他元素都采用rem控制大小,实现响应式的效果

缺点:
多了js的代码,一直监听页面的尺寸变化浪费资源,而且和css有了耦合。

实现:
flexible:一个封装好的动态改变html的font-size的JS文件。GitHub地址
作者也说了:现在大部分主流浏览器已经支持vw的属性,咱第三个就说这个。所以这个flexible动态改变html的font-size已经不推荐了。


三、通过vw来进行响应式实现

随着越来越多的浏览器兼容vw单位,以上两种实现方式的缺点都已解决:不会有卡顿,也没有js。

原理:
1、可视窗口宽度为100vw,高度为100vh。
2、和第一种实现方式类似,第一种是分成了若干等份,计算元素占比,单位rem。而vw可以看成分成了100份,每一份是1vw。然后计算元素占比,单位vw。
3、其他元素都采用vw控制大小,即可实现响应式的效果

缺点:
如果屏幕很大或很小,视觉效果会很差,因为元素大小是根据视口宽度的改变而改变的。

代码:

// sass
// 设计稿的尺寸(以750px举例)
$vmBase:750
@function vw($px) {
    @return ($px / $vmBase) * 100vw;
}

// 宽高100px的盒子,75的外边距
div{
	width : vw(100);
	height: vw(100);
	margin: vw(75);
}

四、通过vw和rem进行响应式实现

为了解决第三种的缺点,通过rem的配合。

原理:
1、在第三种vw的基础上,通过vw的相关计算,给html一个动态的font-size(其实就是vw),其他元素不再使用vw单位,继续使用rem为单位
2、再给body设置一个最大最小限制,再限制一下html的font-size,这样其他元素也就有最大最小值了。

代码:

// 以750设计稿为例
$vwFontsize: 75; 
// 宽75px元素的=1rem
@function rem($px) {
    @return ($px / $vwFontsize) * 1rem;
}
html {
	// 在最小值最大值范围之间,一个动态的font-size(我选的是10vw)
	// **重点:这里是10vw,那对应上rem那个方法返回的就是*1rem,最大值最小值就是75px和32px;同理,如果是20v,那返回的是*0.5rem,最大值最小值就是150px和64px
    font-size: 10vw;
    // 限制根元素最大值,最小值
    @media screen and (max-width: 320px) {
        font-size: 32px;
    }
    @media screen and (min-width:750px) {
        font-size: 75px;
    }
}
body {
	// 一般手机就是320-750
    max-width: 750px;
    min-width: 320px;
    div{
    	width: rem(100);
    	height: rem(100);
    	margin: rem(75);
    }
}

五、响应式?

其实不难发现,上边的四种情况不能称之为响应式,他们最多算是适配了不同的手机屏幕尺寸。
那什么是响应式呢,在完美适配手机屏幕尺寸的基础上,还能在平板、电脑、超大电脑上实现样式的适配,才能称为响应式。

1、看完前边的内容,其实一小部分响应式的原理应该已经清楚了一些

  • 尺寸的不同,宽高字体大小不同(上文内容)
  • 手机、平板、电脑等尺寸差别比较大的时候怎么办?上文第四种有最大最小值做限制,那肯定不行呀!难不成在电脑上还看手机的那种尺寸吗?
  • 其实尺寸差别比较大的时候,我们可以用media query监听呀,然后给他一个新的样式布局呀!
  • 就比如:手机上内容一行可以放两列,你在电脑上,就给他放四列。
  • 啊,这难道同一个内容,我要响应,就得写好几种样式吗,那多麻烦!
  • 这不就有了Bootstrap吗,中文文档在这。

2、我的Bootstrap笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值