纯 CSS 实现文字换行环绕效果

纯 CSS 实现文字换行环绕效果

⌛ 三年前。。。

🧔‍♂️ 一同事问我:"你说用 css 能不能直接实现这个效果,不想用 js 写,好麻烦啊"

我回答道:"应该不行吧,好像没什么好用的方法。。。"

✅ 现在,三年之约已到,我终于找到了纯 css 实现的方法

省流,实现代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      p {
        margin: 0;
        padding: 0;
      }
      .text-wrap {
        float: right;
        width: 15px;
        height: 15px;
        shape-outside: content-box;
        background-color: rebeccapurple;
        border: 2px solid black;
        border-radius: 2px;
        margin-top: 20px;
        padding-left: 5px;
        /* padding: 20px; */
      }
      .ellipsis {
        display: -webkit-box;
        -webkit-line-clamp: 2; /* 显示的行数 */
        -webkit-box-orient: vertical;
        overflow: hidden;
        text-overflow: ellipsis;
        line-height: 20px;
      }

      .box {
        width: 400px;
      }
    </style>
  </head>
  <body>
    <div class="box ellipsis">
      <div class="text-wrap"></div>
      <p>
        这是要环绕的文本内容。这是要环绕的文本内容。这是要环绕的文本内容。这是要环绕的文本内容。这是要环绕的文本内容。这是要环绕的文本内容。这是要环绕的文本内容。
      </p>
    </div>
  </body>
</html>

起源

前几天在翻 chrome 的博客时偶然看到了这么一个东西 Initial-letter

Chrome 110 年初登陆,initial-letter属性是一个小而强大的 CSS 功能,它为首字母的位置设置样式。您可以将字母放置在下降或上升状态。该属性接受两个参数:

第一个参数用于将字母放入相应段落的深度,

第二个参数用于将字母从段落上方抬高多少。

css 复制代码
/* Keyword values */
initial-letter: normal;

/* Numeric values */
initial-letter: 1.5; /* Initial letter occupies 1.5 lines */
initial-letter: 3; /* Initial letter occupies 3 lines */
initial-letter: 3 2; /* Initial letter occupies 3 lines and
                           sinks 2 lines */

/* Global values */
initial-letter: inherit;
initial-letter: initial;
initial-letter: revert;
initial-letter: revert-layer;
initial-letter: unset;

您甚至可以将两者结合使用,如下面的演示所示。

于是,回想起了 3 年前的那个问题。能不能用这个属性 + :before + iconfont 来实现呢?

但是,这个属性只能使用于首字母,

于是翻了很多文档,问了下 AI 最终得到了shape-outside这个终极解决方案

要点

shape-outside

shape-outside 的 CSS 属性定义了一个可以是非矩形的形状,相邻的内联内容应围绕该形状进行包装。默认情况下,内联内容包围其边距框; shape-outside 提供了一种自定义此包装的方法,可以将文本包装在复杂对象周围而不是简单的框中。

值:content-box

定义一个由内容区域的外边缘封闭形成的形状(译者:表述的不太好,就是被 padding 包裹的区域,在 chrome 控制台中的盒子模型图中的蓝色区域。)。每一个角的弧度取 0 或 border-radius - border-width - padding 中的较大值。

其它的值:circle、ellipse、inset、polygon、url、auto 我们这次用不到。

但是使用 url 属性也应该是可以做到的,因为会识别到 alpha 通道。

兼容性

可以看到兼容性还不错

总结

  1. shape-outside 是一个非常实用的属性,可以实现一些比较复杂的文本环绕效果。
  2. shape-outside 的兼容性比较好,不是特殊情况应该完全适用。
相关推荐
恋猫de小郭7 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅14 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606114 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了14 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅14 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅15 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅15 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment15 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅16 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊16 小时前
jwt介绍
前端