zoukankan      html  css  js  c++  java
  • 挂多个class还是新建class —— 多用组合,少用继承

    用css实现下面的效果图。

     

    方案一

    <style type="text/css">
    .myList1 { border: 1px solid #333; padding: 10px; }
    .myList1 li { height: 20px; line-height: 20px; font-size: 12px; }
    .myList2 { border: 1px solid #333; padding: 10px; }
    .myList2 li { height: 20px; line-height: 20px; font-size: 16px; }
    .myList3 { border: 1px solid #333; padding: 10px; }
    .myList3 li { height: 20px; line-height: 20px; font-size: 12px; color: red; }
    </style>  
    <ul class="myList1">
        <li>aaaaaaaaa</li>
        <li>bbbbbbbbb</li>
        <li>ccccccccc</li>
    </ul>
    <ul class="myList2">
        <li>ddddddddd</li>
        <li>eeeeeeeee</li>
    <li>fffffffff</li>
    </ul>
    <ul class="myList3">
        <li>ggggggggg</li>
        <li>hhhhhhhhh</li>
    <li>jjjjjjjjj</li>
    </ul>

    方案一可以实现我们想要的效果,但它非常冗余,myList1,myList2,myList3的css设置相同,‘myList1 li’、‘myList2 li’、‘myList2 li’有部分css一致。我们需要对它们进行改进。

    方案二

    <style type="text/css">
    .myList1, .myList2, .myList3 { border: 1px solid #333; padding: 10px; }
    .myList1 li, .myList2 li, .myList3 li { height: 20px; line-height: 20px; font-size: 12px; }
    .myList2 li { font-size: 16px; }
    .myList3 li { color: red; }
    </style>  
    <ul class="myList1">
        <li>aaaaaaaaa</li>
        <li>bbbbbbbbb</li>
        <li>ccccccccc</li>
    </ul>
    <ul class="myList2">
        <li>ddddddddd</li>
        <li>eeeeeeeee</li>
    <li>fffffffff</li>
    </ul>
    <ul class="myList3">
        <li>ggggggggg</li>
        <li>hhhhhhhhh</li>
    <li>jjjjjjjjj</li>
    </ul>

    方案二和方案一思路相同,仍将模块视为完全不同彼此独立的三个类,只是对css代码做了精简工作。去除了代码冗余。

    方案三

    <style type="text/css">
    .myList { margin-bottom: 10px; width: 300px; }
    .f12 { font-size: 12px; }
    .f16 { font-size: 16px; }
    .red { color: red; }
    .myList { border: 1px solid #333; padding: 10px; }
    .myList li { height: 20px; line-height: 20px; }
    </style>  
    <ul class="myList f12">
        <li>aaaaaaaaa</li>
        <li>bbbbbbbbb</li>
        <li>ccccccccc</li>
    </ul>
    <ul class="myList f16">
        <li>ddddddddd</li>
        <li>eeeeeeeee</li>
        <li>fffffffff</li>
    </ul>
    <ul class="myList f12 red">
        <li>ggggggggg</li>
        <li>hhhhhhhhh</li>
        <li>jjjjjjjjj</li>
    </ul>

    方案三换了新思路,提取了更多的粒度更小类,通过类的组合实现设计图的效果。

    方案二和方案三看似都是不错的解决方案,其中方案二的优势是调用简单,一个模块只需要挂一个类;方案三调用稍微麻烦,但也有效控制了冗余,代码精简。

    看起来方案二和方案三都不错,但如果想实现下图的效果,又会如何呢?

    需求更改

     

    按照方案二的思路,我们需要再定义一个新的类myList4.代码清单如下:

    <style type="text/css">
    .myList1, .myList2, .myList3, .myList4 { border: 1px solid #333; padding: 10px; }
    .myList1 li, .myList2 li, .myList3 li { height: 20px; line-height: 20px; font-size: 12px; }
    .myList2 li { font-size: 16px; }
    .myList3 li { color: red; }
    .myList4 li { font-size: 16px; color: red; }
    </style>  
    <ul class="myList1">
        <li>aaaaaaaaa</li>
        <li>bbbbbbbbb</li>
        <li>ccccccccc</li>
    </ul>
    <ul class="myList2">
        <li>ddddddddd</li>
        <li>eeeeeeeee</li>
        <li>fffffffff</li>
    </ul>
    <ul class="myList3">
        <li>ggggggggg</li>
        <li>hhhhhhhhh</li>
        <li>jjjjjjjjj</li>
    </ul>
    <ul class="myList4">
        <li>LLLLLLLLL</li>
        <li>MMMMMMMMM</li>
        <li>NNNNNNNNN</li>
    </ul>

    按照方案三的思路,我们无需扩展新的类,只需要在HTML的标签的class里将之前定义的类重新组合即可。

    <style type="text/css">
    .f12 { font-size: 12px; }
    .f16 { font-size: 16px; }
    .red { color: red; }
    .myList { border: 1px solid #333; padding: 10px; }
    .myList li { height: 20px; line-height: 20px; }
    </style>  
    </head>
    <body>
    <ul class="myList f12">
        <li>aaaaaaaaa</li>
        <li>bbbbbbbbb</li>
        <li>ccccccccc</li>
    </ul>
    <ul class="myList f16">
        <li>ddddddddd</li>
        <li>eeeeeeeee</li>
        <li>fffffffff</li>
    </ul>
    <ul class="myList f12 red">
        <li>ggggggggg</li>
        <li>hhhhhhhhh</li>
        <li>jjjjjjjjj</li>
    </ul>
    <ul class="myList f16 red">
        <li>LLLLLLLLL</li>
        <li>MMMMMMMMM</li>
        <li>NNNNNNNNN</li>
    </ul>

    多用组合,少用继承

    方案三借鉴了编程领域的组合的思想,将方案二中复杂的myList1、myList2、myList3等类拆分成了几个相对简单的类,其中相对稳定的部分拆分成myList类,而可能变化的部分拆成了f12类、f16类和red类。通过类的组合,很容易实现类的扩展,避免产生类爆炸。

    知识延伸,面向对象编程

    在面向对象中有类似上面的情况:继承和组合。

    继承的思路是将一个复杂且包含变化的类,拆分成几个复杂但稳定的子类。首先明确一个抽象的父类,父类有着几乎所有的方法和属性。但使用继承的话,任何一点小的变化也需要重新定义一个类,很容易引起类的爆炸式增长,产生一大堆有着细微不同的子类。

    组合的思路是将一个复杂的类分成容易产生变化的部分和相对稳定的部分,将容易变化的部分拆分出去,每一种可能的变化设计成一个个单独的类,而相对稳定部分设计成一个主体类,这样,将一个复杂的类拆分成几个简单的类,类之间没有继承关系,这遵循了面向对象设计的“单一职责”原则。将那些容易变化的类的实例赋值给主体类作为一个属性,这样就实现了类的组合。用组合方式,可以大大减少类的数量。

    后记,这是我看过解释继承和组合最容易理解的说法,没有学过面对对象概念的同学可能有些地方不明白。

    来源:Web前端开发修炼之道

  • 相关阅读:
    苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
    2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
    2018CHD-ACM新生赛(正式赛)D.刀塔大师lwq I
    2018CHD-ACM新生赛(正式赛)C.绝望のRevue
    最小生成树——克鲁斯克算法+一道例题
    求连通分量个数+判定二分图
    动态规划——滚动数组(省内存)
    [BZOJ 1491] [NOI 2007] 社交网络
    SPOJ 8222 Substrings 后缀自动机
  • 原文地址:https://www.cnblogs.com/mackxu/p/css-module.html
Copyright © 2011-2022 走看看