Targeting text nodes with CSS

后端 未结 2 525
有刺的猬
有刺的猬 2020-12-02 02:03

I\'m working on the CSS for a container object. I have it mostly working. Specifically, I\'m looking at test case 1, 2 and 3. They all have text nodes. Is there a way to tre

2条回答
  •  猫巷女王i
    2020-12-02 02:41

    In this case, I'd be tempted to place each text node inside a which is the classic, non-semantic phrasing element.

    (See: http://www.w3.org/TR/html-markup/span.html)

    You can then style the span in a similar manner to the way you have styled the p and the code.

    If you choose this approach, you have two choices. You can either:

    1) Write the spans directly into the markup:

    code, p, quote, span {
      display: block;
      position: relative;
      margin: 0;
      padding: 1em;
      border: 1px solid black;
      box-sizing: border-box;
    }
    
    p {background-color: #0df;}
    code {background-color: #ccc;}
    span {background-color: #fff;}
    
    
    .container {
      display: block;
      position: relative;
      margin-right: 0;
      margin-left: 0;
      margin-top: 1.5em;
      margin-bottom: 1.5em;
      padding: 0.5rem;
      border: 1px solid black;
      box-sizing: border-box;
      border-radius: 10px;
      box-shadow: none;
    }
    
    .container :first-child {
      border-top-left-radius: 10px;
      border-top-right-radius: 10px;
      border-bottom-left-radius: 0;
      border-bottom-right-radius: 0;
      border-width: 0;
      margin-top: -0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }
    .container >:last-child {
      border-top-left-radius: 0;
      border-top-right-radius: 0;
      border-bottom-left-radius: 10px;
      border-bottom-right-radius: 10px;
      border-bottom-width: 0;
      border-left-width: 0;
      border-right-width: 0;
      margin-top: 0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }
    .container >:not(:first-child):not(:last-child) {
      margin-left: -0.5rem;
      margin-right: -0.5rem;
      margin-bottom: -0.5rem;
      border-right-width: 0;
      border-left-width: 0;
      border-bottom-width: 0;
    }
    .container >:only-child {
      border-radius: 10px;
      border-width: 0;
      margin-top: -0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }

    first child

    text last child

    first child

    text
    text

    last child

    Or, if you prefer not to have spans included in your markup, you can

    2) Add the span elements dynamically, after the page loads:

    var containers = document.getElementsByClassName('container');
    
    for (var i = 0; i < containers.length; i++) {
        for (var j = 0; j < containers[i].childNodes.length; j++) {
            if (containers[i].childNodes[j].nodeName !== '#text') {continue;} /* skips all nodes which aren't text nodes */
            if (/^[\s\n]*$/.test(containers[i].childNodes[j].textContent)) {continue;} /* skips all text nodes containing only whitespace and newlines */
    
            var text = containers[i].childNodes[j];
            var span = document.createElement('span');
            span.appendChild(text);
            span.textContent = span.textContent.trim();
            containers[i].insertBefore(span,containers[i].childNodes[j]);
        }
    }
    code, p, quote, span {
      display: block;
      position: relative;
      margin: 0;
      padding: 1em;
      border: 1px solid black;
      box-sizing: border-box;
    }
    
    p {background-color: #0df;}
    code {background-color: #ccc;}
    span {background-color: #fff;}
    
    
    .container {
      display: block;
      position: relative;
      margin-right: 0;
      margin-left: 0;
      margin-top: 1.5em;
      margin-bottom: 1.5em;
      padding: 0.5rem;
      border: 1px solid black;
      box-sizing: border-box;
      border-radius: 10px;
      box-shadow: none;
    }
    
    .container :first-child {
      border-top-left-radius: 10px;
      border-top-right-radius: 10px;
      border-bottom-left-radius: 0;
      border-bottom-right-radius: 0;
      border-width: 0;
      margin-top: -0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }
    .container >:last-child {
      border-top-left-radius: 0;
      border-top-right-radius: 0;
      border-bottom-left-radius: 10px;
      border-bottom-right-radius: 10px;
      border-bottom-width: 0;
      border-left-width: 0;
      border-right-width: 0;
      margin-top: 0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }
    .container >:not(:first-child):not(:last-child) {
      margin-left: -0.5rem;
      margin-right: -0.5rem;
      margin-bottom: -0.5rem;
      border-right-width: 0;
      border-left-width: 0;
      border-bottom-width: 0;
    }
    .container >:only-child {
      border-radius: 10px;
      border-width: 0;
      margin-top: -0.5rem;
      margin-bottom: -0.5rem;
      margin-left: -0.5rem;
      margin-right: -0.5rem;
    }

    first child

    text last child

    first child

    text
    text

    last child

提交回复
热议问题