使用CSS隐藏只包含空格的元素

27

我正在尝试隐藏一个在自动生成的HTML文档中的元素:

  <p id="sitspagedesc" class="sitspagedesc">

    </p>
在一些页面中,<p> 标签会包含一个内部值,但在其他情况下,它可能仅包含空格,如示例所示。我需要找到一种使用CSS隐藏它的方法,因为更改HTML不是选项。
我已经尝试使用:
.sitspagedesc:empty
{
display:none;
}

但是这样不起作用,可能是因为该元素包含了空格。

有人有什么好的想法吗?

谢谢 :)


1
不想说,但是JavaScript不是一个选项吗? - A.M. D.
2
你为什么一开始就有一个空的 p?我建议在服务器端放置一些逻辑,如果你不想显示它,则不要渲染此元素。你试图实现的似乎是违反直觉的。 - Curtis
澄清一下...你可能有许多带有该类的<p>标签吗?还是你想通过ID处理这个特定的元素? - scunliffe
无CSS方法,根据https://dev59.com/pHI_5IYBdhLWcg3wHfOr。 - sglessard
当然是个愚蠢的问题,但是空的<p>标签不会被浏览器自动隐藏吗? - Mr Lister
显示剩余2条评论
9个回答

14

我认为你不能只用纯CSS来做到这一点。

不过,使用一点JavaScript是可以做到的。

var allParas = document.getElementsByTagName('p');
//filter by class name if desired...
for(var i=0;i<allParas.length;i++){
  if(allParas[i].getElementsByTagName('*').length == 0){
    allParas[i].style.display = 'none';
  }
}
如果你可以使用jQuery,使用它们内置的选择器过滤会更容易一些。
$('p.sitspagedesc').each(function(){
  if($(this).children().length == 0){
    $(this).hide();
  }
});

我在我的WordPress网站上尝试了这个答案,但它没有起作用。 WordPress会自动添加<p>和<br>标签(wpautop)。我的客户不允许我将其关闭,这就导致了我来到这里。 - David

8
如果希望模仿:empty选择器的功能,但忽略空格,则scunliffe提供的被接受的答案不太适用。它只检查子元素,这并没有考虑所选元素内直接包含的文本。例如,<p>Hello World!</p>将被视为空,因为它没有子元素,即使它确实包含非空格文本。
我的解决方案使用jQuery.trim()函数从.text()值中删除前导和尾随空格,该值包含所选元素及其后代的组合文本内容。因此,如果所选元素不包含非空格文本和子元素,则将隐藏该元素。与:empty选择器一样,HTML注释不计入内容,因为它们未反映在.text()或.children()值中。
$('p.sitspagedesc').each(function(){
    if($.trim($(this).text()) == '' && $(this).children().length == 0){
        $(this).hide(); 
    }
});

请查看https://jsfiddle.net/TNTitan89/crejkbxq/上的Fiddle。

4

4
:empty选择器非常严格,含有空格的元素不被视为空。因此有两个解决方案:
  1. 修改输出。修剪输出值或最小化HTML,以删除这些空格。 或者更好的选择是:根本不要呈现这些元素。我认为这是最好的选择,因为它既可以减少流量,又可以提供一个无需Javascript即可工作的解决方案。
  2. 使用JavaScript查找这些元素。我不知道是否有技巧可以轻松找到这些元素,所以您可能需要遍历所有元素,搜索您认为为空的元素,并向这些元素添加类。这可能非常缓慢,特别是在低端设备上。而且只有在运行脚本后,它才会隐藏元素,因此在页面加载时,元素将可见一段时间,直到它被隐藏。很明显,这不是理想的解决方案。
也许您可以将两者结合起来。 :empty选择器是CSS3选择器,尚未由IE8及以下版本支持,因此在这些浏览器中使用JavaScript回退可能是一个好主意,除非您可以修复服务器端脚本,使空元素在渲染期间根本不呈现,或在渲染过程中赋予您的特殊类,因此不需要JavaScript。

1
在找了几个小时之后,我终于找到了这个解决方案。 "包含空格的元素不被视为空。因此有两种解决方案。" ,救了我一命!谢谢! - Bryan Saxon

0
这是我为一个客户使用jQuery 1.5.x实现的解决方案-您可能需要调整“//跳过空标签但有效”的正则表达式字符串。
$('*:only-child:empty').each(
    function(index) {
        var currentElement = $(this);
        // skip singleton tags
        if(/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i.test(currentElement.get(0).tagName) == true) {
                return
        }
        // skip empty tags but which are valid
        if(/^(?:textarea)$/i.test(currentElement.get(0).tagName) == true) {
                return
        }
        while (currentElement.parent().children().length == 1) {
            currentElement = currentElement.parent();
        }
        // so 0 or more children for the parent then we hide it
        // we will never have more then 0 children though the :empty takes care of that
        console.log('hidding: ' + currentElement);
        currentElement.hide()
    }
);

0

虽然不是标准,但 Firefox 支持 ":-moz-only-whitespace"。

此外,为了一些“未来证明”,css-tricks 提到了一个 :blank 选择器,它将成为 CSS 选择器 Level 4 草案的一部分。虽然目前没有浏览器支持它,但这是一种可能性。


0

目前纯CSS中无法检测空元素。如果不能使用JavaScript,那么在HTML到达浏览器之前,有没有任何服务器端操作的方法?


-1

CSS:

.sitspagedesc:empty
{
display:none;
}

jQuery:

$('.sitspagedesc').html(function(){
// empty element
return $.trim($(this).html());
});

感谢您标记代码类型,但我们需要一些关于您的方法的解释。 - Cyzanfar
我使用了trim函数来清理类名为'sitspagedesc'的元素中的空格。感谢您的意见。 - Nguyen Hoang Kim

-4

你可以使用:

p.sitspagedesc {
  content: " "; 
  display: none;
}

除非您在其中随机有多个空格...


这是完全错误的。content将被完全忽略,因为它只是::before::after伪元素上的有效属性。这将简单地隐藏所有.sitspacedesc的实例,包括那些具有内容的实例。 - Ansel Santosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接