【问题标题】:Initial letter and word in jekyll posts and pagesjekyll 帖子和页面中的首字母和单词
【发布时间】:2017-01-15 04:14:53
【问题描述】:

我想在我的 jekyll 博客中设置我的帖子和页面的首字母和首词的样式。像这样的:

我可以使用以下样式和span 标签来实现这个结果:

:not(.post-excerpt) > .initial-word {
  color: #166079;
  font-variant: small-caps;
  font-weight: bold;
}

:not(.post-excerpt) > .initial-word .initial-letter {
  float: left;
  font-size: 3.15em;
  line-height: 0.5;
  margin: 0.225em 0.159em 0 0;
  color: #166079;
  font-weight: normal;
  text-transform: uppercase;
}
<p>
  <span class="initial-word"><span class="initial-letter">L</span>orem</span> ipsum dolor sit amet
</p>

给定一个以介绍文本开头的 jekyll 帖子:

Lorem ipsum dolor sit amet

# Main title of the post

Lorem ipsum dolor sit amet

通过液体代码{{ content }} 在我的布局中可访问的帖子内容将类似于:

<p>Lorem ipsum dolor sit amet</p>

<h1>Main title of the post</h1>

<p>Lorem ipsum dolor sit amet</p>

我想修改帖子内容,添加我的span标签,要求如下:

  • 初始标签必须只添加到介绍中;如果内容不是以 p 标记开头,我不想要它们,我只想要它们在第一段。
  • &lt;span class="initial-word"&gt;标签可以直接在帖子中使用,封装多个单词,像这样:

    <span class="initial-word">Lorem ipsum</span> dolor sit amet
    
    # Main title of the post
    
    Lorem ipsum dolor sit amet`
    

在这种情况下,只应添加&lt;span class="initial-letter"&gt;

我最终得到了这个复杂的帖子代码:

{% assign content_start=content | slice: 0, 3 %}
{% assign tokens=content | split: '<span class="initial-word">' %}
{% assign count=tokens | size %}
{% if content_start == "<p>" or count > 1 %}
  {% if count > 1 %}
    {% assign tokens=tokens[1] | split: "</span>" %}
    {% assign initial_word=tokens[0] %}
  {% else %}
    {% assign initial_word=content | remove_first: "<p>" | truncatewords: 1, "" %}
  {% endif %}
  {% assign initial_letter=initial_word | slice: 0 %}
  {% assign span_letter=initial_letter | prepend: '<span class="initial-letter">' | append: '</span>' %}
  {% assign span_word=initial_word | replace_first: initial_letter, "" | prepend: span_letter %}
  {% unless count > 1 %}
    {% assign span_word=span_word | prepend: '<span class="initial-word">' | append: '</span>' %}
  {% endunless %}
  {% assign content=content | replace_first: initial_word, span_word %}
{% endif %}

还有一个类似但略有不同的页面版本。有人有任何提示以更简单的方式做到这一点吗?我缺少一些魔法过滤器?

【问题讨论】:

    标签: html css jekyll liquid


    【解决方案1】:

    从@IanDevlin的评论开始,我先按照excerpt separator的模型,改了第一个词的显式标记:

    Lorem ipsum<!--first-word--> dolor sit amet
    
    # Main title of the post
    
    Lorem ipsum dolor sit amet
    

    使用::first-letter 选择器,我更改了液体代码以检测第一个符合我要求的p 标记(基本上,我只考虑开始内容的段落):

    {% assign content_start=content | slice: 0, 3 %}
    {% if content_start == '<p>' %}
      {% if content contains '<!--first-word-->' %}
        {% assign content=content | replace_first: '<!--first-word-->', '</span>' %}
      {% else %}
        {% assign first_word=content | remove_first: '<p>' | truncatewords: 1, '' %}
        {% assign span_word=first_word | append: '</span>' %}
        {% assign content=content | replace_first: first_word, span_word %}
      {% endif %}
      {% assign content=content | replace_first: '<p>', '<p class="first-p"><span class="first-word">' %}
    {% endif %}
    

    这会生成以下 html 代码,并带有更新的 css:

    :not(.post-excerpt) > .first-word {
      color: #166079;
      font-variant: small-caps;
      font-weight: bold;
    }
    
    :not(.post-excerpt) > .first-p::first-letter {
      float: left;
      font-size: 3.15em;
      line-height: 0.5;
      margin: 0.159em 0.159em 0 0;
      color: #166079;
      font-weight: normal;
      text-transform: uppercase;
    }
    <p class="first-p">
      <span class="first-word">Lorem ipsum</span> dolor sit amet
    </p>

    【讨论】:

      【解决方案2】:

      不是一个完整的答案,我可能误解了一些东西,但对于第一个字母,我建议使用 :first-letter 选择器而不是将其包装在 span 中。

      对于选择 中的第一段,p:first-of-type 有帮助吗?

      【讨论】:

      • ::first-letter 选择器只能用于块级元素,这与我的初始词不兼容:)
      • 但是你给了我一个想法:我可以在开始的p 标记中添加一个initial-p 类。这将简化问题并允许我使用 ::first-letter
      • 所以我确实误解了一些东西:)
      • p:first-of-type 的问题在于它会选择第一个p 标签,无论该标签是否是内容中的第一个标签。我错了吗?我可以有这样的内容&lt;div class="content"&gt;&lt;h1&gt;Foo&lt;/h1&gt;&lt;p&gt;Bar&lt;/p&gt;&lt;/div&gt;p:first-of-type 会选择 Bar 段落,我不想要,因为前面有标题
      • 这是真的。也许p:first-child 会起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2013-05-26
      相关资源
      最近更新 更多