博客列表 >响应式设计中相对单位学习和探讨

响应式设计中相对单位学习和探讨

吾逍遥
吾逍遥原创
2020年10月22日 16:02:501178浏览

一、学习的新知识

现在多端需要响应式设计,页面能适应手机、平板、电脑和大屏设备进行自适应。在我的作业https://www.php.cn/blog/detail/24434.html已经详细分析了em和rem联系与区别,在作业https://www.php.cn/blog/detail/24548.html演示了em和rem的应用。今天又接触了新的知识。

  • 相对单位vw、vh、vmin和vmax 它们都是相对于视口view(浏览器窗口中用来显示文档的可视区域, 不包括地址栏,菜单,工具条,状态栏,控制台)相对单位。决定了响应式设计中整体布局
  • 媒体查询@media 通过它识别不同尺寸设备,从而调整尺寸适应。
  • 自定义变量 以2个短横线为前缀即’—‘,如—textcolor:red;

二、字号的相对单位

与字号相关的单位有绝对值px,也有相对单位em和rem。rem(root em的缩写)是根元素的字号大小,而em是元素的字号大小(其中若是用于font-size时则继承父元素)。一般应用建议是:

  1. rem: 用在font-size,设置字号,尽可能不要用在:root
  2. em: 用在依赖字号的属性的上,padding,margin,width, height,border-radius,line-height,text-indent….。应该说者都可以用,不过建议需要响应式的地方使用em更好。
  3. px: border,边框一般不随屏幕而变化宽度。
  4. em应用在设置font-size时要注意多层子元素的递归问题,所以不要随意使用em设置font-size,要少用或不用,除非你是可以预测的,如组件中还是建议使用em,使用rem则导致不灵活,这点以后会再说明。
  1. .panel {
  2. border: 1px solid lightgray;
  3. padding: 0.5em 1em;
  4. background-color: lightgray;
  5. border-radius: 0.5em;
  6. }
  7. .panel > h3 {
  8. font-size: 1.3rem;
  9. margin: 0.2em auto;
  10. }
  11. .panel > p {
  12. font-size: 1.1rem;
  13. line-height: 2em; /* 行高 */
  14. text-indent: 2em; /* 缩进2个字符 */
  15. }
  16. /* 小屏,宽度大于400px */
  17. @media screen and (min-width: 400px) {
  18. :root {
  19. font-size: 0.75em;
  20. }
  21. }
  22. /* 平板,宽度大于800px */
  23. @media screen and (min-width: 800px) {
  24. :root {
  25. font-size: 0.875em;
  26. }
  27. }
  28. /* PC,宽度大于1200px */
  29. @media screen and (min-width: 1200px) {
  30. :root {
  31. font-size: 1em;
  32. }
  33. }

效果 https://codepen.io/woxiaoyao81/pen/QWEGgOb

三、视口的相对单位

  • 视口: 浏览器窗口中用来显示文档的可视区域, 不包括地址栏,菜单,工具条,状态栏,控制台
  • vw: 视口”初始包含块”宽度的 1 / 100
  • vh: 视口”初始包含块”高度的 1 / 100
  • vw: 选择视口宽或高中较小的一个值,如80vmin就是80vw和80vh中最小值。
  • vw: 选择视口宽或高中较大的一个值,如80vmax就是80vw和80vh中最大值。
  1. <style>
  2. .box{ width: 100vw; height: 30vh; margin: 5px auto; }
  3. .red{ background-color: red; }
  4. .green{ background-color: green; }
  5. .blue{ background-color: blue; }
  6. </style>
  7. <div class="container">
  8. <div class="box red"></div>
  9. <div class="box green"></div>
  10. <div class="box blue"></div>
  11. </div>

效果 https://codepen.io/woxiaoyao81/pen/eYzBRKW

四、响应式设计中相对单位使用小结

通过这几天相对单位的学习,可以说是让我又重新认识了响应式布局,解决了uniapp的UI框架只适应竖屏,对于横屏则显示很不友好。无论是uni-ui还是uview-ui首先都适配了竖屏,对于横屏考虑很少,再一个就是字号相对单位和视口相对单位选择不是很正确,导致组件在具体环境中适应性差。

