当前位置: 首页 > 面试题库 >

CSS选择器仅针对直接子级,而不针对其他相同后代

阎扬
2023-03-14
问题内容

我有一个嵌套的可排序列表,可以html" target="_blank">动态添加或删除项目,并且可以嵌套n级。嵌套时,会将新的ul元素注入选择为父元素的li元素中。列表的初始状态如下所示:

<ul id="parent">
    <li id="One"><a href="" class="listLink"><span class="position">1</span>One</a></li>
    <li id="Two"><a href="" class="listLink"><span class="position">2</span>Two</a></li>
    <li id="Three"><a href="" class="listLink"><span class="position">3</span>Three</a>
        <ul>
            <li id="A"><a href="" class="listLink"><span class="position">1</span>A</a></li>
            <li id="B"><a href="" class="listLink"><span class="position">2</span>B</a></li>
            <li id="C"><a href="" class="listLink"><span class="position">3</span>C</a></li>
            <li id="D"><a href="" class="listLink"><span class="position">4</span>D</a></li>
            <li id="E"><a href="" class="listLink"><span class="position">5</span>E</a></li>
            <li id="F"><a href="" class="listLink"><span class="position">6</span>F</a></li>                    
        </ul>
    </li>   
    <li id="Four"><a href="" class="listLink"><span class="position">4</span>Four</a></li>
    <li id="Five"><a href="" class="listLink"><span class="position">5</span>Five</a></li>
    <li id="Six"><a href="" class="listLink"><span class="position">6</span>Six</a></li>                    
</ul>

我正在使用MooTools进行排序等,并且工作正常,但是在排序时正确重置位置文本时遇到了麻烦。我尝试使用的每个CSS选择器还包括 所有
子项,而不仅仅是列表中的li元素,而不是子列表中的所有li元素。假设除id,position和text之外,所有列表中的每个li元素都与其他所有元素相同。是否有一个选择器只能让直子生?还有另一种方法吗?

我尝试了一些子选择器,例如上述选择器:

  • ul > li将选择 所有 ul的子元素li,而不仅仅是直系子元素
  • #parent > li 与上述相同。

这是我在删除项目时当前正在运行的功能,该功能无法处理排序,效果很好,只是更新位置。请注意,它也是MooTools语法:

var drop = function(el){
    el.getParents('ul').reverse().each(function(item){
        var posCount = 1;
        item.getElements('li a span[class=position]').each(function(pos){
            pos.set('text', posCount);
            posCount++;
        });
    });
}

当前,更改主级别上的任何项目顺序都会重新编号所有1-12,甚至是子列表。更改子列表中的任何项目将为该列表提供正确的数字,但会导致父列表在编号中错误地计算所有子li元素。

我觉得这是一个丑陋的骇客,但确实有效:

var drop = function(){
    var ulCount = 1;
    $$('ul').each(function(item){
        if(item.get('id') != 'parent') { 
            item.set('id', 'id-'+ulCount);
        }
        var elId = item.get('id');
        var posCount = 1;
        $(document).getElements('#'+elId+'>li>a>span[class=position]').each(function(pos){
            pos.set('text', posCount);
            posCount++;
        });
        ulCount++;
    });
}

问题答案:
ul > li

只做直系孩子。因此,例如,仅使用顶级列表元素,可以使用:

#parent > li

注意: IE6不支持此功能。

向后兼容的常见解决方法是执行以下操作:

#parent li { /* style appropriately */ }
#parent li li { /* back to normal */ }

这比较麻烦,因为您必须先应用样式然后将其关闭(并且您可能不一定知道旧值是什么),但这是唯一的IE6友好的纯CSS解决方法。

编辑:
好的,您有一个MooTools特定的问题。getElements()返回所有后代,而不仅仅是直接子代。尝试使用getChildren()。

var drop = function(el){
    el.getParents('ul').reverse().each(function(item){
        var posCount = 1;
        item.getChildren("li").getElements("a span[class=position]").each(function(pos){
                pos.set('text', posCount);
                posCount++;
        });
    });
}

或类似的东西。



 类似资料:
  • 我正在编写一个查询来选择所有行,其中所有子行只包含相同的值,而不包含其他场景。 尝试了很多网上的例子,没有匹配。 从所有子级仅包含相同值而没有其他方案的表中选择*。必须包含至少一个要返回的子级。 子级通过ID映射到父级。 子值为一列,可以为int或null。假设所有子级必须包含值5,而不包含任何其他值。如果大多数子级都包含5,则将不起作用,则必须是所有子级都只有5的家长。 父级可能有多个子级 父级

  • 问题内容: 我有以下HTML 以及以下样式: 由于某种原因,我不了解该样式已应用于 “子内容1” 和 “标题” 。 我认为样式上的选择器仅适用于div的第一个直接子类,该子类具有“ section”类。如何更改选择器以获得我想要的? 问题答案: 您所发布的字面意思是“查找分区div内且是其父级的第一个孩子的所有div。” 该子项包含一个与该描述匹配的标签。 我不清楚您是否要同时兼任主要div的两个

  • 问题内容: 我已经为此苦苦挣扎了一段时间……我目前正在使用Angular。 假设我们有五个选择选项字段,并且我们正在为每个列表遍历相同的列表。 我们的选择是: 如果我选择一个,我将如何为其余选择选项字段禁用选择的选项?而且,如果我转到另一个选择选项字段并选择一个可用的项目,则它将对所有其他字段禁用该项目。 任何帮助甚至指导如何做到这一点,将不胜感激。谢谢 问题答案: 您可能需要两种可能的解决方案,

  • 问题内容: 无论如何,LESS是否在其输出中应用直接子选择器(>)? 以我的style.less,我想写一些类似的东西: 并让LESS生成如下内容: 问题答案: 更新 实际上,原始问题中的代码可以正常工作。您可以坚持使用子选择器。 找到了答案。 请注意“>”和“。”之间缺少空格,否则它将无法正常工作。

  • 我有一个Maven项目,其中包括一个Maven插件(Liquibase Maven插件),它公开了不同的目标。其中两个目标(update和diff)需要在它们之间发生冲突的不同参数(因为两者的语义不同),因此我需要在两个目标执行中赋予Maven不同的属性。 有没有办法在Maven中为不同的目标传递不同的配置?

  • 问题内容: 我想设置不在标签内的元素的样式。 什么是实现此目标的最佳方法? 似乎根本不起作用,至少在Chrome上不起作用,即使看起来应该如此 我也无法从控制台运行它。 我还有其他可用于CSS的方法吗? 问题答案: 不支持组合器选择器。 如果我们在谈论它的直接父: 否则,无法在CSS中执行此操作。您必须重写它: