美文网首页
移动端页面适配方案 - hotcss(包括解决sass引入公共文

移动端页面适配方案 - hotcss(包括解决sass引入公共文

作者: JX灬君 | 来源:发表于2021-06-28 17:14 被阅读0次

1.hotcss插件引用

//引入hotcss.js
//mian.js -》import "./lib/hotcss/hotcss.js";

根据设计图设置宽度
px2rem.scss-》
// 设置设计图的宽度
$designWidth : 750;

// 使用(局部)
<style lang="scss" scoped>
@import "../lib/hotcss/px2rem.scss";
h1 {
  width: px2rem(375);
  background-color: #c09;
  height: px2rem(40);
}
</style>

// 使用(全局配置sass引入公共文件)
// 新建vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      sass: {
        // 这里的选项会传递给 css-loader
        prependData: `@import "./src/lib/hotcss/px2rem.scss";`,
        // data: `@import "~@/src/lib/hotcss/px2rem.scss";`,
      },
    },
  },
};

hotcss.js

/* eslint-disable no-useless-escape */
(function (window, document) {
  "use strict";

  //给hotcss开辟个命名空间,别问我为什么,我要给你准备你会用到的方法,免得用到的时候还要自己写。
  var hotcss = {};

  (function () {
    //根据devicePixelRatio自定计算scale
    //可以有效解决移动端1px这个世纪难题。
    var viewportEl = document.querySelector('meta[name="viewport"]'),
      hotcssEl = document.querySelector('meta[name="hotcss"]'),
      dpr = window.devicePixelRatio || 1,
      maxWidth = 540,
      designWidth = 0;

    dpr = dpr >= 3 ? 3 : dpr >= 2 ? 2 : 1;

    //允许通过自定义name为hotcss的meta头,通过initial-dpr来强制定义页面缩放
    if (hotcssEl) {
      var hotcssCon = hotcssEl.getAttribute("content");
      if (hotcssCon) {
        var initialDprMatch = hotcssCon.match(/initial\-dpr=([\d\.]+)/);
        if (initialDprMatch) {
          dpr = parseFloat(initialDprMatch[1]);
        }
        var maxWidthMatch = hotcssCon.match(/max\-width=([\d\.]+)/);
        if (maxWidthMatch) {
          maxWidth = parseFloat(maxWidthMatch[1]);
        }
        var designWidthMatch = hotcssCon.match(/design\-width=([\d\.]+)/);
        if (designWidthMatch) {
          designWidth = parseFloat(designWidthMatch[1]);
        }
      }
    }

    document.documentElement.setAttribute("data-dpr", dpr);
    hotcss.dpr = dpr;

    document.documentElement.setAttribute("max-width", maxWidth);
    hotcss.maxWidth = maxWidth;

    if (designWidth) {
      document.documentElement.setAttribute("design-width", designWidth);
    }
    hotcss.designWidth = designWidth; // 保证px2rem 和 rem2px 不传第二个参数时, 获取hotcss.designWidth是undefined导致的NaN

    var scale = 1 / dpr,
      content =
        "width=device-width, initial-scale=" +
        scale +
        ", minimum-scale=" +
        scale +
        ", maximum-scale=" +
        scale +
        ", user-scalable=no";

    if (viewportEl) {
      viewportEl.setAttribute("content", content);
    } else {
      viewportEl = document.createElement("meta");
      viewportEl.setAttribute("name", "viewport");
      viewportEl.setAttribute("content", content);
      document.head.appendChild(viewportEl);
    }
  })();

  hotcss.px2rem = function (px, designWidth) {
    //预判你将会在JS中用到尺寸,特提供一个方法助你在JS中将px转为rem。就是这么贴心。
    if (!designWidth) {
      //如果你在JS中大量用到此方法,建议直接定义 hotcss.designWidth 来定义设计图尺寸;
      //否则可以在第二个参数告诉我你的设计图是多大。
      designWidth = parseInt(hotcss.designWidth, 10);
    }

    return (parseInt(px, 10) * 320) / designWidth / 20;
  };

  hotcss.rem2px = function (rem, designWidth) {
    //新增一个rem2px的方法。用法和px2rem一致。
    if (!designWidth) {
      designWidth = parseInt(hotcss.designWidth, 10);
    }
    //rem可能为小数,这里不再做处理了
    return (rem * 20 * designWidth) / 320;
  };

  hotcss.mresize = function () {
    //对,这个就是核心方法了,给HTML设置font-size。
    var innerWidth =
      document.documentElement.getBoundingClientRect().width ||
      window.innerWidth;

    if (hotcss.maxWidth && innerWidth / hotcss.dpr > hotcss.maxWidth) {
      innerWidth = hotcss.maxWidth * hotcss.dpr;
    }

    if (!innerWidth) {
      return false;
    }

    document.documentElement.style.fontSize = (innerWidth * 20) / 320 + "px";

    hotcss.callback && hotcss.callback();
  };

  hotcss.mresize();
  //直接调用一次

  window.addEventListener(
    "resize",
    function () {
      clearTimeout(hotcss.tid);
      hotcss.tid = setTimeout(hotcss.mresize, 33);
    },
    false
  );
  //绑定resize的时候调用

  window.addEventListener("load", hotcss.mresize, false);
  //防止不明原因的bug。load之后再调用一次。

  setTimeout(function () {
    hotcss.mresize();
    //防止某些机型怪异现象,异步再调用一次
  }, 333);

  window.hotcss = hotcss;
  //命名空间暴露给你,控制权交给你,想怎么调怎么调。
})(window, document);