常见的相对单位和建议应用场景:

  1. 字号的相对单位em和rem: rem用于页面内字号em用于组件内字号,这样组件就能根据容器自适应调整,正是根据这个我对uniapp的UI组件进行了修改,较好适应了横屏和竖屏。
  2. 视口的相对单位vw、vh、vmin和vmax: 多用于整体布局,划分几行几列。不建议用于组件内或局部布局
  3. 小程序端的相对单位rpx:我觉得rpx是视口宽度单位更进一步细化,vw分为100份,而rpx则将视口分为750份,更精细了。不过rpx只能用于移动端,而且只是针对横向。经测试在PC端直接使用无效。
  4. 百分比%: 相比于vw和vh等,它更适合组件内或局部布局,不建议它进行整体布局。对于横向百分比和竖向百分比的计算规则可见我的作业https://www.php.cn/blog/detail/24548.html的第一节第5小点的分析,由于是个人测试总结,对于百分比认识难免有失误,还望老师和同学们批评

下面源码通过相对单位综合使用实现了类似于Grid布局

  1. <style>
  2. * { box-sizing: border-box; text-align: center; }
  3. body { display: flex; flex-direction: column; justify-content: space-between; }
  4. /* 整体布局:建议使用vw和vh */
  5. .page-head { height: 10vh; background-color: darkcyan; }
  6. .container { height: 75vh; background-color: lightblue; display: flex; }
  7. .page-foot { height: 10vh; background-color: lightsalmon; }
  8. /* 局部布局:建议使用百分比,盒模型相关属性使用em */
  9. .aside {
  10. /* 局部使用vw效果不好 */
  11. /* width: 30vw; */
  12. width: 30%;
  13. height: 100%;
  14. background-color: lightslategray;
  15. background-clip: content-box;
  16. padding: 0.5em;
  17. display: flex;
  18. justify-content: center;
  19. align-items: center;
  20. }
  21. .main {
  22. /* 局部使用vw效果不好 */
  23. /* width: 68vw; */
  24. width: 70%;
  25. height: 100%;
  26. background-color: peru;
  27. background-clip: content-box;
  28. padding: 0.5em;
  29. display: flex;
  30. flex-direction: column;
  31. justify-content: space-between;
  32. }
  33. .content {
  34. height: 50%;
  35. display: flex;
  36. justify-content: center;
  37. align-items: center;
  38. }
  39. .section-box {
  40. display: flex;
  41. height: 50%;
  42. }
  43. .section {
  44. width: 50%;
  45. height: 100%;
  46. background-color: violet;
  47. background-clip: content-box;
  48. padding: 0.5em;
  49. display: flex;
  50. justify-content: center;
  51. align-items: center;
  52. }
  53. </style>
  54. <body>
  55. <header class="page-head"><h3>header</h3></header>
  56. <div class="container">
  57. <aside class="aside"><h3>aside</h3></aside>
  58. <main class="main">
  59. <div class="content"><h3>main</h3></div>
  60. <div class="section-box">
  61. <section class="section"><h3>section</h3></section>
  62. <section class="section"><h3>section</h3></section>
  63. </div>
  64. </main>
  65. </div>
  66. <footer class="page-foot"><h3>footer</h3></footer>
  67. </body>

效果图

源码 https://codepen.io/woxiaoyao81/pen/XWKNaqy

五、学习后总结

到这里,相对单位基本学习完了,通过老师讲解演示和自己测试,终于较为系统的认识了相对单位应用场景。可以归纳如下:

  • 字号相对单位多用于盒模型,em用于组件内,rem用于页面或组件外,根据尺寸使用px或rpx来调整,em和rem定义的属性自动相应调整。
  • 视口相对单位vw和vh等,主要用于整体布局。
  • 百分比用于组件内或局部布局,组件或局部灵活适应开发者的布局。

更多源码见我的Github https://github.com/woxiaoyao81/phpcn13和Gitee https://gitee.com/freegroup81/phpcn13

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
吾逍遥2020-10-22 17:29:361楼
收到,静态直接图片,动态我就放下codepen链接