美文网首页
移动端页面适配方案 - 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