CSS:最后一个孩子

问题描述:

我有一个div#content,里面有很多div.item。 当使用:last-child来创建最后的div.item而没有border-bottom时,这没关系。 但是,作为内容使用我使用的将在最后一个div.item这意味着在div#content的底部之后附加有条件的分页表PHP和MySQL结果动态地追加。这将是问题,因为CSS :last-child不会识别最后一个孩子的最后一个div.item。 我的CSS是这样的:CSS:最后一个孩子

div#content div.item:last-child { 
    border-bottom: none; 
} 

,你可以看到我定义的最后一个子ID这样的div.item

任何建议,请。提前致谢。

!!!!!请注意,问题并不在于内容是动态的,而是因为CSS:last-child无法识别div.item作为最后一个子元素,但是div#内容中的最后一个元素尽管告诉了它是这样的CSS:

div#content div.item:last-child 
+0

你确定你只附加在子级别'div.item'而不是别的? – BoltClock 2010-10-08 23:45:07

+0

请注意':last-child' [不支持在IE中](http://www.quirksmode.org/css/contents.html#t35)。你使用的是什么浏览器? – 2010-10-08 23:38:07

+1

@Andrew Vit:那么,如果OP说它一开始工作正常,他就不能使用IE。 – BoltClock 2010-10-08 23:40:43

一个可能性我能想到的是,你要追加不在<div> S和/或不具备item类元素。检查PHP/MySQL脚本的输出,看看除了(DOM术语)div.item元素之外是否还有任何非div.item元素。

这些元素不会选择匹配:

div#content div.item:last-child 

即选择只发现<div> s的item类,那是div#content最后一个孩子。

下面是一个例子。

附加

<div id="content"> 
    <div class="item"></div> <!-- [1] Selected --> 
</div> 

附加

<div id="content"> 
    <div class="item"></div> <!-- [2] Not selected --> 
    <div></div>    <!-- [3] Not selected --> 
</div> 

什么选择的,哪些不是,并为什么之后之前?

  1. 选择
    <div>元素具有item类,并且它是div#content最后一个孩子。

    它完全符合上述选择器。

  2. 未选择
    <div>元素具有item类,但不div#content最后一个孩子。

    它不完全匹配上面的选择器;但是,它可能匹配这些选择的任何一个:

    /* Any div.item inside div#content */ 
    div#content div.item 
    
    /* The last div.item child of its parent only */ 
    div#content div.item:last-of-type 
    
  3. 未选择
    虽然这<div>元素是最后一个孩子,它item类。

    它不完全匹配上面的选择器;但是,它可能匹配这样的:

    /* Any div that happens to be the last child of its parent */ 
    div#content div:last-child 
    
+0

这非常有帮助!非常感谢! – medk 2010-10-08 23:51:27

+0

很好的解释。注意展开讨论为什么'div#content div.item:not(.dont-want):last-of-type'不能按预期工作? – 2011-02-11 17:36:55

+1

@凯文·佩诺:划伤我以前的评论。这是因为':not()'总是在':last-of-type'之后被处理。这意味着':last-of-type'元素被选中,如果它碰到':not()'则被丢弃。看[这个修改过的jsFiddle示例](http://jsfiddle.net/BoltClock/CfZdN)。 – BoltClock 2011-02-11 17:52:14

你可以使用JavaScript刷新CSS只。看到这里:http://paulirish.com/2008/how-to-iterate-quickly-when-debugging-css/

另一种方法是使用类似jQuery的库,并在每次添加新div时触发这一行脚本。 (也许你正在使用其他JS库,就像你说的,你是动态添加的div页面)

$('div#content div.item:last-child').css('borderBottom','none'); 

你可能需要你做上面虽然之前重置边界。即前面的'最后'div仍然没有边界底部。因此重置所有边框然后触发脚本以删除最后一个边框。

+0

谢谢你的回答,但正如我所说的,我使用php和mysql来动态生成div.itemS,所以甚至在将页面发送到客户端之前。 – medk 2010-10-08 23:17:29

+0

@med:好的,然后在页面渲染后运行一些javascript会是我的建议之一。 – 2010-10-08 23:25:17

+0

好的非常感谢:) – medk 2010-10-08 23:32:06

它似乎追加项目dinamically不会使布局引擎重新运行像一些CSS规则:最后一个孩子。

我想你可以重新读取/重新加载CSS文件,使规则适用。不知道,这是一个猜测。

另一种可能性是dinamically设置样式。


编辑:看来你有一个CSS浏览器的问题。

检查了这一点:http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28Cascading_Style_Sheets%29#Selectors

+0

谢谢你的回答,但正如我所说,我使用PHP和MySQL动态生成div.itemS,所以甚至在发送页面到客户端之前。 – medk 2010-10-08 23:10:45

+0

@med,所以让我看看,如果我明白...你从来没有看到这个:最后孩子规则工作之前?我认为这是一个js动态生成的。如果这是之前发送给客户端,我假设你的CSS规则从来没有工作过。在这种情况下,你能告诉我你用什么浏览器来测试吗? – Dave 2010-10-08 23:33:19