首页
归档
笔记
树洞
搜索
友言

文章详情

Interesting People Record Interesting.

/ CSS / 文章详情

文字溢出边缘羽化 CSS Mask 实现

Sonder
2021-06-30
4408字
11分钟
浏览 (3.2k)

在很多时候都需要处理文字的溢出,尤其是对单行网格处理时,需要避免文字过长导致容器撑坏的情况。一般会固定文字最大宽度和 overflow: hidden; text-overflow: ellipsis 让溢出的文字显示成 ...。但是现在可以用 CSS 的 mark 属性,让溢出的文字边缘羽化。

如图 Chrome 的 tab。
image.png
首先看看 mark-image 的兼容性。

image.png

基本上都支持,需要注意的是我使用的 Chrome 85,还在试验性阶段,需要加上前缀 -webkit-

mask-imagebackground-image 的值一样,和蒙版一样,黑色的显示,透明的不显示。我们可以很简单的用 linear-gradient 完成边缘羽化效果。

我们来模仿一个 Chrome Tab 的样式。首先建立一个骨架。

复制代码
<div class="tab-wrap">
 <div class="tab">
   <span class="tab-text cursor"
     >一个标题很长的标签 一个标题很长的标签 一个标题很长的标签
     一个标题很长的标签</span
   >
 </div>
 <div class="close cursor">×</div>
</div>

确定好外层容器的宽高后,可以对 span 的父元素设置 mask

复制代码
.tab-wrap .tab {
 width: 100%;
 overflow: hidden;
 -webkit-mask-image: linear-gradient(
   to right,
   rgba(0, 0, 0, 1) calc(100% - 2em),
   transparent
 );
 mask-image: linear-gradient(
   to right,
   rgba(0, 0, 0, 1) calc(100% - 2em),
   transparent
 );
}
.tab .tab-text {
 white-space: nowrap;
}

最后再加亿点点小细节,大功告成啦。

image.png

当然啦,如果遇到不支持的浏览器就显示直接截断的效果,很不好看,我们还想要让他显示 ...,那么可以用 @supports 查询,是否支持这个属性,如果支持才使用,不支持就使用 text-overflow: ellipsis;

修改一下,span 的父级样式。

复制代码
.tab-wrap .tab {
 width: 100%;
 overflow: hidden;
 text-overflow: ellipsis;
}
@supports (-webkit-mask-image: inherit) or (mask-image: inherit) {
 .tab-wrap .tab {
   text-overflow: clip;
   -webkit-mask-image: linear-gradient(
     to right,
     rgba(0, 0, 0, 1) calc(100% - 2em),
     transparent
   );
   mask-image: linear-gradient(
     to right,
     rgba(0, 0, 0, 1) calc(100% - 2em),
     transparent
   );
 }
}

完整代码如下:

复制代码
<html lang="en">
 <head>
   <meta charset="UTF-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title>CSS Mask Chrome Tab</title>
 </head>
 <style>
   html,
   body {
     margin: 0;
     padding: 0;
   }
   .rect {
     height: 10px;
     width: 100vw;
     background-image: linear-gradient(to right, #000 80%, #fff);
   }
   .mask {
     -webkit-mask-image: linear-gradient(
       to right,
       rgba(0, 0, 0, 1) 80%,
       transparent
     );
     mask-image: linear-gradient(to right, rgba(0, 0, 0, 1) 80%, transparent);
   }
   html {
     font-size: 14px;
     line-height: 3;
     font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
       Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
   }
   .tab-wrap {
     padding: 0 2em 0 1em;
     position: relative;
     width: 300px;
     /* height: 12px; */
     border-radius: 6px 6px 0 0;
     background-color: #333333;
     overflow: hidden;
     display: flex;
     justify-content: center;
     align-items: center;
     color: rgba(255, 255, 255, 0.8);
     display: inline-block;
   }
   .tab-wrap .tab {
     width: 100%;
     overflow: hidden;
     text-overflow: ellipsis;
   }
   .tab .tab-text {
     white-space: nowrap;
   }
   .tab-wrap .close {
     position: absolute;
     right: 0;
     width: 2em;
     top: 0;
     height: 100%;
     display: flex;
     align-items: center;
     justify-content: center;
   }
   .cursor {
     user-select: none;
     cursor: default;
   }
   @supports (-webkit-mask-image: inherit) or (mask-image: inherit) {
     .tab-wrap .tab {
       text-overflow: clip;
       -webkit-mask-image: linear-gradient(
         to right,
         rgba(0, 0, 0, 1) calc(100% - 2em),
         transparent
       );
       mask-image: linear-gradient(
         to right,
         rgba(0, 0, 0, 1) calc(100% - 2em),
         transparent
       );
     }
   }
 </style>
 <body>
   <div class="tab-wrap">
     <div class="tab">
       <span class="tab-text cursor"
         >一个标题很长的标签 一个标题很长的标签 一个标题很长的标签
         一个标题很长的标签</span
       >
     </div>
     <div class="close cursor">×</div>
   </div>

   <div class="tab-wrap">
     <div class="tab">
       <span class="tab-text cursor">一个标签</span>
     </div>
     <div class="close cursor">×</div>
   </div>
 </body>
</html>

转自:https://innei.ren/posts/programming/css-mask-text-overflow

下一篇 / 加载字体的方法

🎯 相关文章

💡 推荐文章

🕵️‍♂️ 评论 (0)