flexible

媒体查询(PC + 移动自适应)

  1. media queries :主要通过查询不同的宽度来执行不同的css代码,最终以达到界面的配置。
  2. 核心语法:
  3. @media screen and(max-width:600px){
  4. /**
  5. */
  6. html{
  7. font-size:32px;
  8. }
  9. }
  • media query 可以做到设备像素比的判断,方法简单,成本较低,特别是对于PC端和移动端维护同一套代码的时候;Bootstrap框架就是使用这种方式布局;
  • 调整屏幕宽度的时候,不需要刷新页面即可响应;
  • 图片便于修改,只需要修改CSS文件;

    优点:

    可同时去适配PC + 移动端

    缺点:

    成本过高,less库需要写至少两套

    flex + rem

flexible.js较为成熟

搭配vscode,将其基础设置修改为80px

  1. // 设计稿1920px * 1080
  2. // 1rem = 1920/24 = 80px
  3. (function flexible(window, document) {
  4. var docEl = document.documentElement;
  5. var dpr = window.devicePixelRatio || 1;
  6. // adjust body font size
  7. function setBodyFontSize() {
  8. if (document.body) {
  9. document.body.style.fontSize = 12 * dpr + "px";
  10. } else {
  11. document.addEventListener("DOMContentLoaded", setBodyFontSize);
  12. }
  13. }
  14. setBodyFontSize();
  15. // set 1rem = viewWidth / 24
  16. function setRemUnit() {
  17. var rem = docEl.clientWidth / 24;
  18. docEl.style.fontSize = rem + "px";
  19. }
  20. setRemUnit();
  21. // reset rem unit on page resize
  22. window.addEventListener("resize", setRemUnit);
  23. window.addEventListener("pageshow", function(e) {
  24. if (e.persisted) {
  25. setRemUnit();
  26. }
  27. });
  28. // detect 0.5px supports
  29. if (dpr >= 2) {
  30. var fakeBody = document.createElement("body");
  31. var testElement = document.createElement("div");
  32. testElement.style.border = ".5px solid transparent";
  33. fakeBody.appendChild(testElement);
  34. docEl.appendChild(fakeBody);
  35. if (testElement.offsetHeight === 1) {
  36. docEl.classList.add("hairlines");
  37. }
  38. docEl.removeChild(fakeBody);
  39. }
  40. })(window, document);

flexible升级版

使用

  1. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
  2. <script src="./node_modules/amfe-flexible/index.js"></script>
  1. (function flexible (window, document) {
  2. var docEl = document.documentElement
  3. var dpr = window.devicePixelRatio || 1 // 显示设备的物理像素分辨率与CSS像素分辨率
  4. // adjust body font size
  5. function setBodyFontSize () {
  6. if (document.body) {
  7. document.body.style.fontSize = (12 * dpr) + 'px'
  8. }
  9. else {
  10. document.addEventListener('DOMContentLoaded', setBodyFontSize)
  11. }
  12. }
  13. setBodyFontSize();
  14. // set 1rem = viewWidth / 24
  15. function setRemUnit () {
  16. // 最小400px,最大2560px
  17. let width = docEl.clientWidth
  18. if (width/dpr <400) {
  19. width = 400 * dpr
  20. } else if (width/dpr > 2560) {
  21. width = 2560 * dpr
  22. }
  23. var rem = width / 24 // 1920下,1rem=80px
  24. docEl.style.fontSize = rem + 'px'
  25. }
  26. setRemUnit()
  27. // reset rem unit on page resize
  28. window.addEventListener('resize', setRemUnit)
  29. window.addEventListener('pageshow', function (e) {
  30. if (e.persisted) {
  31. setRemUnit()
  32. }
  33. })
  34. // detect 0.5px supports
  35. if (dpr >= 2) {
  36. var fakeBody = document.createElement('body')
  37. var testElement = document.createElement('div')
  38. testElement.style.border = '.5px solid transparent'
  39. fakeBody.appendChild(testElement)
  40. docEl.appendChild(fakeBody)
  41. if (testElement.offsetHeight === 1) {
  42. docEl.classList.add('hairlines')
  43. }
  44. docEl.removeChild(fakeBody)
  45. }
  46. }(window, document))

监听窗口,设置比例,自动缩放(vw)

如果说我们要一个不需要JS和CSS耦合在一起的单位,那vw/vh就是一个不错的选择。

视口是什么? 浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小

vw:view width,指视口宽度的百分比,如:1vw = 视口宽度的1%
vh:view height,指视口高度的百分比,如:1vh = 视口高度的1%
vmin:vmin的值是当前vw和vh中较小的值
vmax:vmax的值是当前vw和vh中较大的值

点击查看【juejin】

clamp新属性

可参考文章: https://juejin.im/post/6892766734995226631

  1. clamp(minimum, preferred, maximum);
  1. img {
  2. width: clamp(15vw, 800%, 100%);
  3. }
  4. h1 {
  5. font-size: clamp(20px, 5vw, 35px);
  6. }
  7. p {
  8. font-size: clamp(10px, 4vw, 20px);
  9. }