1. 程式人生 > >頁面適配之pt、px、em、rem用法和特點

頁面適配之pt、px、em、rem用法和特點

因為自己也經常做移動端的開發工作,現總結一份頁面適配的筆記。

1. pt

點(Points),絕對長度單位。
印刷業上常使用的單位,磅的意思,一般用於頁面列印排版。
不知道經常做設計的同學知不知道zeplin這個網站,它用的畫素單位都是pt。
1in = 2.54cm = 25.4 mm = 101.6q = 72pt = 6pc = 96px
用法:

div { font-size:10pt; }

這裡寫圖片描述

2. px

相對長度單位。畫素(Pixels)。畫素px是相對於顯示器螢幕解析度而言的。

div { font-size:10px; }

相容性和pt一樣

px不會因為其它元素的尺寸變化而變化。

畫素的大小是會“變”的,也稱為“相對長度”,越高位的畫素,其擁有的色板也就越豐富,越能表達顏色的真實感。

px特點:比較穩定和精確,但在瀏覽器放大縮小會出現頁面混亂。

一般情況下,我們平時都是用px來定義字型,所以無法用瀏覽器字型放大的功能,IE無法調整那些使用px作為單位的字型大小。大部分網站能調整是因為用了相對長度單位em或rem。如果改變了瀏覽器的縮放,web頁面樣式就會亂掉,這樣對於使用者來說,就是個大問題了。這時,就提出了相對長度單位。
Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或核心)。

假設就使用瀏覽器預設的字號16px,來看一些px單位與rem之間的轉換關係:
這裡寫圖片描述

如果你要設定一個不同的值,那麼需要在根元素中定義,為了方便計算,時常將在元素中設定font-size值為62.5%:

html {
    font-size: 62.5%;
}

相當於在中設定font-size為10px,此時,上面示例中所示的值將會改變:
這裡寫圖片描述

3.em

相對長度單位。相對於當前物件內文字的字型尺寸。
如當前對行內文字的字型尺寸未被人為設定,則相對於瀏覽器的預設字型尺寸。
相對長度單位。畫素(Pixels)。

div { font-size:10em; }

相容性和pt一樣。

em特點:
(1)em的值並不是固定的
(2)em會繼承父級元素的字型大小

em表示相對於父元素的字型大小,em是相對單位,沒有一個固定的度量值,而是由其它元素尺寸來決定的相對值。如當前對行內文字的字型尺寸未被人為設定,則相對於瀏覽器的預設字型尺寸。

任意瀏覽器的預設字型都是16px,所有未經調整的瀏覽器都符合:1em =16px。那麼12px = 0.75em;10px = 0.625em;為了簡化font-size的換算,需要在css中的body選擇器中宣告font-size=62.5%,這就使em值變為:16px*62.5% =10px;這樣12px=1.2em;10px=1em,也就是說只需要將你原來數值px除以10就可以了。

使用em的注意點:
1. body選擇器中宣告Font-size=62.5%;
2. 將你的原來的px數值除以10,然後換上em作為單位;
3. 重新計算那些被放大的字型的em數值。避免字型大小的重複宣告。

4. rem

相對長度單位。相對於根元素(即html元素)font-size計算值的倍數。是CSS3新增的一個相對單位(root em,根em)

div { font-size:10rem; }

這裡寫圖片描述

rem可以做到只修改根元素就成比例地調整所有字型大小,又可以避免字型大小逐層複合的連鎖反應。

5. px、pt、em、rem轉化表:

pt=1/72(英寸) px=1/dpi(英寸) pt=px*dpi/72
以windows下的96dpi來計算,1pt=px*96/72=px*4/3

字號 Pixels Ems Percent Points
八號 6px 0.375em 37.5% 5pt
七號 7px 0.4375em 43.75% 5.5pt
小六 8px 0.5em 50% 6.5pt
9px 0.55em 55% 7pt
六號 10px 0.625em 62.5% 7.5pt
11px 0.7em 70% 8pt
小五 12px 0.75em 75% 9pt
13px 0.8em 80% 10pt
五號 14px 0.875em 87.5% 10.5pt
15px 0.95em 95% 11pt
小四 16px 1em 10% 12pt
17px 1.05em 105% 13pt
18px 1.125em 112.5% 13.5pt
四號 19px 1.2em 120% 14pt
20px 1.25em 125% 14.5pt
小三 21px 1.3em 130% 15pt
三號 22px 1.4em 140% 16pt
23px 1.45em 145% 17pt
小二 24px 1.5em 150% 18pt

6. 下面介紹下使用方法:

現在的使用方法很多,我直接介紹我偏向的這一種了

  1. rem在Sass中的使用方法
@function rem($values){
    $root :16px;
    $unit: rem;
    $list: ();
    @each $v in $values {
        $res:0;
        @if ($v == 0 or $v == auto or unit($v) == rem or unit($v) == em or unit($v) == vw or unit($v) == vh){
            $res: $v;
        }@else{
            $res: ($v + 0px) / $root + $unit;
       }
       $list : append($list , $res);
   }
   @return $list;
}

less也可以同理這麼寫一個

//SASS
div{
    margin:rem(10px 10rem 0 auto);
}
//編譯後CSS
div{
    margin:0.625rem 10rem 0 auto;
}

2.rem在less中的使用方法,這是一種簡單的實現方式

html{
    font-size:62.5%;
}
@baseFontSize:10;
.pxTorem(@name, @px){
  @{name}: @px / @baseFontSize * 1rem;
}
.pxTorem(@name, @px1 , @px2){
  @{name}: @px1 / @baseFontSize * 1rem @px2 / @baseFontSize * 1rem;
}
.pxTorem(@name, @px1 , @px2 , @px3 ){
  @{name}: @px1 / @baseFontSize * 1rem @px2 / @baseFontSize * 1rem @px3 / @baseFontSize * 1rem;
}
.pxTorem(@name, @px1 , @px2 , @px3 , @px4){
  @{name}: @px1 / @baseFontSize * 1rem @px2 / @baseFontSize * 1rem @px3 / @baseFontSize * 1rem @px4 / @baseFontSize * 1rem;
}
//LESS
div{
    .pxTorem(width,100);
    .pxTorem(height,100);
    .pxTorem(padding,10,20);
    .pxTorem(margin,10,20,30,40);
}
//編譯後 CSS
div{
    width:10rem;
    height:10rem;
    padding:1rem 2rem;
    margin:1rem 2rem 3rem 4rem;
}

7.其它方法

2.gulp等各類打包工具
這個方法比較激進,打包時直接匹配px,強行轉為rem。

var replace = require('gulp-replace');
gulp.task('pxToRem', function(){
  return gulp.src('*.html')
    .pipe(replace(/(\d+)px/g, function(match, p1){
        return Number(p1) / 10 + 'rem';
    }))
    .pipe(gulp.dest('dir'));
});
  1. Idea 也有SCSS SASS LESS對應的自動轉換外掛