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

为什么.class:last-of-type无法正常工作?

拓拔耀
2023-03-14
问题内容

为什么这不起作用?

p{

    display: none;

}

p.visible:last-of-type {

    display: block;

}


<div>

  <p class="visible">This should be hidden</p>

  <p class="visible">This should be displayed</p>

  <p class="">This should be hidden</p>

</div>

实际上,我所有的<p>元素都不可见。如果我.visible在选择器中删除对的引用,则确实会显示<p>div中的最后一个,但这不是我想要的。

当然,我只能一直保留一个.visible,但这只是一个reveal.js演示文稿,我无法控制JavaScript。

如何选择带有类的div中的最后一个元素.visible?我不想为此使用JavaScript。


问题答案:

您的问题是,您正在阅读:last-of-type并认为它可以用作:last-of-class选择器,而实际上它 表示 元素
。不幸的是,没有用于类的最后一个实例的选择器。

从W3C:

:last-of-type伪类表示是它的类型的最后一个侧边的元件。

您将p.visible:last-of-type作为选择器,它执行以下操作:

  1. 查看:last-of-typeHTML中每个包含元素中的每个元素列表(例如1个或多个元素;没有兄弟姐妹的孩子仍然可以应用到它)
  2. 在列表中找到最后一个元素
  3. 检查它是否是一个<p>元素
  4. 检查是否具有该类.visible

简而言之,您的选择器只会将其样式应用于<p> 同时具有 类的.visible。在您的标记中,只有前两个<p>元素具有该类。第三不。

这是一个不同风格的演示,以说明:

p:last-of-type {

  /* this will be applied in the third paragraph because the pseudo-selector checks for nodes only */

  color: green;

}

p.visible:last-of-type {

  /* this does not get applied, because you are using the pseudo-selector with a specific class in addition to the node type. */

  color: red;

}


<p class="visible">First paragraph.</p>

<p class="visible">Second paragraph.</p>

<p>Third paragraph.</p>

按照您的最终目标,

如何选择.visible类的div中的最后一个元素?我不想为此使用JavaScript。

最简单,最高效的方法是颠倒您尝试应用样式的方式。而不是尝试隐藏三个div中的两个,其中要隐藏的一个div有一个类,要隐藏的另一个div没有类,并且要显示的div与要隐藏的一个div共享同一类其中
有一个类(请参阅?这很令人困惑),请执行以下操作:

  • 仅将类添加到较小的元素(或元素组)中。
  • 将元素的默认样式设置为您不希望类实现的样式。
  • 将类的样式设置为您想要实现的样式。

    p {

    display: none;
    

    }

    .visible {

    display: block;
    

    }

    <p>This should be hidden</p>
    
    <p class="visible">This should be displayed</p>
    
    <p>This should be hidden</p>
    

从该演示中可以看到,不仅HTML和CSS更简单,而且还具有仅使用类选择器而不是*-of-type伪选择器的好处,这将使页面加载更快(请参见下文) 。

为什么没有 跟随 选择器父选择器 通过仅动态更改页面上的一个类名称,这可能会降低许多网页的速度。

DaveHyatt在2008年研究WebKit实现时,提到了避免使用这些实现的一些原因:

使用父选择器,意外地导致文档范围内的混乱变得非常容易。人们会并且会滥用该选择器。支持它可以使人们绞尽脑汁。

关于CSS3选择器的可悲的事实是,如果您关心页面性能,则实际上根本不应该使用它们。使用类和id装饰标记并在其上进行完全匹配,同时避免所有使用同级,后代和子选择器,实际上将使页面在所有浏览器中的性能明显提高。



 类似资料:
  • 问题内容: 看来AngularJS的不起作用。它不适用于数字字符串。难道我做错了什么?我应该使用吗? 我需要一些东西来查看字符串是否是一个数字(实际上是一个数字),除非我乘以1,否则我不会这么做,但是如果我这样做,那么它将始终为真。另外是不是一个数字(定义)等应该返回false。 问题答案: 在 JavaScript中 ,。 例如,如果需要将 字符串 识别为 Number ,则将其转换为 Numb

  • 问题内容: 如标题所述,我想将CSS规则处理到具有特定类的特定类型的最后一个元素。以下代码可以完美运行: 但我想要类似的东西 这个怎么做 ? 问题答案: 遗憾的是,使用不可能找到最后一个。 编辑 :要实际为该答案添加一些内容,您可以回退到JavaScript来查找此选择器,或修改您的标记/CSS。尽管我发现自己对类选择器会很有用,但要多加思考就无法解决。

  • 问题内容: 我试图通过使用该方法销毁所有会话变量,但是在使用此方法之后,这些值不会被销毁。 为什么不工作? 还有其他方法可以销毁PHP中的会话吗? 问题答案: 使用后,会话将在后台被销毁。由于某种原因,这不会影响已为此请求填充的中的值,但在以后的请求中将为空。 如果需要,您可以手动清除()。

  • 问题内容: 这是我的代码: 这是我的输出: 我的理解 是。因此,应该首先一个号码,然后松开,然后给到线或。所以,一次应该有一个数字,对吧? 但是为什么我的代码一次是两个或三个数字?我做错什么了吗(我是新手)? 问题答案: 虽然确实不是同步的,但是它访问变量。 即使您同步访问权限,它也无济于事,因为下一种情况仍然可能: 线程1增量 线程2增量 线程1的打印值 线程2的打印值 要解决此问题,您需要增加

  • 问题内容: 我在Ubuntu Hardy VPS上做了一份计划工作,只有一半可以工作,我不知道为什么。这项工作是一个Ruby脚本,它使用mysqldump备份Rails应用程序使用的MySQL数据库,然后将其压缩并使用SFTP上传到远程服务器。 gzip文件已成功创建并复制,但始终为零字节。但是,如果我直接从命令行运行cron命令,它将运行完美。 这是cron工作: 这是datadump.rb:

  • 问题内容: 我试图在sed的正则表达式中使用它,但是它不起作用: 但这是可行的: 问题答案: 是一个开关,而不是正则表达式宏。如果要使用一些预定义的“常量”而不是表达式,请尝试运行以下代码: