今天给博客的代码块添加了行号,这对于jekyll来说很简单,只需要在指定代码语法高亮时添加linenos属性就好了。

但是如何使用CSS来实现呢?

因为整个代码块只是一行一行的文本,所以我们是无法使用CSS针对每一行代码添加样式的。

所以首先我们需要使用JavaScript把代码块中的每一行包裹在一个元素中,下面的代码将每一行代码包裹在一个span元素中,并且添加了类code-line

1
2
3
4
5
6
7
8
9
10
11
12
13
(function() {
  'use strict';

  const codeBlocks = document.querySelectorAll('pre.has-line-num code');

  Array.prototype.forEach.call(codeBlocks, (codeBlock) => {
    codeBlock.innerHTML = codeBlock.textContent
       .trim()
      .replace(/^/, '<span class="code-line">')
      .replace(/\n/g, '</span>\n<span class="code-line">')
      .replace(/$/, '</span>');
  });
})();

现在就可以针对每一行代码添加样式了。

要添加行号,我们需要使用counter-resetcounter-increment两个CSS属性,而且它们的浏览器支持还不错。(因为它们是在CSS2.0规范中添加的。)

counter-reset和counter-increment的浏览器兼容性

counter-reset属性用于初始化一个计数器,接受一个计数器名和可选的计数器初始值作为值。默认的计数器初始值为1。

counter-increment属性用于改变一个计数器,接受一个计数器名和可选的增量作为值。默认的增量为1。

关于counter-resetcounter-increment的更多内容请参考MDN:counter-resetcounter-increment

现在,就来给代码块添加上行号。

1
2
3
4
5
6
7
8
pre code {
  counter-reset: code-line-num;    /* 初始化一个叫code-line-num的计数器 */
}

pre code .code-line:before {
  content: counter(code-line-num);    /* before伪元素以计数器的值为内容 */
  counter-increment: code-line-num;    /* 将伪元素的值增加1 */
}

这时,我们再添加上其他样式就可以了,下面是一个示例。

See the Pen 给代码块添加行号 by xingzhi (@xingzhi) on CodePen.