Search code examples
htmlcssline-numbers

show linenumber on code blocks using only css


I'm new to css, i want to use the css to showing line numbers for code blocks, but never got it to work correctly.

Below is the complete source of the html and css:

    .markdown-body hr:after, .markdown-body hr:before {
        content:"";
        display: table;
    }
    .markdown-body .anchor:focus, .markdown-body a:active, .markdown-body a:hover {
        outline: 0;
    }
    @font-face {
        font-family: octicons-anchor;
    }
    .readme {
        border: 1px solid #ddd;
        border-radius: 3px;
        display: table;
        margin: 20px auto;
        padding: 30px;
        width: 790px;
    }
    
    .markdown-body code, .markdown-body pre {
        font: 15px Consolas, "Liberation Mono", Menlo, Courier, monospace;
    }
    
    .markdown-body pre>code {
        background: 0 0;
        border: 0;
        font-size: 100%;
        margin: 0;
        padding: 0;
        white-space: pre;
        word-break: normal;
    }
    .markdown-body .highlight {
        color: #5e6e5e;
    }
    .markdown-body .highlight pre, .markdown-body pre {
        background-color: #fbebd4;
        border-radius: 3px;
        font-size: 85%;
        line-height: 1.45;
        overflow: auto;
        padding: 16px;
    }
    
    .markdown-body pre code {
        background-color: transparent;
        line-height: 0.5;
    }
    .markdown-body pre code:after, .markdown-body pre code:before {
        content: normal;
    }
    
    pre.line-numbers {
      position: relative;
       line-height: 0;
      width: em(440);
      margin: 4em auto;
      padding: 0.5em;
      border-radius: .25em;
      counter-reset: linenumber;
    }
    
    pre.line-numbers > code {
      position: relative;
      white-space: inherit;
    }
    
    .line-numbers .line-numbers-rows {
      position: absolute;
      top: 0;
      left: -3.8em;
      width: 4em;
      letter-spacing: -1px;
    
      pointer-events: none;
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
    }
    
    .line-numbers-rows > span {
      pointer-events: none;
      display:block;
      counter-increment: linenumber;
    }
    
    .line-numbers-rows > span:before {
      content: counter(linenumber);
      color: #999;
      display: block;
      border-right: 1px solid #ddd;
      padding-right: 0.8em;
      text-align: right;
    }
 <!DOCTYPE html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<body><div class="readme"><article class="markdown-body"><h1>File <code>doc.my</code></h1>
    </br>
    <h3 id="requestmain">RequestMain</h3>
    <p>RequestMain class. It is the user/client code.</p>
    <div class="highlight highlight-source-swift"><pre class="line-numbers"><code class=" language-js"><span class="pl-k">class</span> <span class="pl-en">RequestMain</span> {
      <span class="pl-k">static</span> fn <span class="pl-c1">main</span>() {
        request <span class="pl-k">=</span> new <span class="pl-c1">Request</span>()
        request.<span class="pl-smi">FirstName</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Haifeng123456789<span class="pl-pds">"</span></span>
        request.<span class="pl-smi">LastName</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Huang     <span class="pl-pds">"</span></span>
        request.<span class="pl-smi">Dept</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Department of Labors<span class="pl-pds">"</span></span>
        RequestHandler.<span class="pl-c1">handle</span>(request)
      }
    }
    <span class="line-numbers-rows">
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
        </span>
      </code>
    </pre></div>

The problem is the line-number is not aligned with the code. I know that the problem is in the css code, but just don't know how to solve it.

Does anyone out there help me?


Solution

  • I personally would have structured the line numbers differently in the HTML, but keeping with what you have now;

    One thing you could do is change the line-height on .markdown-body pre code to 0; Then on .line-numbers-rows > span:before set your line-height to 19px;

    Updated code:

    .markdown-body hr:after,
    .markdown-body hr:before {
        content: "";
        display: table;
    }
    .markdown-body .anchor:focus,
    .markdown-body a:active,
    .markdown-body a:hover {
        outline: 0;
    }
    @font-face {
        font-family: octicons-anchor;
    }
    .readme {
        border: 1px solid #ddd;
        border-radius: 3px;
        display: table;
        margin: 20px auto;
        padding: 30px;
        width: 790px;
    }
    
    .markdown-body code,
    .markdown-body pre {
        font: 15px Consolas, "Liberation Mono", Menlo, Courier, monospace;
    }
    
    .markdown-body pre > code {
        background: 0 0;
        border: 0;
        font-size: 100%;
        margin: 0;
        padding: 0;
        white-space: pre;
        word-break: normal;
    }
    .markdown-body .highlight {
        color: #5e6e5e;
    }
    .markdown-body .highlight pre,
    .markdown-body pre {
        background-color: #fbebd4;
        border-radius: 3px;
        font-size: 85%;
        line-height: 1.45;
        overflow: auto;
        padding: 16px 30px;
    }
    
    .markdown-body pre code {
        background-color: transparent;
        line-height: 0;
    }
    .markdown-body pre code:after,
    .markdown-body pre code:before {
        content: normal;
    }
    
    pre.line-numbers {
        position: relative;
        line-height: 0;
        width: em(440);
        margin: 4em auto;
        padding: 0.5em;
        border-radius: 0.25em;
        counter-reset: linenumber;
    }
    
    pre.line-numbers > code {
        position: relative;
        white-space: inherit;
    }
    
    .line-numbers .line-numbers-rows {
        position: absolute;
        top: 0;
        left: -4.5em;
        width: 4em;
        letter-spacing: -1px;
    
        pointer-events: none;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    
    .line-numbers-rows > span {
        pointer-events: none;
        display: block;
        counter-increment: linenumber;
    }
    
    .line-numbers-rows > span:before {
        content: counter(linenumber);
        color: #999;
        display: block;
        border-right: 1px solid #ddd;
        padding-right: 0.8em;
        text-align: right;
        line-height: 19px;
    }
    <div class="readme">
        <article class="markdown-body">
            <h1>File <code>doc.my</code></h1>
            </br><h3 id="requestmain">
        RequestMain</h3>
            <p>RequestMain class. It is the user/client code.</p>
            <div class="highlight highlight-source-swift">
                <pre class="line-numbers"><code class=" language-js"><span class="pl-k">class</span> <span class="pl-en">RequestMain</span> {
      <span class="pl-k">static</span> fn <span class="pl-c1">main</span>() {
        request <span class="pl-k">=</span> new <span class="pl-c1">Request</span>()
        request.<span class="pl-smi">FirstName</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Haifeng123456789<span class="pl-pds">"</span></span>
        request.<span class="pl-smi">LastName</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Huang     <span class="pl-pds">"</span></span>
        request.<span class="pl-smi">Dept</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>Department of Labors<span class="pl-pds">"</span></span>
        RequestHandler.<span class="pl-c1">handle</span>(request)
      }
    }
    <span class="line-numbers-rows">
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
        </span>
      </code>
    </pre>
            </div>