字體大小自適應純css解決方案【轉】

viewpoint

css3提供了一些與當前viewpoint相關的元素,vw,vh,vim等。javascript

「viewpoint」 = window sizecss

vw = 1% of viewport width
1vh = 1% of viewport height
1vmin = 1vw or 1vh, 最小
1vmax = 1vw or 1vh, 最大html

兼容性:chrome 20+/ safari 6+/ IE 10+ / FF 19+ / IOS 6+java

<!DOCTYPE HTML>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>Demo</title>
    <style type="text/css">
        #box { font-size: 4vw;}
    </style>
</head>

<body>
    <div id="box">
        我是靖鳴君 我是靖鳴君 我是靖鳴君
    </div>
</body>
</html>

可是該方案存在一個bug,上面的代碼,當瀏覽器窗口變化的時候,box中的文字並無按照應有的比例變化,可是css3標準中是這麼說的:node

When the height or width of the viewport is changed, they are scaled accordingly.jquery

插曲

像這樣的問題,我以前也遇到過,好比如下代碼:(小插曲,可跳過)css3

<!DOCTYPE HTML>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>CSS3 Demo</title>
    <style type="text/css">
        body, div { margin:0; padding: 0;}
        .wrap { background: blue; width: 100%;}
        .box { width: 900px; height: 200px;}
    </style>
</head>

<body>
    <div class="wrap"><div class="box"></div></div>
</body>
</html>

box的寬度設置爲900px,wrap設置爲100%;縮小瀏覽器窗口,當寬度小於900時會出現滾動條,向右滾動,會發現藍色部分並非100%,這個問題你們能夠去思考下。web

bug處理

回到上面的問題,font-size:4vw,應該會使得字體的大小變化,但是他沒有,和標準說的不同,因此能夠認爲是一個bug。chrome

window.onresize = function(){
    var box = document.getElementById("box");
    box.style["z-index"] = 1;
}

 z-index能夠對應的元素被重繪(repaint)。express

 延伸一點點關於重繪(repaint)和迴流(reflow)的知識:

  1. 添加、刪除元素(迴流+重繪)
  2. 隱藏元素,display:none(迴流+重繪),visibility:hidden(只重繪,不迴流)
  3. 移動元素,好比改變top,left(jquery的animate方法就是,改變top,left不必定會影響迴流),或者移動元素到另外1個父元素中。(重繪+迴流)
  4. 對style的操做(對不一樣的屬性操做,影響不同)
  5. 還有一種是用戶的操做,好比改變瀏覽器大小,改變瀏覽器的字體大小等(迴流+重繪)
    讓咱們看看下面的代碼是如何影響迴流和重繪的:
    var s = document.body.style;
    s.padding = "2px"; // 迴流+重繪
    s.border = "1px solid red"; // 再一次 迴流+重繪
    s.color = "blue"; // 再一次重繪
    s.backgroundColor = "#ccc"; // 再一次 重繪
    s.fontSize = "14px"; // 再一次 迴流+重繪
    // 添加node,再一次 迴流+重繪

關於重繪和迴流

 其餘方案

1. css expression, 這個效率比較低,不推薦使用

#box { star:expression(onresize = function(){
                var res = parseInt(this.style.width) / 20;
                res = res < 9 : "9px" ? res + "px";
                this.style.fontSize = res;
            });
        }
//P.S:上面代碼沒測試,不知道寫錯沒有

與其說用的css,還不如說是JS,並且是效率不夠的JS。

2. media query,這東西也不是特別好用

h2{
  font-size:25px
}

@media screen and (max-width: 850px){/* 可視區域小於 850px, 設置更小font-size屬性 */
   h2{
     font-size:19px;
   }
}

用media query會使得字體的變化出現不連貫性,並且要可能設置多個@media,至關麻煩。

3. media query + -webkit-transition 實現平滑轉變

div{
    font-size: 40px;
    -webkit-transition:font-size 0.2s ease-out;
}

@media only screen and (max-width: 1200px) { div{ font-size: 39px; }}
@media only screen and (max-width: 1100px) { div{ font-size: 38px; }}
@media only screen and (max-width: 1000px) { div{ font-size: 37px; }}
@media only screen and (max-width: 900px) { div{ font-size: 36px; }}
@media only screen and (max-width: 800px) { div{ font-size: 35px; }}
@media only screen and (max-width: 700px) { div{ font-size: 34px; }}
@media only screen and (max-width: 600px) { div{ font-size: 33px; }}
@media only screen and (max-width: 500px) { div{ font-size: 32px; }}
@media only screen and (max-width: 400px) { div{ font-size: 31px; }}
@media only screen and (max-width: 300px) { div{ font-size: 30px; }}

小結

這玩意兒其實也沒太大做用,用JS處理至關簡單,不知道你們還有沒有其餘比較好的方案,能夠提出來交流下~

參考文檔

Viewport Sized Typography

文章來自:http://www.javashuo.com/article/p-qfjelnpj-g.html

相關文章
相關標籤/搜索