【问题标题】:How can I detect white-space and delete delimiter in CSS如何在 CSS 中检测空格并删除分隔符
【发布时间】:2017-10-30 06:07:27
【问题描述】:

我正在尝试使用 Jekyll 在我的博客中添加类别视图。

blog.html

<div class="blog-category">
    {% assign categories_list = site.categories %}
        {% for category in categories_list %}
            <small>
                <a class="category" href="{{site.baseurl}}/categories/{{ category[0] | downcase }}.html">{{ category[0] | capitalize }}</a>
            </small>
        {% endfor %}
    {% assign categories_list = nil %}
</div>

CSSfile.scss

.blog-category {
    width: 80% !important;
    margin: auto;
    white-space: normal;
    text-align: center !important;
    word-spacing: 1.5em;

    small::before {
        content: " | ";
    }

    small:first-child::before {
        content: "";
    }
}

你会看到这样的。

如果屏幕很宽

A类 | B类 | C类 | D 类 | E 级 | F 类 |
G 类 | H 类 |一级 | J 类 | K类

如果屏幕窄

A类 | B类 | C类 |
D 类 | E 级 | F 类 |
G 类 | H 类 |一级 |
J 类 | K类

我的问题说明

如您所见,“classF”(classC,classI also)旁边有分隔符,因为我在css文件中通过编码content: " | ";将分隔符“|”。 我想做的是在有空格时删除分隔符(实际上是换行符)。

请帮我解决我的问题:(

【问题讨论】:

    标签: html css attributes jekyll whitespace


    【解决方案1】:

    我想不出用纯 CSS 解决这个问题的任何方法。

    我是这样尝试的:

    $(window).on("resize", (function() {
        var isLast = false;
        $("a").removeClass("Last")
        $("a").each(function() {   
            if (isLast && isLast.offset().top != $(this).offset().top) {
                isLast.addClass("Last");
            } 
            isLast = $(this);
        }).last().addClass("Last");
    })).resize();
    

    思路是对每个元素进行迭代,检查前一个是否在同一行,如果不是,前一个是该行的最后一个;在这种情况下,添加了一个新类“Last”。 “Last”类设置为:

    .Last:after {
      content: "";
    }
    

    &lt;a&gt; 元素在哪里:

    small a:after {
            content: " | ";
        }
    

    此外,我将 resize 事件绑定到窗口对象,然后 .resize() 立即调用它 onload。 当然,最后这些操作对于更改窗口大小的响应目的很重要。

    我简化了一点你的代码,只是为了加快速度,但无论如何你都可以弄清楚如何适应你的......

    http://jsfiddle.net/9z2ug5oj/1/

    最后,我将&lt;a&gt; 元素显示为inline-block,以避免单个元素分成两行:

    small a {
      display:inline-block;
    }
    

    http://jsfiddle.net/9z2ug5oj/2/

    【讨论】:

    • 谢谢。但是,我真的很想摆脱我博客中的所有 Javascripts .. :( 我希望没有它的唯一方法。
    • 而且,我认为使用offset().top 是一个有点危险的选择,因为我已经在你的 jsfiddle.net 中发现了一些错误,你把它们放在你的答案中:(
    【解决方案2】:

    有一个纯 CSS 的解决方案,但它只适用于左对齐的“列表”,而不适用于居中对齐的列表。我知道这不完全是 OP 所要求的,但我不想让大家知道。它是如此简单......它很漂亮;-)。

    这个 HTML:

    <div class="holder">
      <div class="inner">
        |&nbsp;classA
        |&nbsp;classB
        |&nbsp;classC
        |&nbsp;classD
        |&nbsp;classE
        |&nbsp;classF
        |&nbsp;classG
        |&nbsp;classH
        |&nbsp;classI
        |&nbsp;classJ
        |&nbsp;classK
      </div>
    </div>
    

    ...连同这个CSS:

    .holder {overflow: hidden;}
    .inner {position: relative; left: -5px;}
    

    查看working example

    【讨论】:

    • 好吧,对不起,我不想这样。(如果这句话看起来很粗鲁,对不起它的表达方式。英语不是我的第一语言..)问题是我不'不知道有多少孩子(类别)。因为它是由 Liquid 语法生成的。顺便说一句,谢谢你给我的帮助。
    • 我假设你不想要它,因为它是左对齐的。类别的数量在这里并不重要。
    【解决方案3】:

    此脚本在换行后检测到第一个孩子并向其添加一个类 'first'。

    这是 SCSS:

    .blog-category {
        width: 80% !important;
        margin: auto;
        white-space: normal;
        text-align: center !important;
        word-spacing: 1.5em;
    
        small {white-space: nowrap; display: inline-block;}
        small a {text-decoration: none;}
        small a::before {
            content: "| ";
            white-space: nowrap;
        }
    
        small:first-child a::before, small.first a::before {
            color: rgba(0,0,0,0);
        }
    }
    

    这是 jQuery:

    $(window).on("resize", (function() {
      $('.blog-category small').removeClass('first');
      var top;
      $('.blog-category').children().each(function() {
        var $this = $(this),
            _top = $this.position().top;
    
        if (top === undefined) {
            top = _top;
        } else if (top < _top) {
            top = _top;
            $this.addClass('first');
        }
      });
    }));
    

    带有工作演示:https://codepen.io/anon/pen/xPZeOE

    【讨论】:

    • 感谢您的帮助。但问题是我担心有错误。请转到您的演示链接并将您的浏览器窗口宽度设置为 760 像素、655 像素等。您可以看到最后一部分有分隔符。当然,它第一次工作,但我认为offset().top 中存在某种错误。
    • 我没有看到错误(在 Firefox 中)。什么意思?
    • 啊,找到了! Chrome CSS 默认值...我已经更新了演示。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多