在这里插入图片描述

小白前端速成:CSS3文本样式属性全搞定(附避坑指南)

——“哥,字又歪了!”
——“别急,先把 line-height 调成 1.5,再请我喝杯奶茶。”

这篇文章的诞生,源于某个深夜,测试小姐姐在群里甩了一张截图:
“为什么这段文字在 iPhone 12 上像被雷劈过一样,行高忽大忽小,英文还溢出?”
我盯着屏幕,仿佛听见 CSS 在耳边冷笑:
“兄弟,你连用 word-breakoverflow-wrap 都分不清,怪我咯?”

于是就有了这篇——不装、不端、不拽英文术语,纯当在死党群里语音转文字。
咱们把 CSS3 里“天天用、总记混、一踩就炸”的文本样式属性,一次性唠明白。
代码管饱,注释管够,坑点直接标红。
看完还不懂?那就把文章转发到群里,让同事请你喝喜茶,就当交学费。


先整点能跑的代码,热热场子

“ talk is cheap ”的老规矩,先甩一个万能文本样式片段,以后每开新页面直接复制粘贴,再按需删改,省得来回翻 MDN。

/* 万能文本初始化 - 2026 年还能继续抄 */
* {
  /* 1. 先让盒子说话算话 */
  box-sizing: border-box;
}
body {
  /* 2. 系统字体栈,又快又省流量 */
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
    "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji",
    "Segoe UI Emoji";
  /* 3. 基础字号 16px 是底线,别瞎缩,小心 40 岁产品经理放大网页 */
  font-size: 16px;
  /* 4. 1.5 倍行高,读屏舒适区 */
  line-height: 1.5;
  /* 5. 抗锯齿,让字在 mac 别发虚 */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* 6. 自动换行,英文单词断头台 */
  overflow-wrap: break-word;
}

上面这段,放项目全局样式里,能屏蔽 80% 的“字怎么又出去了”的 bug。
剩下的 20%,咱们挨个属性拆弹。


font-weight:别只会写 bold,数字才是亲儿子

很多人以为 font-weight 只有 normalbold 俩值,其实人家是正儿八经的九级阶梯:100~900。
设计师给的 500 semibold,你要是直接写成 bold,人家分分钟在 Figma 里把你头像 P 成绿头苍蝇。

/* 举个真·电商标题例子 */
.price {
  /*  semibold 对应 600,别手抖写成 500  */
  font-weight: 600;
  color: #ff4142;
  /*  再配个斜体,促销那味儿有了  */
  font-style: italic;
}

避坑

  1. 中文网页想用到 100~300 的细体,必须确保字体文件里有对应字重,否则浏览器直接回退到 normal,看着像“伪瘦身”。
  2. 安卓低端机对 font-weight: 500 以下支持拉胯,表现跟 400 没差,提前跟 UI 说好,别死磕。

line-height:1.5 和 150% 真不是一个爹

先上代码,再讲故事:

.box {
  font-size: 20px;
  line-height: 1.5;   /* 无单位,子元素继承的是“比例” */
}
.child {
  font-size: 40px;    /* 子元素变大,行高 = 40 * 1.5 = 60px */
}
.box-percent {
  font-size: 20px;
  line-height: 150%;  /* 带单位,先算成 30px,再继承给子元素 */
}
.child-percent {
  font-size: 40px;    /* 子元素行高仍是 30px,直接挤爆 */
}

一句话总结:无单位是“活的”,带单位是“死的”
做多级嵌套列表、组件库封装时,想让孩子自由呼吸,就写无单位;想一把锁死,写 px 或 %。


text-align-last:冷门却是“两端对齐”大救星

产品经理:“标题要两端对齐,大气!”
你:text-align: justify; 一写,发现最后一行纹丝不动,还是左对齐,瞬间尴尬。

/* 让最后一行也两端对齐,关键在这行 */
.justify-fix {
  text-align: justify;
  text-align-last: justify;   /*  IE 9+ 、安卓 4.4+ 都认  */
}

如果还要兼容 IE8?那就用“伪元素垫片”老套路:

.justify-legacy:after {
  content: "";
  display: inline-block;
  width: 100%;
  height: 0;
  overflow: hidden;
}

white-space:空格、换行、不折行的总闸

前端群里隔三岔五就有人问:“为啥复制粘贴的代码,前面老有空格?”
99% 是 white-space 没搞清。
把下面的表格背下来,下次面试能救命:

换行符空格自动折行场景
normal合并普通段落
pre保留代码块
nowrap合并单行省略
pre-wrap保留微信聊天气泡
pre-line合并用户评论
/* 代码高亮块,必备 pre-wrap,既能保留缩进,又能自动换行 */
pre.code {
  white-space: pre-wrap;
  word-break: break-all;   /*  英文路径太长时砍断  */
}

text-decoration-skip-ink:下划线别再戳 g 的屁股了

下划线穿过小写 g、j、y 的时候,视觉上就像一把刀,看着难受。
CSS3 直接给了“避让”方案:

a {
  text-decoration: underline;
  text-decoration-skip-ink: auto; /* 自动跳过下行字母 */
  text-underline-offset: 0.2em;   /* 再往下挪一丢丢,呼吸感 */
}

可惜 IE 全家桶不支持,老项目记得加 @supports 判断:

@supports (text-decoration-skip-ink: auto) {
  a {
    text-decoration-skip-ink: auto;
  }
}

text-shadow:低端安卓消失术

