zoukankan      html  css  js  c++  java
  • 三种响应式文字(废弃)

    据说响应式已经烂大街了,无非是 @media 调一调,合理使用 CSS 的层叠覆盖,

    而响应式文字并不是大多数都懂的,也许他们就只是知道 em 和 rem 而已,

    至少当初我就是个白痴,用了 rem 后还拉着浏览器边框又拖又是缩放,还纳闷字体大小怎么不响应呀。

    PS: 现在 vw/vh 这些根据浏览器宽度来响应的单位兼容性已经相当不错了,用它来布局相比也是另一番风味。

    今天还是主讲网易和淘宝各自的响应式文字解决方案:

    1. 网易派:屏幕大了,字也大了

    2. 淘宝派:始终保持文字为原大小

    3. 简约派:让 viewport 和 html 宽度一致

    先来看下如何使用(并非完全如此操作,毕竟我也没进过他们公司)

    网易派做法:

    html {
        font-size: 10px;
    }
    @media screen and (min- 376px) and (max- 414px) {
        html {font-size: 11px;}
    }
    @media screen and (min- 415px) and (max- 639px) {
        html {font-size: 13px;}
    }
    @media screen and (min- 640px) and (max- 719px) {
        html {font-size: 14px;}
    }
    @media screen and (min- 720px) and (max- 749px) {
        html {font-size: 15px;}
    }
    @media screen and (min- 750px) and (max- 799px) {
        html {font-size: 16px;}
    }
    @media screen and (min- 800px) and (max- 992px) {
        html {font-size: 20px;}
    }
    body {
        margin: 0;
        font-size: 1.6rem;
    }

    显然是非常简单的,举个极端的例子,当我们的网页在 ipad 上浏览时,由于屏幕变大文字也相应变大,可见 拙劣的项目案例

    主要使用 rem 来设置宽度和大小,讲究一种感觉,不会去精细到像素。

    也就是,当我们设为 1rem 时,iPone4 上是 10px,但 iPad 就是 16px 了,但随着字体变大而布局不变,看上去的相对间隙是没有变化的

    淘宝派的做法:

    计算 devicePixelRatio 和 viewport 的 scale 来使得字体无变化,可见淘宝触屏版

    具体插件来自于 lib-flexible.js,这里只粘贴压缩版代码吧 

    !function(a,b){function c(){var b=f.getBoundingClientRect().width;b/i>540&&(b=540*i);var c=b/10;f.style.fontSize=c+"px",k.rem=a.rem=c}var d,e=a.document,f=e.documentElement,g=e.querySelector('meta[name="viewport"]'),h=e.querySelector('meta[name="flexible"]'),i=0,j=0,k=b.flexible||(b.flexible={});if(g){console.warn("将根据已有的meta标签来设置缩放比例");var l=g.getAttribute("content").match(/initial-scale=([d.]+)/);l&&(j=parseFloat(l[1]),i=parseInt(1/j))}else if(h){var m=h.getAttribute("content");if(m){var n=m.match(/initial-dpr=([d.]+)/),o=m.match(/maximum-dpr=([d.]+)/);n&&(i=parseFloat(n[1]),j=parseFloat((1/i).toFixed(2))),o&&(i=parseFloat(o[1]),j=parseFloat((1/i).toFixed(2)))}}if(!i&&!j){var p=(a.navigator.appVersion.match(/android/gi),a.navigator.appVersion.match(/iphone/gi)),q=a.devicePixelRatio;i=p?q>=3&&(!i||i>=3)?3:q>=2&&(!i||i>=2)?2:1:1,j=1/i}if(f.setAttribute("data-dpr",i),!g)if(g=e.createElement("meta"),g.setAttribute("name","viewport"),g.setAttribute("content","initial-scale="+j+", maximum-scale="+j+", minimum-scale="+j+", user-scalable=no"),f.firstElementChild)f.firstElementChild.appendChild(g);else{var r=e.createElement("div");r.appendChild(g),e.write(r.innerHTML)}a.addEventListener("resize",function(){clearTimeout(d),d=setTimeout(c,300)},!1),a.addEventListener("pageshow",function(a){a.persisted&&(clearTimeout(d),d=setTimeout(c,300))},!1),"complete"===e.readyState?e.body.style.fontSize=12*i+"px":e.addEventListener("DOMContentLoaded",function(){e.body.style.fontSize=12*i+"px"},!1),c(),k.dpr=a.dpr=i,k.refreshRem=c,k.rem2px=function(a){var b=parseFloat(a)*this.rem;return"string"==typeof a&&a.match(/rem$/)&&(b+="px"),b},k.px2rem=function(a){var b=parseFloat(a)/this.rem;return"string"==typeof a&&a.match(/px$/)&&(b+="rem"),b}}(window,window.lib||(window.lib={}));

    主要使用 em 来设置宽度和大小,讲究一种抠像素,设计说是 12px 那它就是 12px。

    由于计算后 html 和 body 的文字大小以及 initial-scale 的改变,使得 1em(不叠加的时候) 就是 12px,那么我们只管去按设计稿给的数值来设定就好了。

    而淘宝本尊说,其实我一直用的是 rem,虽然是串小数,但我有插件呀...对此只能表示大佬的世界我没看懂。

    比较有趣的是,淘宝的这种做法是让字体大小始终保持 12px,但图片宽高根据 html 的字体变化来设定。

    比如 iPhone6 的屏变成了 37.5px,那图片的 1.625rem 相应变宽,但文字还是 12px。

    如果网易派的 body 不是设为 1.6rem 而是 12px 理论上也是这样的效果,只是淘宝多算了一个 dpr 而已。

    简约派的做法:

    不得不说,简约派绝对是最简约的做法,

    <meta name="viewport" content="width=750,user-scalable=no" />
    <style>
    html, body {
         750px;
        margin: 0 auto;
        overflow: hidden;
    }
    .body {
         375px;
    }
    </style>

     主要使用 px 来设置宽度和大小,讲究一种我不听我不听的态度,反正我屏幕就是 750px 宽,到哪都是这么宽。

    听上去好像反而是最佳的办法,其实我们选择用它只在 H5 上,因为都是图片不用考虑字体大小,而有了文字的网站最终也逃不开上面两种做法。

    (这样说起来好像不叫响应式文字了咧,打脸打脸...)

    另外 px 没有相对大小咯,相对大小爱不爱用这个就看个人喜好了。

    其实三种都是很棒的解决方案,就看你自己更喜欢哪种吧,rem, em, 还是 px .... 亦或者奇葩版的 vw

  • 相关阅读:
    SP1812 LCS2
    SP1811 LCS
    P3804 【模板】后缀自动机
    P3808 【模板】AC自动机(简单版)
    P3879 [TJOI2010]阅读理解
    P2602 [ZJOI2010]数字计数
    P4719 【模板】动态dp
    P1122 最大子树和
    P3554 [POI2013]LUK-Triumphal arch
    P3565 [POI2014]HOT-Hotels
  • 原文地址:https://www.cnblogs.com/foreverZ/p/6667501.html
Copyright © 2011-2022 走看看