最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【基本解决】ReactJS的Preact中如何设置rem的值和如何使其生效

Preact crifan 3197浏览 0评论

当前一个Preact中的项目中,已经有别人设计好的,计算rem的方式:

/src/lib/rem.js

let width = 750; // 设置默认最大宽度
let fontSize = 0;
const ClientUA = navigator.userAgent;
// 兼容红米3
if (ClientUA.indexOf(‘Redmi 3’) >= 0) {
  fontSize = 85;// 默认字体大小
} else {
  fontSize = 100;// 默认字体大小
}
function widthProportion () {
  const p = document.documentElement.offsetWidth / width;
  return p > 1 ? 1 : p < 0.3 ? 0.3 : p;
}
function onResize () {
  document.documentElement.style.fontSize = widthProportion() * fontSize + “px”;
}
window.addEventListener(‘resize’, onResize, false);
onResize();

没太看懂,但是事实上好像是:1rem=200px?

后来在折腾:

【记录】去试用Ant Design的UI

期间,看到:

Antd Mobile viewport setting wiki · ant-design/ant-design-mobile Wiki

中的:

代码是:

‘use strict’;
/**
* @param {Number} [baseFontSize = 100] – 基础fontSize, 默认100px;
* @param {Number} [fontscale = 1] – 有的业务希望能放大一定比例的字体;
*/
const win = window;
export default win.flex = (baseFontSize, fontscale) => {
  const _baseFontSize = baseFontSize || 100;
  const _fontscale = fontscale || 1;
  const doc = win.document;
  const ua = navigator.userAgent;
  const matches = ua.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i);
  const UCversion = ua.match(/U3\/((\d+|\.){5,})/i);
  const isUCHd = UCversion && parseInt(UCversion[1].split(‘.’).join(”), 10) >= 80;
  const isIos = navigator.appVersion.match(/(iphone|ipad|ipod)/gi);
  let dpr = win.devicePixelRatio || 1;
  if (!isIos && !(matches && matches[1] > 534) && !isUCHd) {
    // 如果非iOS, 非Android4.3以上, 非UC内核, 就不执行高清, dpr设为1;
    dpr = 1;
  }
  const scale = 1 / dpr;
  let metaEl = doc.querySelector(‘meta[name=”viewport”]’);
  if (!metaEl) {
    metaEl = doc.createElement(‘meta’);
    metaEl.setAttribute(‘name’, ‘viewport’);
    doc.head.appendChild(metaEl);
  }
  metaEl.setAttribute(‘content’, `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);
  doc.documentElement.style.fontSize = `${_baseFontSize / 2 * dpr * _fontscale}px`;
};
// 开始设置,可以根据业务需求修改参数
flex(100, 1);

默认是:

1rem=100px

导致已有项目代码和Antd的UI的大小没法统一。

所以想要去研究一下,如何在项目最初,统一设置rem的值。

widthProportion ClientUA rem

Font Size Idea: px at the Root, rem for Components, em for Text Elements | CSS-Tricks

Building Resizeable Components with Relative CSS Units | CSS-Tricks

Understanding Font sizing in CSS: em – px – pt – percent – rem | NARGA

Using CSS3 units to support low and high density screens | Tizen Developers

widthProportion rem

移动端Web适配单位rem的坑你知道多少 – 简书

(function(_D){
        var _self = {};
        _self.resizeEvt = ‘orientationchange’ in window ? ‘orientationchange’ : ‘resize’;
        _self.Html = _D.getElementsByTagName(“html”)[0];
        _self.widthProportion = function(){
            var p = Number((_D.body&&_D.body.clientWidth||_self.Html.offsetWidth)/720).toFixed(3);
            return p>1.067?1.067:p<0.444?0.444:p;
        };
        _self.changePage = function(){
            _self.Html.setAttribute(“style”,”font-size:”+_self.widthProportion()*100+”px”);
            _self.correctPx();
        };
        _self.correctPx = function(){
            var docEl = document.documentElement;
            var clientWidth = docEl.clientWidth;
            if (!clientWidth || clientWidth > 768) return;
            var div = document.createElement(‘div’);
            div.style.width = ‘1.4rem’;
            div.style.height = ‘0’;
            document.body.appendChild(div);
            var ideal = 140 * clientWidth / 720;
            var rmd = (div.clientWidth / ideal);
            console.log(rmd);
            if(rmd > 1.2 || rmd < 0.8){
                docEl.style.fontSize = 100 * (clientWidth / 720) / rmd + ‘px’;
                document.body.removeChild(div);
            }
        };
        _self.changePage();
        if (!document.addEventListener) return;
        window.addEventListener(_self.resizeEvt,_self.changePage,false);
        document.addEventListener(‘DOMContentLoaded’, _self.changePage, false);
})(document);

然后也是去计算rem的。

但是不太懂。

现在去试试:

把上述的:

src/antm-viewport.min.js

!function(e){function t(a){if(i[a])return i[a].exports;var n=i[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var i={};return t.m=e,t.c=i,t.p=””,t(0)}([function(e,t){“use strict”;Object.defineProperty(t,”__esModule”,{value:!0});var i=window;t[“default”]=i.flex=function(e,t){var a=e||100,n=t||1,r=i.document,o=navigator.userAgent,d=o.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i),l=o.match(/U3\/((\d+|\.){5,})/i),c=l&&parseInt(l[1].split(“.”).join(“”),10)>=80,p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),s=i.devicePixelRatio||1;p||d&&d[1]>534||c||(s=1);var u=1/s,m=r.querySelector(‘meta[name=”viewport”]’);m||(m=r.createElement(“meta”),m.setAttribute(“name”,”viewport”),r.head.appendChild(m)),m.setAttribute(“content”,”width=device-width,user-scalable=no,initial-scale=”+u+”,maximum-scale=”+u+”,minimum-scale=”+u),r.documentElement.style.fontSize=a/2*s*n+”px”},e.exports=t[“default”]}]);
flex(100, 1);

放到项目中:

/src/index.ejs

    <script src=”/antm-viewport.min.js”></script>

结果是:

很明显,太大了。

然后再去调试看看,最终用16:

flex(16, 1);

恢复到正常效果:

设置为32的效果,是变成2倍:

但是想要去实现:

1rem=100px时,设置了:

flex(100, 1);

然后把其他地方的px都改为对应的rem值:

56px=0.56rem

结果,竟然字体还是很大:

调试半天最终发现时font-size的值是:2rem导致的

改为:

0.16rem就可以了:

所以现在问题就是:

那个显示了:user agent stylesheet的css,到底是哪里生成的?

因为项目中,找不到2rem的设置,或者是font-size方面的设置啊。

最主要是灰色的且无法修改。

【未解决】Chrome调试期间css出现user agent stylesheet无法修改且找不到出处

先不管了,去设置对应的font-size好像就可以了:

然后字体好像太细了:

然后去换成微软雅黑字体后:

    // font-family: ‘Helvetica Neue’, arial, sans-serif;
    font-family: “微软雅黑”, “Microsoft YaHei”, Arial, SimHei;

好看多了:

但是其实还有个小问题:

上面的 下午 两个字,字体很诡异

难道说:微软雅黑等字体中,竟然没有 下午 这两个字???

算了,懒得操心了。有空再说。

【后记】

后来无意间遇到:

    font-weight: 100;

改为:

    font-weight: 400;

好像字体就看起来一样了:

不过好像也不对。

然后继续:

【记录】尝试把一个preact-boilerplate的空项目引入antd-mobile的UI

结果尝试去整合antd-mobile时,字体又变大了:

【已解决】ReactJS中preact-boilerplate的h1使用了normalize.css导致字体变的很大

转载请注明:在路上 » 【基本解决】ReactJS的Preact中如何设置rem的值和如何使其生效

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.181 seconds, using 22.06MB memory