代码之家  ›  专栏  ›  技术社区  ›  Bram Vanroy

使CSS3家谱IE8兼容

  •  2
  • Bram Vanroy  · 技术社区  · 10 年前

    我想使用 this great CSS3 family tree ,但我需要IE8的支持。主要问题似乎是 :before :after 元素,如下图所示。(第一个孙子不应该排到左边,最后一个孙子不该排到右边。)

    IE8 screw things up

    我已经尝试过jQuery回退,但没有成功。这里有一个 JSFiddle 要玩,代码如下。

    // Add classes for old IE
    jQuery(".tree li a:only-child, .tree li:only-child").addClass("only-child");
    /*Now the CSS*/
     * {
        margin: 0;
        padding: 0;
    }
    .tree ul {
        padding-top: 20px;
        position: relative;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    .tree li {
        float: left;
        text-align: center;
        list-style-type: none;
        position: relative;
        padding: 20px 5px 0 5px;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    /*We will use ::before and ::after to draw the connectors*/
     .tree li:before, .tree li:after {
        content:'';
        position: absolute;
        top: 0;
        right: 50%;
        border-top: 1px solid #ccc;
        width: 50%;
        height: 20px;
    }
    .tree li:after {
        right: auto;
        left: 50%;
        border-left: 1px solid #ccc;
    }
    /*We need to remove left-right connectors from elements without 
    any siblings*/
     .tree li.only-child:after, .tree li.only-child:before {
        display: none;
    }
    /*Remove space from the top of single children*/
     .tree li.only-child {
        padding-top: 0;
    }
    /*Remove left connector from first child and 
    right connector from last child*/
     .tree li:first-child:before, .tree li:last-child:after {
        border: 0 none;
    }
    /*Adding back the vertical connector to the last nodes*/
     .tree li:last-child:before {
        border-right: 1px solid #ccc;
        border-radius: 0 5px 0 0;
        -webkit-border-radius: 0 5px 0 0;
        -moz-border-radius: 0 5px 0 0;
    }
    .tree li:first-child:after {
        border-radius: 5px 0 0 0;
        -webkit-border-radius: 5px 0 0 0;
        -moz-border-radius: 5px 0 0 0;
    }
    /*Time to add downward connectors from parents*/
     .tree ul ul:before {
        content:'';
        position: absolute;
        top: 0;
        left: 50%;
        border-left: 1px solid #ccc;
        width: 0;
        height: 20px;
    }
    .tree li a {
        border: 1px solid #ccc;
        padding: 5px 10px;
        text-decoration: none;
        color: #666;
        font-family: arial, verdana, tahoma;
        font-size: 11px;
        display: inline-block;
        border-radius: 5px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    
    
    /*Time for some hover effects*/
    
    /*We will apply the hover effect the the lineage of the element also*/
     .tree li a:hover, .tree li a:hover+ul li a {
        background: #c8e4f8;
        color: #000;
        border: 1px solid #94a0b4;
    }
    /*Connector styles on hover*/
     .tree li a:hover+ul li::after, .tree li a:hover+ul li::before, .tree li a:hover+ul::before, .tree li a:hover+ul ul::before {
        border-color: #94a0b4;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    
    <!-- Borrowed from http://thecodeplayer.com/walkthrough/css3-family-tree -->
    <div class="tree">
        <ul>
            <li>	<a href="#">Parent</a>
    
                <ul>
                    <li>	<a href="#">Child</a>
    
                        <ul>
                            <li>	<a href="#">Grand Child</a>
    
                            </li>
                        </ul>
                    </li>
                    <li>	<a href="#">Child</a>
    
                        <ul>
                            <li><a href="#">Grand Child</a>
                            </li>
                            <li>	<a href="#">Grand Child</a>
    
                                <ul>
                                    <li>	<a href="#">Great Grand Child</a>
    
                                    </li>
                                    <li>	<a href="#">Great Grand Child</a>
    
                                    </li>
                                    <li>	<a href="#">Great Grand Child</a>
    
                                    </li>
                                </ul>
                            </li>
                            <li><a href="#">Grand Child</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
    1 回复  |  直到 9 年前
        1
  •  3
  •   Alexander O'Mara    10 年前

    造成额外边界的问题是 :first-child 这个 :last-child 伪类在IE8及以下版本中不可用。此无法识别的选择器的存在将使整个规则无效,导致IE删除以下规则。

    /*Remove left connector from first child and 
    right connector from last child*/
    .tree li:first-child:before, .tree li:last-child:after {
        border: 0 none;
    }
    /*Adding back the vertical connector to the last nodes*/
    .tree li:last-child:before {
        border-right: 1px solid #ccc;
        border-radius: 0 5px 0 0;
        -webkit-border-radius: 0 5px 0 0;
        -moz-border-radius: 0 5px 0 0;
    }
    

    要解决这个问题,可以使用相同的jQuery addClass 这些元素的策略。

    JavaScript:

    jQuery(".tree li:last-child").addClass("last-child");
    

    CSS:

    /*Remove left connector from first child and 
    right connector from last child*/
    .tree li:first-child:before, .tree li.last-child:after {
        border: 0 none;
    }
    /*Adding back the vertical connector to the last nodes*/
    .tree li.last-child:before {
        border-right: 1px solid #ccc;
        border-radius: 0 5px 0 0;
        -webkit-border-radius: 0 5px 0 0;
        -moz-border-radius: 0 5px 0 0;
    }
    

    IE8中的屏幕截图:

    enter image description here

    工作示例( JSFiddle ):

    $(window).load(function(){
    // Add classes for old IE
    	jQuery(".tree li a:only-child, .tree li:only-child").addClass("only-child");
    	jQuery(".tree li:last-child").addClass("last-child");
    
    });
    /*Now the CSS*/
     * {
        margin: 0;
        padding: 0;
    }
    .tree ul {
        padding-top: 20px;
        position: relative;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    .tree li {
        float: left;
        text-align: center;
        list-style-type: none;
        position: relative;
        padding: 20px 5px 0 5px;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    /*We will use ::before and ::after to draw the connectors*/
     .tree li:before, .tree li:after {
        content:'';
        position: absolute;
        top: 0;
        right: 50%;
        border-top: 1px solid #ccc;
        width: 50%;
        height: 20px;
    }
    .tree li:after {
        right: auto;
        left: 50%;
        border-left: 1px solid #ccc;
    }
    /*We need to remove left-right connectors from elements without 
    any siblings*/
     .tree li.only-child:after, .tree li.only-child:before {
        display: none;
    }
    /*Remove space from the top of single children*/
     .tree li.only-child {
        padding-top: 0;
    }
    /*Remove left connector from first child and 
    right connector from last child*/
    .tree li:first-child:before, .tree li.last-child:after {
        border: 0 none;
    }
    /*Adding back the vertical connector to the last nodes*/
     .tree li.last-child:before {
        border-right: 1px solid #ccc;
        border-radius: 0 5px 0 0;
        -webkit-border-radius: 0 5px 0 0;
        -moz-border-radius: 0 5px 0 0;
    }
    .tree li:first-child:after {
        border-radius: 5px 0 0 0;
        -webkit-border-radius: 5px 0 0 0;
        -moz-border-radius: 5px 0 0 0;
    }
    /*Time to add downward connectors from parents*/
     .tree ul ul:before {
        content:'';
        position: absolute;
        top: 0;
        left: 50%;
        border-left: 1px solid #ccc;
        width: 0;
        height: 20px;
    }
    .tree li a {
        border: 1px solid #ccc;
        padding: 5px 10px;
        text-decoration: none;
        color: #666;
        font-family: arial, verdana, tahoma;
        font-size: 11px;
        display: inline-block;
        border-radius: 5px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        transition: all 0.5s;
        -webkit-transition: all 0.5s;
        -moz-transition: all 0.5s;
    }
    
    
    /*Time for some hover effects*/
    
    /*We will apply the hover effect the the lineage of the element also*/
     .tree li a:hover, .tree li a:hover+ul li a {
        background: #c8e4f8;
        color: #000;
        border: 1px solid #94a0b4;
    }
    /*Connector styles on hover*/
     .tree li a:hover+ul li::after, .tree li a:hover+ul li::before, .tree li a:hover+ul::before, .tree li a:hover+ul ul::before {
        border-color: #94a0b4;
    }
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.js"></script>
    
    
    <!-- Borrowed from http://thecodeplayer.com/walkthrough/css3-family-tree -->
    <div class="tree">
        <ul>
            <li class="only-child">	<a href="#">Parent</a>
    
                <ul>
                    <li>	<a href="#">Child</a>
    
                        <ul>
                            <li class="only-child">	<a class="only-child" href="#">Grand Child</a>
    
                            </li>
                        </ul>
                    </li>
                    <li>	<a href="#">Child</a>
    
                        <ul>
                            <li><a class="only-child" href="#">Grand Child</a>
                            </li>
                            <li>	<a href="#">Grand Child</a>
    
                                <ul>
                                    <li>	<a class="only-child" href="#">Great Grand Child</a>
    
                                    </li>
                                    <li>	<a class="only-child" href="#">Great Grand Child</a>
    
                                    </li>
                                    <li>	<a class="only-child" href="#">Great Grand Child</a>
    
                                    </li>
                                </ul>
                            </li>
                            <li><a class="only-child" href="#">Grand Child</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </div>