# 自适应和响应式 为了适配移动端终端设备 ### 实现途径: 1.媒体查询 将设备按照不同的分辨率条件筛选,使符合条件的设备显示对应的样式,从而实现不同分辨率样式不同的效果 语法: ``` @media (max-width: 屏幕最大宽度){ ... 符合条件的样式 跟style样式表一样 含多个元素样式 } ``` 示例: ``` Document ``` 效果参考b.html > 使用媒体查询时,需要对应不同分辨率终端写多套所对应的样式,比较繁琐 > 2.百分比 通过’%‘单位来实现响应式效果。浏览器高度和宽度发生变化时,通过百分比单位可以使元素的高和宽随着浏览器的变化而变化,从而实现响应式效果 可以取百分比的属性: * 定位:top, right, bottom, left * 盒模型:width,height, margin,padding * 背景:backgroug-position, backgroud-size * 文本:text-indent * 字体:font-size css 百分比都相对于谁? 结论:css的布局块都是盒子,然后一个盒子的百分比其实是相对于其包含块的,也就是他的父级元素。 * 相对于父级宽度的: * width * max-width * min-width * padding * margin * text-indent * left * right ... * 相对于父级高度的: * height * max-height * min-height * top * bottom * 相对于主轴长度(在flex弹性盒子布局中) * flex-basis * 相对于继承字号的 * font-size * 相对于自身字号的 * line-height * 相对于自身宽高的 * border-radius 等border相关 * background-size ... * 相对于行高的 * verticle-align (设置元素垂直对齐方式) 示例: ``` Document
``` ![image-20210105085706956](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210105085706956.png) > 使用百分比做单位时,如果要定义一个元素的宽高,需要根据设计稿手动计算 换算成% 单位,容易出现误差 ### rem rem是一个相对单位,1rem等于html元素上字体设置的大小。我们只要设置html上font-size的大小,就可以改变rem所代表的大小。**其实rem布局的本质是等比缩放,一般是基于宽度**. 这样我们就有了一个可控的统一参考系。我们现在有两个目标: - rem单位所代表的尺寸大小和屏幕宽度成正比,也就是设置html元素的font-size和屏幕宽度成正比 - rem单位和px单位很容易进行换算,方便我们按照标注稿写css 使用: 借助js ``` //designWidth:设计稿的实际宽度值,需要根据实际设置 //maxWidth:制作稿的最大宽度值,需要根据实际设置 //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750) ;(function(designWidth, maxWidth) { var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid; function refreshRem() { var width = docEl.getBoundingClientRect().width; maxWidth = maxWidth || 540; width>maxWidth && (width=maxWidth); var rem = width * 100 / designWidth; remStyle.innerHTML = 'html{font-size:' + rem + 'px;}'; } if (docEl.firstElementChild) { docEl.firstElementChild.appendChild(remStyle); } else { var wrap = doc.createElement("div"); wrap.appendChild(remStyle); doc.write(wrap.innerHTML); wrap = null; } //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次; refreshRem(); win.addEventListener("resize", function() { clearTimeout(tid); //防止执行两次 tid = setTimeout(refreshRem, 300); }, false); win.addEventListener("pageshow", function(e) { if (e.persisted) { // 浏览器后退的时候重新计算 clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === "complete") { doc.body.style.fontSize = "16px"; } else { doc.addEventListener("DOMContentLoaded", function(e) { doc.body.style.fontSize = "16px"; }, false); } })(750, 750); /* 第一个参数是设计稿的宽度,一般设计稿有640,或者是750,你可以根据实际调整 第二个参数则是设置制作稿的最大宽度,超过750,则以750为最大限制。 */ ``` 1.复制上面这段代码到你的页面的头部的script标签的最前面。 2.根据设计稿大小,调整里面的最后两个参数值。 3.使用1rem=100px转换你的设计稿的像素,例如设计稿上某个块是100px * 300px,换算成rem则为1rem*3rem。 示例参考demo/rem.html