经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
rem自适应移动端布局
来源:cnblogs  作者:不知名前端李小白  时间:2022/1/17 10:48:31  对本文有异议

简介

在页面整体布局中,页面元素的尺寸大小(长度、宽度、内外边距等)和页面字体的大小也是重要的工作之一。

一个合理设置,则会让页面看起来层次分明,重点鲜明,赏心悦目。反之,一个不友好的页面尺寸和字体大小设置,则会增加页面的复杂性,增加用户对页面理解的复杂性;甚至在当下访问终端(iPhone、iPad、PC、Android…)层出不穷的今天,适应各式各样的访问终端,将成为手中的一块“烫手的山芋”。

所以在近几年,“九宫格”式的“流式布局”再度回归。为了提供页面布局,及其它的可维护性、可扩展性,我们尝试将页面元素的大小,以及字体大小都设置为相对值,不再是孤立的固定像素点。使其能在父元素的尺寸变化的同时,子元素也能随之适应变化。以及结合少量最新CSS3的@media查询,来实现“响应式布局”,bootstrap这类CSS框架大势兴起。

然而在CSS中,W3C文档把尺寸单位划为为两类:相对长度单位绝对长度单位

 

相对单位:

%:相对单位,它是相对于父级(自身)大小进行定位

  • 缺点:能确定范围的还是比较好计算,对于不太好确定值的地方不好使用百分比,并且会导致变形,高度一般不好控制

em:相对于当前容器的字体大小进行变化,比如当前容器内字体大小为20px,那么1em = 20px

  • 缺点:会根据当前容器字体大小发生变化,假设每个容器字体大小不一致,那么计算会非常繁琐

rem:font size of the root element。相对于当前根(html)元素的字体大小进行变化,比如当前设置html的字体大小为20px,那么1rem = 20px。浏览器默认的1rem = 16px

绝对单位:

px:像素单位是绝对单位,你设置了多少,不管什么屏幕下,都会保持不变。

缺点:任何情况下都是固定值

em和rem的区别点击查看

 

如何才能使用rem进行适配呢?

  • 字体大小

    • 值根据html根元素大小而定,同样可以作为宽度,高度等单位

  • 适配原理

    • 将px替换成rem,动态修改html的font-size适配

  • 兼容性

    • Ios6以上和android2.1以上,基本覆盖所有流行的手机系统

下面是我平时写移动端使用的rem自适应配置:

  1. // 动态修改 html font-size 大小
  2. // 通过js操控根元素的字体大小,从而做到屏幕适配
  3. !(function(doc,win){
  4. var docHtml =doc.documentElement;
  5. // 判断窗口有没有orientationchange这个方法,有就赋值给一个变量,没有就返回resize方法
  6. resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  7. resizes = function(){
  8. // 获取当前屏幕的大小
  9. var cw =docHtml.clientWidth;
  10. // 如果没有获取到当前屏幕的大小
  11. if(!cw) return;
  12. if (cw >= 750) {
  13. docHtml.style.fontSize = '100px';
  14. } else {
  15. // 动态修改font-size 100 * (375 / 750) = 50 (iPhone6/7/8为例)
  16. docHtml.style.fontSize = 100 * (cw / 750) + 'px';
  17. }
  18. }
  19. if (!doc.addEventListener) return;
  20. /*
  21. addEventListener事件方法接受三个参数:
  22. (1)事件名
  23. (2)回调执行函数
  24. (3)是否冒泡
  25. */
  26. win.addEventListener(resizeEvt,resizes,false);
  27. // 绑定浏览器缩放与加载事件
  28. doc.addEventListener('DOMContentLoaded', resizes, false);
  29. })(document,window)

将以上代码放入一个单独的js文件当中,然后引入html文件中使用即可,这样在更换手机型号时,它就会动态修改html根节点的字体大小

 

下面给大家演示下实际代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <script src="./resize.js"></script>
  8. <style type="text/css">
  9. *{
  10. margin: 0px;
  11. padding: 0px;
  12. }
  13. html,body{
  14. height: 100%;
  15. width: 100%;
  16. }
  17. /* 设置根元素的字体大小 */
  18. html{
  19. font-size: 50px;
  20. }
  21. .header{
  22. width: 100%;
  23. height: 60px;
  24. line-height: 60px;
  25. text-align: center;
  26. background-color: lightcoral;
  27. font-size: 30px;
  28. color: #ccc;
  29. }
  30. ul{
  31. list-style: none;
  32. /* 弹性布局 */
  33. display: flex;
  34. flex-wrap: wrap;
  35. justify-content: space-around;
  36. margin-top: 0.2rem;
  37. }
  38. ul li.item{
  39. /* root size :50px 1rem =50px */
  40. width: 2rem;
  41. height: 2rem;
  42. border: 1px solid orangered;
  43. margin-bottom: 0.2rem;
  44. }
  45. </style>
  46. </head>
  47. <body>
  48. <!-- 头部 -->
  49. <header class="header">
  50. <div class="header_top">
  51. <h3>移动端适配</h3>
  52. </div>
  53. </header>
  54. <!-- 主体内容部分 -->
  55. <ul>
  56. <li class="item"></li>
  57. <li class="item"></li>
  58. <li class="item"></li>
  59. <li class="item"></li>
  60. <li class="item"></li>
  61. <li class="item"></li>
  62. <li class="item"></li>
  63. <li class="item"></li>
  64. <li class="item"></li>
  65. </ul>
  66. </body>
  67. </html>

(上面引入的resize.js 就是rem自适应配置文件)

 

运行效果:

          (基于IPhone 6/7/8)

 

 

          (更改手机型号,动态修改根元素字体大小)

 

          (注意!型号为iPad Pro时clientWidth已经大于750,所以根节点字体大小设置为100px)

 

至此,就完成了rem自适应移动端

 

本文来自博客园,作者:不知名前端李小白,转载请注明原文链接:https://www.cnblogs.com/libo-web/p/15793238.html

原文链接:http://www.cnblogs.com/libo-web/p/15793238.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号