text-shadow 看着香,一上低端机就翻车——原因:

  1. 部分 4.4 以下 WebView 把 shadow 当透明,直接不画;
  2. 阴影颜色如果用了 rgba 透明值,GPU 合成层会掉帧。

保命写法

.title-shadow {
  /* 先写一层实体色兜底,再叠一层好看但可消失的 */
  text-shadow:
    0 1px 0 #000,
    0 2px 4px rgba(0,0,0,.3);
}

上线前,拿微信 X5 内核 + 小米 6 真机跑一遍,别问我是怎么知道的。


word-break 与 overflow-wrap:英文单词断头台双子星

这俩货经常一起出现,但分工不同:

  • overflow-wrap: break-word —— 只在单词整行放不下的极端情况才拆词;
  • word-break: break-all —— 不管三七二十一,随时拆,连“i”都能单独成行。
/* 商品标题,两行省略,英文别溢出 */
.goods-title {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: break-word;   /*  优先用温柔的  */
  word-break: normal;          /*  别把单词拆太碎  */
}

如果后台接口偶尔返回“超长德文”,那就升级成:

word-break: break-word; /* 旧的非标准写法,但安卓 4.4 认 */

实战组合拳 1:验证码输入框,四位分开高亮

UI 要求:四个框,输入一位自动跳下一个,字体大粗红,还要居中。
直接上 flex + 大数字体 + letter-spacing:

<div class="sms-code">
  <input maxlength="1">
  <input maxlength="1">
  <input maxlength="1">
  <input maxlength="1">
</div>
.sms-code {
  display: flex;
  gap: 8px;
}
.sms-code input {
  width: 48px;
  height: 48px;
  font-size: 28px;
  font-weight: 700;
  color: #ff4142;
  text-align: center;
  line-height: 48px;   /*  让光标垂直居中  */
  border: 1px solid #ddd;
  border-radius: 4px;
}
/*  去掉选中时的蓝色背景  */
.sms-code input:focus {
  outline: none;
  border-color: #ff4142;
}

JS 自动跳转逻辑一行:

document.querySelectorAll('.sms-code input').forEach((el, idx, arr) => {
  el.addEventListener('input', e => {
    if (e.target.value) arr[idx + 1]?.focus();
  });
});

实战组合拳 2:商品标题,两行多余省略,鼠标悬浮看全文

.multi-ellipsis {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;   /*  兜底  */
  line-height: 1.4;          /*  行高太小,省略号会被截  */
  cursor: pointer;
}
/*  悬浮时展开  */
.multi-ellipsis:hover {
  display: block;
  -webkit-line-clamp: unset;
}

:如果父容器用了 overflow: hidden,悬浮展开时依旧会被裁,记得把 overflow 移到更外层,或者加 title 属性做兜底。


实战组合拳 3:移动端新闻列表,时间戳右对齐,标题自适应

<li class="news-item">
  <span class="title">震惊!CSS 居然能这样写</span>
  <time class="time">03-21</time>
</li>
.news-item {
  display: flex;
  align-items: baseline;   /*  文字基线对齐,视觉更整齐  */
  font-size: 15px;
  line-height: 1.4;
}
.title {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  margin-right: 8px;
}
.time {
  color: #999;
  font-size: 13px;
  white-space: nowrap;     /*  禁止时间换行  */
}

排查口诀:字糊、字歪、字出去,三步走

  1. 字糊

    • 先开 devtools → Rendering → 查看图层是否 GPU 加速;
    • 关一次 -webkit-font-smoothing 对比,排除抗锯齿策略;
    • 再确认是不是设计师把 PingFang-SC-Light 当 bold 用,字体文件没加载。
  2. 字歪

    • 看行高继承,是不是父级写了固定 px;
    • 看 vertical-align,图片或 inline-block 把基线撑歪;
    • 看是否用了 transform: scale() 放大,导致像素不对齐。
  3. 字出去

    • 先检查 white-space: nowrapoverflow: hidden 是否共存;
    • 再看英文,切到 word-break: break-all 测试;
    • 最后看是不是 padding 把可用宽度挤没了。

彩蛋:几个让同事喊“卧槽”的小骚操作

  1. text-indent 隐藏 placeholder
    想做“聚焦时 placeholder 位移”效果,又不想让 placeholder 占空间:
input {
  text-indent: -500px;
  transition: text-indent .3s;
}
input:focus {
  text-indent: 0;
}
  1. currentColor 图标联动
    图标颜色跟随文字,改一处即可:
.icon-arrow {
  fill: currentColor;   /*  SVG 图标  */
}
.btn-primary {
  color: #ff4142;
}
.btn-primary:hover {
  color: blue;
}
  1. -webkit-text-stroke 描边字,装逼利器
.stroke-title {
  font-size: 48px;
  color: transparent;
  -webkit-text-stroke: 1px #000;
  text-shadow: 3px 3px 0 #ff4142;   /*  双层装逼  */
}

收个尾:别把文本样式当“边角料”

很多初学者觉得文本样式不如动画、布局高大上,其实线上 80% 的 bug 都跟字有关:
行高挤爆、英文溢出、省略号失踪、字体发虚……
你把这篇文章提到的属性写进小抄,贴到工位,一周之内,UI 再也挑不出你像素级的毛病
下次再听到“字有点糊”,别慌,先喝一口奶茶,再甩一句:
“哥,我 text-rendering 都 optimizeLegibility 了,要不再换个显示器?”

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》 持续更新中~结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》 持续更新中~AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》 《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。
通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》持续更新中~Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》持续更新中~SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》持续更新中~算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》 持续更新中~基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

在这里插入图片描述

更多推荐