webrebuild.org第四届年会——金秋四城联动

邀您参加“裸奔”

在你对CSS华丽的效果着迷时,别忘了在华丽外表下面,最原始的文字。

邀您参与每年4月9号的“CSS裸奔节”,详情请登陆webrebuild.org

继承──页面重构中的模块化设计(三)

Ghost 发表于 [2010-04-16 13:24]

前面我们了解了 样式的作用域的分类栏目级作用域 。在权值中,还有一个很重要的因素,需要做下补充,起因是这样的,有个同学在CSS森林群里问了个问题:根据样式权值两个关键的因素

  • 权值的大小跟选择器的类型和数量有关
  • 样式的优先级跟样式的定义顺序有关

可以知道,如果10个标签选择器的权值应该比一个类选择的权值高,像这样:


div div div div div div div div div div div{color:blue;}
.c10{color:red;}

<div class="c1">
  <div class="c2">
    <div class="c3">
      <div class="c4">
        <div class="c5">
          <div class="c6">
            <div class="c7">
              <div class="c8">
                <div class="c9">
                  <div class="c10">
                     <div>这段文字是什么颜色?</div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

先别急着看 答案 ,分析下。意料之中?如果 这样 呢?


div{color:blue;}
.c10{color:red;}

是不是跟想的不太一样?难道前面所说的权值是有问题的?前面讲的权值并没有问题,不过漏了一个重要的规则: 继承的权值小于0,0,0,1

样式的继承
指被包在内部的标签将拥有外部标签的样式性质。

继承最大的意义在于可以减少重复的定义,比如要定义整个页面的文本颜色,只需要定义body的color样式,body里的所有标签都会继承body的color定义。是不是很方便?方便是相对的,当你想要为body内部分标签定义另一种文本颜色时,继承也许会成为增加重复定义、降低性能的祸首。

并不是所有的样式定义都具有继承的性质,整理了一下常用有继承性的定义1,这些定义在使用的时候要比较注意。

简单分析下上面的例子,最后一部分的代码:


<div class="c10">
    <div>这段文字是什么颜色?</div>
</div>

当定义了c10后,根据权值,类定义的权值是0,0,1,0,应该是比div这个定义0,0,0,1要高的,但由于div是直接定义到标签上的,比起从c10的定义中继承来的定义权值更高。稍微改下就清楚了:


<div class="c1">
  <div class="c2">
    <div class="c3">
      <div class="c4">
        <div class="c5">
          <div class="c6">
            <div class="c7">
              <div class="c8">
                <div class="c9">
                  <div class="c10">
                     <p>这段文字是什么颜色?</p>
                     <div>这段文字是什么颜色?</div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

修改后的例子 可以看到,p标签继承了c10的定义,显示为红色。因此,在使用标签选择器的时候,应特别注意它的作用域,个人的建议是,除了最基本的reset之外,在公共作用域中最好不要使用标签选择器,在栏目级作用域中也应尽可能的少用。

1 常用有继承性的样式定义:

  • text-indent
  • text-align
  • layout-flow
  • writing-mode
  • line-break
  • white-space
  • word-wrap
  • list-style
  • list-style-image
  • list-style-position
  • list-style-type
  • font
  • font-style
  • font-variant
  • font-weight
  • font-size
  • line-height
  • font-family
  • color
  • text-transform
  • letter-spacing
  • word-spacing

文章地址:http://www.cssforest.org/blog/index.php?id=164

继承──页面重构中的模块化设计(三)》采用的授权是创作共用的 “署名-非商业性使用-相同方式共享 3.0 通用许可”.

文章被分类到:重构思想


评论也精彩

  1. weilaixu 在 146 日 之前 说:

    呃…现在手上的项目,自己设计,规划的功夫下了很大,现在写起来,基本上只是复制粘贴和写点继承相关的。但是由于降低质量实现快速开发,如果后期有板块变动的问题就必须得改html了,鬼,把评论框弄大点好哇····虽然webkit可以自己拖拉

  2. FA-小虎 在 146 日 之前 说:

    这个跟东西平时没去仔细研究,看了后受益匪浅啊。

  3. gyrate 在 146 日 之前 说:

    居然发现有几个关于文字的样式定义是从来没有用到过的,页面文字排版的细节难道就在这里

  4. 二十六公斤 在 146 日 之前 说:

    教材CSS教材真多···每次来都受益匪浅··

  5. vincent 在 129 日 之前 说:

    写了很多年的样式,也遇到到过这些问题,这些细微的问题却从来没有去考究过。特别是定义在颜色方面,时常遇到定义失效问题,几天终于明晰了~呵呵

  6. www.proxy-edu.com 在 127 日 之前 说:

    这样也能优化,
    学习了!

  7. Jesse 在 108 日 之前 说:

    补充一个 opacity
    也具有继承性

  8. operafans 在 104 日 之前 说:

    大部分内容是对的,但有一点是错误的,标签选择器的权值永远都比一个类选器择器的权值低,无论有多少个,如果把第一个例子改为:
    <div class=“c1”> <div class=“c2”> <div class=“c3”> <div class=“c4”> <div class=“c5”> <div class=“c6”> <div class=“c7”> <div class=“c8”> <div class=“c9”> <div class=“c10”> 这段文字是什么颜色? </div> </div> </div> </div> </div> </div> </div> </div> </div> </div>
    就可以看出问题了,第一个例子中.c10是一个继承的样式,当然权值比直接的标签选择器低。

  9. Ghost 在 104 日 之前 说:

    @operafans 也许你应该整理下思路了,前后两句的观点是矛盾的。前面说标签选择器的权值比类选择器低,后面又说.c10比标签选择器低。

    这一部分所要讲的就是继承的问题,例子当然是跟继承相关的了,以你所改的代码,已经是直接定义,没有可比性。

    你说的“标签选择器的权值永远都比一个类选器择器的权值低,无论有多少个”倒是给我提了个醒,面前所说的的确把这一点给漏掉了。

  10. operafans 在 102 日 之前 说:

    @Ghost,也许你也理解错了,可能我也没表达清楚,我的意思是说继承的样式的权重是最低的。

  11. sunjix5852 在 23 日 之前 说:

    看了之后,的确是好文章!

欢迎发表评论
  1. 请不要发表跟文章无关的评论,内容或站点如指向非个人博客地址的以发广告对待!
  2. 为抵制垃圾评论,留言需要先预览再点击提交。
  3. 评论支持textile语法,查看 textile帮助
  4. 还可以使用QQWeb输入法