px2rem.scss

@function px2rem($px){
    @return $px*320/$designWidth/20 + rem;
}
// 设置设计图的宽度
$designWidth : 750;

2.common.css引用

@charset "UTF-8";
body,
html {
  background: #f0f0f0;
  color: #505050;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  -webkit-touch-callout: none;
  -webkit-overflow-scrolling: touch;
}
body,
button,
input,
select,
textarea {
  font: 14px/1.5 'PingFang SC','\5b8b\4f53', 'Helvetica Neue', Arial, 'Liberation Sans',
    FreeSans, 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
  line-height: 20px;
}
article,
aside,
blockquote,
body,
button,
code,
dd,
details,
div,
dl,
dt,
fieldset,
figcaption,
figure,
footer,
form,
h1,
h2,
h3,
h4,
h5,
h6,
header,
hgroup,
hr,
html,
input,
legend,
li,
menu,
nav,
ol,
p,
pre,
section,
td,
textarea,
th,
ul {
  padding: 0;
  margin: 0;
}
ol,
ul {
  list-style: none;
}
body,
div,
fieldset,
form,
h1,
h2,
h3,
h4,
h5,
h6,
html,
p {
  -webkit-text-size-adjust: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}
fieldset,
image {
  border: none;
}
:focus,
a:focus {
  outline: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
  font-weight: 400;
}
input[type='button'] {
  -webkit-appearance: none;
  outline: 0;
}
input::-webkit-input-placeholder {
  color: #969;
}
textarea::-webkit-input-placeholder {
  color: #969;
}
input:focus::-webkit-input-placeholder {
  color: #969;
}
input::-webkit-input-speech-button {
  display: none;
}
a,
button,
input,
optgroup,
select,
textarea {
  -webkit-tap-highlight-color: transparent;
  color: inherit;
}
a {
  text-decoration: none;
}
.overflow-txt {
  white-space: nowrap;
  text-overflow: ellipsis;
}
.fl {
  float: left;
}
.fr {
  float: right;
}
.clearfix:after,
.clearfix:before {
  display: table;
  content: ' ';
  height: 0;
  font-size: 0;
  line-height: 0;
}
.clearfix:after {
  clear: both;
}
.block {
  padding: 0;
  margin: 0;
  display: block;
}

相关文章

网友评论

      本文标题:移动端页面适配方案 - hotcss(包括解决sass引入公共文

      本文链接:https://www.haomeiwen.com/subject/ggpqultx.html