搜索

首页  >  问答  >  正文

仅在必要时显示连字符? (软连字符不会切断它)

<p>是否可以在 CSS 中使用连字符或软连字符,这样就不会不必要地渲染连字符?</p> <p>我的目标是尽可能保留原始文本并打破任何单词,除非绝对关键,因为它们太长而无法适应容器宽度。</p> <h3>我的具体案例</h3> <p>我想以这样的方式渲染文本“Hi Superman”:</p> <p>如果“Superman”这个词太长而无法放入容器中,我想以某种方式将其连字符,例如:</p> <pre class="brush:php;toolbar:false;">Hi Super- man</pre> <p>但是,如果“Superman”这个词可以放入容器中,则必须在不使用连字符的情况下呈现它</p> <pre class="brush:php;toolbar:false;">Hi Superman</pre> <p>如果上述情况是可能的(“Superman”可以不加连字符),则添加<em>不必要的连字符</em>是不可接受的:</p> <pre class="brush:php;toolbar:false;">Hi Super- man</pre> <p>我可以根据需要更改 HTML。我可以以有意义的方式插入连字符(只要每个连字符之间超过 3 个字母就可以。“Superma-n”永远不会好)</p> <h3>我尝试过的</h3> <p>我认为软连字符是解决方案。所以我用了:<code>Hi Super­man</code></p> <p>但我发现这会导致上面显示的“不必要的连字符”的不可接受的情况。</p> <h3>显示失败的代码片段:</h3> <p> <pre class="snippet-code-css lang-css prettyprint-override"><code>body { margin-left: 30px; } div { border: solid 1px black; } .wide { border: solid 1px blue; width: 500px; } .narrow { border: solid 1px red; width: 360px; } h2 { font-family: 'Courier New'; font-weight: 400; font-size: 87px; } code { background-color: #eee; }</code></pre> <pre class="snippet-code-html lang-html prettyprint-override"><code><p> <code>Super&amp;shy;man</code> looks good in really narrow containers where the full word "Superman" would not fit</p> <p> <div class="narrow"><h2>Hi Super&shy;man</h2></div> <p>But in this case the word "Superman" would fit unhypenhated on the second row. But the damn CSS decides to add hyphens anyway. Unacceptable in my case! Again, this uses the same code as the previous example <code>Super&amp;shy;man</code></p> <div class="wide"><h2>Hi Super&shy;man</h2></div> <p>I even tried adding a wordbreak tag before "Superman", like this <code>Hi <wbr> Super&amp;shy;man</code> but it does not help</p> <p> </p> <div class="wide"><h2>Hi <wbr>Super&shy;man</h2></div></code></pre> </p> <p>我可以仅使用 CSS 来解决上面的示例吗? (尝试了不同的<code>word-break</code>属性,但没有成功)</p> <p><strong>我的猜测</strong>是,由于 CSS 的性质,仅使用简单的 HTML 和 CSS 是不可能解决这个问题的。我假设 CSS 只是逐行解析文本,它永远无法知道某个单词是否“更适合”下一行文本。如果找到连字符,它将尝试在当前文本行中容纳最大数量的字符。</p> <p>我想仅使用 HTML 和 CSS 来解决这个问题,或者根本不使用。</p> <p>最好是:</p> <ul> <li><p>不使用 JavaScript 进行文本解析。</p> </li> <li><p>我不想根据 div 的宽度以及我认为文本是否需要连字符来为每个 div 设置不同的 CSS 属性。</p> </li> <li><p>不想在我的文字周围添加包装</p> </li> <li><p>没有自动连字符会导致可笑的连字符,例如“Superma-n”(但是在紧要关头,只要每个连字符之间有 3 个字符,我就可以使用自动连字符。例如“Sup-erman” ”)</p> </li> </ul></p>
P粉225961749P粉225961749486 天前632

全部回复(2)我来回复

  • P粉701491897

    P粉7014918972023-08-26 10:07:02

    CSS 3 包含一个“hyphens”属性,可根据指定的 lang 属性设置连字符。但这只是一个工作草案,所以支持有点< a href="https://caniuse.com/#search=hyphens" rel="nofollow noreferrer">还没有。

    您可以将其设置为

    • 无,因此不会显示连字符
    • 手动,因此它只会在声明特殊字符 ­ 的地方断词,或者
    • auto,它会根据本地化情况自动在需要的地方添加连字符。

    在 Firefox、Edge 甚至 IE 中都可以正常工作,但主要问题是 webkit 不支持“auto”值。除了在 Mac 和 Android 上,这是他们唯一接受的值。是的,这是一种奇怪的bug

    这是一个示例,如果您运行的是 windows / linux,请务必检查 Firefox 和 chrome 之间的区别。

    p { 
      width: 55px;
      border: 1px solid black;
     }
    p.none {
      -webkit-hyphens: none;
      -ms-hyphens: none;
      hyphens: none;
    }
    p.manual {
      -webkit-hyphens: manual;
      -ms-hyphens: manual;
      hyphens: manual;
    }
    p.auto {
      -webkit-hyphens: auto;
      -ms-hyphens: auto;
      hyphens: auto;
    }
    <ul>
        <li><code>auto</code>: hyphen where the algorithm is deciding (if needed)
        <p lang="en" class="auto">An extremelyasdasd long English word</p>
      </li> 
      <li><code>manual</code>: hyphen only at &amp;hyphen; or &amp;shy; (if needed)
        <p lang="en" class="manual">An extreme&shy;lyasd long English word</p>
      </li>
      <li><code>none</code>: no hyphen; overflow if needed
        <p lang="en" class="none">An extreme&shy;lyasd long English word</p>
      </li>
    </ul>

    针对 webkit 缺乏“自动”支持的常见解决方法是将 hyphens:auto 与 webkit 的 work-break:break-all 一起使用,因此文本将在支持它的浏览器上用连字符连接并且在 webkit 上不使用连字符换行。

    回复
    0
  • P粉950128819

    P粉9501288192023-08-26 00:05:24

    在长单词周围使用带有 display: inline-block 的容器。

    body { 
      margin-left: 30px;
    }
    div {
       border: solid 1px black;
    }
    .wide {
      border: solid 1px blue;
          width: 500px;
    }
    .narrow { 
      border: solid 1px red;
      width: 360px;
    }
     h2 {
       font-family: 'Courier New';
        font-weight: 400;
        font-size: 87px;
      }
    code {
     background-color: #eee;
    }
    
    .unbreakable {display:inline-block}
    <p> <code>Super&amp;shy;man</code> looks good in really narrow containers where the full word "Superman" would not fit</p>
    <p>
    <div class="narrow"><h2>Hi <span class="unbreakable">Super&shy;man</span></h2></div>
    
    <p>And in this case the word "Superman" would fit unhypenhated on the second row.<br/>
    This uses the same code as the previous example</p>
    <div class="wide"><h2>Hi <span class="unbreakable">Super&shy;man</span></h2></div>

    回复
    0
  • 取消回复