2008/11/12

counter-increment, counter-reset

counter-reset | counter-increment

這兩個特徵用在計數器,作文章章節的自動編號。IE6 沒支援計數器;IE8, Firefox3.0, Safari, Chrome 都有支援。

counter-reset

宣告重設 計數器的條件;如果一個條件式同時增加與重設計數器時,會先重設計數器再增加其值。可設定的值有:

  1. identifier integer:指定計數器名稱與整數重設值。可以不設重設值,用預設的值 0。可以一次宣告多個計數器名稱與其重設值。
  2. none:無計數器。
  3. inherit:繼承父元素的特徵值。

讀取計數器值的語法是:

counter(計數器名稱, list-style-type)

list-style-type 指定編號的型態;可不設 list-style-type,使用預設的數字編號。可用在 content 之後,輸出計數器的值。

  • 風格用法:

    <style type='text/css'>
    .rst  {counter-reset: ctr1 3  ctr2 7  ctr3 101;
           counter-increment: ctr3 7;
          }
    .rst SPAN:before
              {content: counter(ctr1, upper-roman)' / '
                        counter(ctr2, lower-greek)' / '
                        counter(ctr3)' / ';
               color:red
              }
    </style>
    <div class='rst'>
    <span>輸出計數器的值</span>
    </div>

  • 執行結果:

    輸出計數器的值
counter-increment

宣告增加計數器的條件,可設定的值有:

  1. identifier integer:指定計數器名稱與整數增加值。可以不設增加值,用預設的值 1。可以一次宣告多個計數器名稱與其增加值。可用 0 與負值。
  2. none:無計數器。
  3. inherit:繼承父元素的特徵值。

如果一個條件式同時改變計數器值,又要取其值,則會先改變其值。同一個元素要重設多個計數器時,要寫在一個條件式中;如果寫在多個條件式,則後面的條件式會取代前面的條件式,造成前面的條件式沒有執行。

測試一個計數器。一個元素被設為 display:none,則該元素對計數器沒有影響。

  • 風格用法:

    <style type='text/css'>
    .cls H3  {counter-reset: myctr 3;}
    .cls P:before {content: "《"counter(myctr, upper-roman)"》";
                   counter-increment: myctr 2;
                   color:red;
                  }
    </style>
    <div class='cls'>
    <h3>子曰:</h3>
    <p>學而時習之,不亦說乎?</p>

    <h3 style='display:none'>子曰:</h3>
    <p>有朋自遠方來,不亦樂乎?</p>

    <h3>子曰:</h3>
    <p>人不知而不慍,不亦君子乎?</p>
    </div>

  • 執行結果:

    子曰:

    學而時習之,不亦說乎?

    子曰:

    有朋自遠方來,不亦樂乎?

    子曰:

    人不知而不慍,不亦君子乎?

測試三個計數器。下面設了三個計數器,所以看起來挺複雜的,細心看懂就全懂了。

  • 風格用法:

    <style type='text/css'>
    .three    {counter-reset: cnt1   cnt2 5   cnt3 9;}
    .three SPAN {counter-increment: cnt1   cnt3 3}
    .three I    {counter-increment: cnt2 2}
    .three EM:before
         {content:counter(cnt1)' / '
                  counter(cnt2)' / '
                  counter(cnt3)' / ';
          color:red;
         }
    </style>
    <div class='three'>
    <em>計數器的初始值</em>
    <p><span>s1</span>
    <i>i1</i>
    <span>s2</span>
    <i>i2</i>
    <p><em>計數器的最後值</em>
    </div>

  • 執行結果:

    計數器的初始值

    s1 i1 s2 i2

    計數器的最後值

元素有 多層巢狀結構時,其宣告的計數器,會在每一層產生一個計數器。讀取計數器值的語法是:

counters(計數器名稱, 分隔字, list-style-type)

可不設 list-style-type,使用預設的數字編號。counters() 會將所有的計數器值列出,用分隔字分開。

  • 風格用法:

    <style type='text/css'>
    .cls2 DL { counter-reset: term }
    .cls2 DT { color:red }
    .cls2 DT:before {content: counters(term, ".", lower-greek)":"; 
                     counter-increment: term
                    }
    </style>
    <div class='cls2'>
    <DL>
    <DT>老子<dd>道家始祖。
      <DL> 
      <DT>道德經<dd>道家的智慧書。 
      </DL>
    <DT>孔子<dd>儒家始祖。
      <DL> 
      <DT>儒家<dd>宣揚道德教育與仁愛政治的知識份子。
      <DT>論語<dd>儒家的思想書籍。 
      </DL>
    </DL>
    </div>

  • 執行結果:

    老子
    道家始祖。
    道德經
    道家的智慧書。
    孔子
    儒家始祖。
    儒家
    宣揚道德教育與仁愛政治的知識份子。
    論語
    儒家的思想書籍。
  • 實際使用後發現:IE8 必須有宣告 !DOCTYPE 才能用計數器;Firefox, Safari, Chrome 沒有這個限制。!DOCTYPE 如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

  • 我在 TABLE 元素使用計數器時,還遇到一個問題。我用了下面的選擇器:

    TABLE.glist { counter-reset: rowscnt } 
    TABLE.glist TR { counter-increment:rowscnt } 
    TABLE.glist TR TD:first-child:before { content: counter(rowscnt)". " }

    結果在 IE8 會出錯,一直出現 1;Firefox, Safari, Chrome 可以正常執行。後來改成:

    /* TABLE.glist { counter-reset: rowscnt }  */
    TABLE.glist TR { counter-increment:rowscnt } 
    TABLE.glist TR TD:first-child:before { content: counter(rowscnt)". " }

    就都可以執行了。不知道原因出在哪?

:HOVER, :ACTIVE 的應用。使用時要注意,在 IE6 中 :HOVER, :ACTIVE 只能用在 ANCHOR 元素。

  • 風格用法:

    <style type='text/css'>
    .hvr  {counter-reset: ctr 1;}
    .hvr:hover {counter-increment: ctr 2;}
    .hvr:active {counter-increment: ctr 4;}
    .hvr SPAN:before
              {content: counter(ctr, cjk-ideographic)' ';
               background:red
              }
    .hvr SPAN:active:before
              {content: counter(ctr, decimal)' ';
               background:blue
              }
    </style>
    <div class='hvr'>
    <span>輸出計數器的值</span>
    </div>

  • 執行結果:

    輸出計數器的值
  • 上例,Firefox 完全成功;Safari, Chrome 沒有增加值。