
新的改变 # 2026前端避坑指南:CSS继承乱成一锅粥?inherit、initial和unset三招教你原地封神
-
- [新的改变 # 2026前端避坑指南:CSS继承乱成一锅粥?inherit、initial和unset三招教你原地封神](# 2026前端避坑指南:CSS继承乱成一锅粥?inherit、initial和unset三招教你原地封神)
- 先给这仨"亲兄弟"排排坐,到底谁是大哥谁是老幺
- 扒一扒CSS继承机制的底裤,为什么有些属性天生就爱"子承父业"
- 深扒代码现场,看看这仨货在实际项目里是怎么兴风作浪的
- 手把手教你写Demo,别光听理论,直接上代码看效果
- 是神器还是鸡肋?咱们关起门来聊聊它们的真心话大冒险
- 遇到样式不生效别急着砸键盘,这套"望闻问切"法救过我的命
- 老前端私藏的几个骚操作,让你写CSS像在开挂
-
- [技巧一:unset配合CSS Variables做主题切换](#技巧一:unset配合CSS Variables做主题切换)
- 技巧二:initial实现真正的样式隔离
- 技巧三:面试装逼顺口溜
- 不为人知的秘密:利用inherit的"副作用"省代码
- 行了,干货差不多倒完了,再啰嗦就要被群主踢了
- 功能快捷键
- 合理的创建标题,有助于目录的生成
- 如何改变文本的样式
- 插入链接与图片
- 如何插入一段漂亮的代码片
- 生成一个适合你的列表
- 创建一个表格
- 创建一个自定义列表
- 如何创建一个注脚
- 注释也是必不可少的
- KaTeX数学公式
- 新的甘特图功能,丰富你的文章
- UML图表
- 流程图
- FLowchart流程图
- 导出与导入
新的改变 # 2026前端避坑指南:CSS继承乱成一锅粥?inherit、initial和unset三招教你原地封神
说实话,我刚开始写CSS那会儿,觉得这东西不就是"选个元素、涂个颜色"嘛,能有多难?结果现实给我上了一课------当你在一个大型项目里,面对层层叠叠的样式覆盖、祖传代码里的!important军备竞赛,还有那个永远搞不清楚为什么子元素会突然变成紫色的诡异现象时,你就会明白:CSS的水,深得很。
今天咱们不聊Flexbox布局,也不聊Grid那些花里胡哨的新特性,就专门死磕三个看起来人畜无害、实则能让你在调试时少掉一半头发的关键字:inherit、initial、还有unset。这三个货色,就像是CSS江湖里的三把瑞士军刀,用好了原地封神,用不好...嗯,至少你知道自己是怎么死的。
先给这仨"亲兄弟"排排坐,到底谁是大哥谁是老幺
在深入代码之前,咱们得先把CSS的继承机制这摊浑水给搅明白了。你知道为啥有些属性比如color、font-family天生就是"跟屁虫",子元素自动继承父级的值,而有些像margin、padding就非得每个元素自己重新声明?这背后其实是W3C那帮大佬们早就定好的规矩。
继承属性 vs 非继承属性
简单来说,CSS属性分两大阵营:
可继承属性 (Inherited properties):主要是跟文字排版相关的,比如color、font-family、font-size、line-height、text-align、visibility这些。设计者的逻辑大概是:一段文字的颜色和字体,通常整个段落甚至整个页面都应该保持一致,所以干脆让子元素默认"抄作业"算了。
不可继承属性 (Non-inherited properties):布局相关的居多,width、height、margin、padding、border、background、display、position这些。这些属性如果默认继承,那画面太美不敢看------想象一下你给一个div设了个padding: 20px,结果里面所有嵌套的元素全都自动撑开20px内边距,那还得了?
但问题来了:这种默认行为有时候并不是我们想要的。比如你想让某个按钮的字体颜色不要跟着父级走,或者希望一个嵌套的div能"忘记"父级的怪异布局设置。这时候,inherit、initial、unset就派上用场了。
inherit:那个永远听爸爸话的"乖宝宝"
inherit这货,用一句话总结就是:不管爸爸穿什么,我必须穿得一模一样。它强制让属性继承父级的计算值,不管这个属性本身是不是可继承的。
听起来很美好对吧?但你要知道,太听话的孩子有时候也挺让人头疼的。如果父级是个"神经病"(比如动态计算出来的奇怪值),那子元素也会跟着一起疯。
initial:浏览器默认设置的"钉子户"
initial就像是个杠精,它的口头禅是:我不听我不听,我只认浏览器出厂设置 。每个CSS属性在浏览器里都有一个预定义的初始值,比如color的初始值通常是black(或者具体取决于浏览器和用户代理样式表),display的初始值是inline,position是static。
用initial就是一刀砍断所有继承关系,直接回退到最原始的默认状态。这招在清理被污染严重的样式时特别好使,但副作用也很明显------你真的确定你知道每个属性的初始值是什么吗?很多时候我们以为的"默认",其实是被重置过的,或者是浏览器特定的。
unset:职场老油条的"端水艺术"
unset是这三个里面最鸡贼的,它是个条件继承者 。对于可继承属性,它的行为像inherit;对于不可继承属性,它的行为像initial。换句话说,它看碟下菜:能蹭的便宜绝对要蹭(继承),不能蹭的也不强求(回初始值)。
这货在写组件库或者需要样式隔离的场景下简直是神器,因为它既尊重了正常的继承逻辑(比如文字样式),又切断了不必要的布局污染。
扒一扒CSS继承机制的底裤,为什么有些属性天生就爱"子承父业"
要真正理解这三个关键字,咱们得稍微深入一点,看看浏览器到底是怎么处理样式计算的。别慌,不涉及到什么高深算法,就是简单的层叠和继承两个概念。
**层叠(Cascade)**解决的是"当多个规则匹配同一个元素时,听谁的"这个问题。优先级计算、来源权重(作者样式表 vs 用户样式表 vs 浏览器默认)、还有那个臭名昭著的!important,都是层叠机制的一部分。
**继承(Inheritance)**解决的是"属性值怎么从父元素传到子元素"的问题。注意,继承发生在层叠之后,只有当某个属性在元素上没有直接指定值时,才会考虑继承。
这里有个坑很多人踩过:继承的是计算值(computed value) ,而不是指定值(specified value) 。什么意思呢?比如父元素设置了font-size: 2em,如果父元素的父元素是16px,那么父元素的计算值是32px。子元素继承的是这个32px,而不是2em。这点在响应式设计里特别重要,因为如果你指望子元素继承相对单位然后跟着一起缩放,可能会失望。
css
/* 举个栗子,看看计算值继承的坑 */
.grandpa {
font-size: 16px;
}
.dad {
font-size: 2em; /* 计算后是32px */
}
.son {
font-size: inherit; /* 继承的是32px,不是2em! */
/* 如果这里写1em,那就是32px;如果想回到16px,得写0.5em或者initial */
}
这种继承机制的设计,一方面保证了样式的连贯性(你不用每个p标签都重新声明字体),另一方面也给了咱们足够的灵活性去打破继承链条。
深扒代码现场,看看这仨货在实际项目里是怎么兴风作浪的
光说不练假把式,咱们直接上代码,看看这三个关键字在真实场景下到底怎么玩。
场景一:全局字体污染大作战
想象这么一个场景:你们公司的设计系统升级,产品经理一拍脑袋说"全局文字颜色要改成品牌紫#6B46C1"。于是有人在:root或者body上加了color: #6B46C1。结果你负责的那个特殊模块,里面有个免责声明需要灰色文字,你写了color: #666,但发现有个嵌套的span标签还是紫色的,因为那个span被其他样式规则覆盖了,你的#666没生效。
这时候initial就派上用场了:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
/* 模拟全局样式污染 */
body {
color: #6B46C1; /* 品牌紫,全局污染 */
font-family: 'Comic Sans MS', cursive; /* 别问,问就是产品经理的审美 */
}
/* 你的组件样式 */
.disclaimer-module {
color: #666; /* 你想要灰色 */
font-size: 12px;
padding: 10px;
border: 1px solid #ddd;
}
/* 但是里面有些内联样式或者第三方库插入的span */
.disclaimer-module span {
/* 啥也没写,默认继承父级的color?不,可能被其他权重更高的规则覆盖了 */
}
/* 更安全的做法:强制重置 */
.disclaimer-module * {
color: initial; /* 全部给我回到浏览器默认黑色! */
}
/* 然后重新给模块本身设置颜色 */
.disclaimer-module {
color: #666;
}
.disclaimer-module h4 {
color: #333; /* 标题深一点 */
}
</style>
</head>
<body>
<div class="disclaimer-module">
<h4>重要提示</h4>
<p>本活动最终解释权归<span>活动主办方</span>所有,<em>参与即视为同意</em>所有条款。</p>
</div>
</body>
</html>
看到没?.disclaimer-module *这个选择器配合color: initial,就像是个样式清道夫,把从body继承来的紫色全部清零。然后你再在模块内部按需重新设置颜色,这样就建立了一个干净的样式隔离区。
但要注意,*选择器性能开销其实不大(现代浏览器优化得很好),但initial会把颜色重置为black(或者用户代理样式表定义的初始值),而不是透明或者继承。如果你希望它继承父级的灰色,应该用inherit而不是initial。这里的关键是:先想清楚你要的是"清零"还是"继承"。
场景二:组件库里的样式隔离
做UI组件库的同学肯定懂这种痛:你写了个漂亮的Button组件,结果用户引入你的CSS后,发现按钮样式被项目里的全局样式表给污染了。比如用户有个祖传样式button { padding: 20px 40px; },直接把你的紧凑小按钮撑成了巨无霸。
这时候unset就能大显身手:
css
/* 你的Button组件样式 */
.my-button {
/* 先全部unset,切断外部影响 */
all: unset; /* 这是个大杀器,后面细说 */
/* 然后重新设置你自己的样式 */
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 16px;
font-size: 14px;
border-radius: 4px;
background: #3B82F6;
color: white;
cursor: pointer;
transition: all 0.2s;
/* 对于需要继承的文字属性,显式继承 */
font-family: inherit; /* 这样至少字体能跟项目保持一致 */
}
.my-button:hover {
background: #2563EB;
}
.my-button:active {
transform: scale(0.98);
}
/* 针对不同尺寸的变体 */
.my-button--large {
padding: 12px 24px;
font-size: 16px;
}
.my-button--small {
padding: 4px 8px;
font-size: 12px;
}
等等,上面代码里我用了all: unset,这是个简写属性,相当于给所有CSS属性都设置unset。这比你一个个写margin: unset; padding: unset; border: unset...要爽多了。但副作用是连display都会被unset成inline(因为display不可继承,unset表现像initial),所以后面必须重新声明display: inline-flex。
这里font-family: inherit是点睛之笔------我们把布局相关的属性都重置了,但希望文字字体能跟使用方项目的整体风格保持一致,所以显式继承。这就是unset和inherit组合拳的妙处。
场景三:动态主题切换时的尴尬
暗黑模式(Dark Mode)现在基本是标配了,但实现起来一堆坑。假设你用了CSS变量(Custom Properties)来做主题切换:
css
:root {
--text-primary: #1F2937; /* 浅黑 */
--bg-primary: #FFFFFF;
--border-color: #E5E7EB;
}
[data-theme="dark"] {
--text-primary: #F9FAFB; /* 近乎白 */
--bg-primary: #111827; /* 深灰 */
--border-color: #374151;
}
/* 组件样式 */
.card {
background: var(--bg-primary);
color: var(--text-primary);
border: 1px solid var(--border-color);
padding: 20px;
}
/* 卡片里的链接,正常情况下继承文字颜色 */
.card a {
color: inherit; /* 继承卡片的text-primary */
text-decoration: underline;
}
/* 但是某个特殊链接需要强调色 */
.card a.highlight {
color: #3B82F6; /* 蓝色 */
}
看起来没问题对吧?但问题来了:如果用户系统偏好是暗黑模式,而你的网站默认是亮色模式,或者用户手动切换了主题,那些用了inherit的元素能正确响应吗?
答案是:能,但要看继承链 。inherit继承的是计算值,而CSS变量是动态计算的。所以当你切换data-theme属性时,:root里的变量值变了,.card的color变了,.card a继承的color也会跟着变。这看起来是优点,但有时候也是坑。
比如你想在暗黑模式下给链接加个特殊处理:
css
/* 暗黑模式下,高亮链接需要调整 */
[data-theme="dark"] .card a.highlight {
/* 这里如果写inherit,会继承卡片的白色,而不是我们想要的蓝色变体 */
color: #60A5FA; /* 亮一点的蓝色,适配暗黑模式 */
/* 但如果写unset呢? */
/* color: unset; */
/* 这会继承.card的color(白色),因为color是可继承属性! */
/* 结果链接变成了白色,跟普通文字没区别了,翻车! */
}
所以在这个场景下,inherit和unset都不能乱用,你得明确知道当前上下文里什么是可继承的。我的建议是:在主题切换场景下,尽量依赖CSS变量的显式引用,少用继承魔法,这样可读性和可维护性都更好。
手把手教你写Demo,别光听理论,直接上代码看效果
咱们来做个完整的对比实验,把这三个关键字放在一起PK,看看它们到底有什么不同。
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>CSS继承三剑客大比拼</title>
<style>
/* 基础样式,模拟一个被污染的父环境 */
.parent {
color: #DC2626; /* 红色文字 */
font-size: 24px;
font-weight: bold;
padding: 30px; /* 不可继承属性 */
border: 5px solid #7C3AED; /* 紫色边框 */
background: #FEF3C7; /* 浅黄背景 */
margin: 20px;
}
/* 三个实验组 */
.child-inherit {
/* inherit:全部继承父级 */
color: inherit;
font-size: inherit;
font-weight: inherit;
padding: inherit; /* padding也能继承!虽然平时没人这么干 */
border: inherit;
background: inherit;
margin-top: 10px;
display: block;
}
.child-initial {
/* initial:全部回浏览器默认 */
color: initial; /* 通常是黑色 */
font-size: initial; /* 通常是16px */
font-weight: initial; /* 通常是normal */
padding: initial; /* 通常是0 */
border: initial; /* 通常是none */
background: initial; /* 通常是transparent */
margin-top: 10px;
display: block;
}
.child-unset {
/* unset:可继承的继承,不可继承的回默认 */
color: unset; /* 可继承 -> 继承父级红色 */
font-size: unset; /* 可继承 -> 继承24px */
font-weight: unset; /* 可继承 -> 继承bold */
padding: unset; /* 不可继承 -> 回0 */
border: unset; /* 不可继承 -> 回none */
background: unset; /* 不可继承 -> 回transparent */
margin-top: 10px;
display: block;
}
/* 加个标签样式方便区分 */
.label {
display: inline-block;
font-size: 12px;
color: #666;
font-weight: normal;
background: #E5E7EB;
padding: 2px 6px;
border-radius: 4px;
margin-bottom: 5px;
}
</style>
</head>
<body>
<h2>CSS继承三剑客对比实验</h2>
<div class="parent">
<span class="label">我是父级</span>
父级文字:红色、24px、粗体、30px内边距、紫色边框、浅黄背景
<div class="child-inherit">
<span class="label">inherit版本</span>
我全继承了:红色、24px、粗体、30px内边距、紫色边框、浅黄背景
</div>
<div class="child-initial">
<span class="label">initial版本</span>
我全重置了:黑色、16px、normal、0内边距、无边框、透明背景
</div>
<div class="child-unset">
<span class="label">unset版本</span>
我智能选择:红色、24px、粗体(继承),但0内边距、无边框、透明背景(重置)
</div>
</div>
</body>
</html>
把这段代码保存成HTML文件打开看看,效果立竿见影:
- inherit版本:跟父级长得一模一样,连padding和border都复制过来了,像个克隆人。
- initial版本:彻底"洗白",回到最原始的浏览器默认样式,跟父级毫无关系。
- unset版本:文字样式(可继承)跟着父级走,但布局样式(不可继承)全部清零,这是最符合我们直觉的"重置"行为。
这个实验也暴露了inherit的一个坑:它会把所有属性都继承过来,包括那些你可能不想继承的 。比如在这个例子里,子元素继承了父级的padding: 30px,结果导致子元素内部空间巨大,可能并不是你想要的效果。所以用inherit的时候,最好只针对特定属性使用,而不是一股脑全继承。
是神器还是鸡肋?咱们关起门来聊聊它们的真心话大冒险
说了这么多优点,咱们也得聊聊这几个关键字的局限性和坑点,毕竟技术选型不能只看光鲜的一面。
inherit的致命弱点:父级抽风,全家遭殃
inherit最大的风险在于它完全依赖父级的状态。如果父级的值是动态计算的,或者在不同状态下变化很大,子元素也会跟着坐过山车。
css
/* 灾难现场示例 */
.nav-item {
color: inherit; /* 继承父级导航栏的颜色 */
}
/* 然后产品经理说导航栏要有hover效果 */
.navbar:hover {
color: #3B82F6; /* 变蓝色 */
}
/* 结果.nav-item也跟着变蓝,可能跟你的设计稿不符 */
/* 更惨的是如果.nav-item自己还有hover状态 */
.nav-item:hover {
color: #DC2626; /* 我想变红色 */
/* 但如果父级.navbar还在hover状态,优先级可能出问题 */
}
这种时候调试起来特别痛苦,因为你看着元素的color是#3B82F6,但找遍所有CSS文件都找不到直接给这个元素设置蓝色的规则,最后发现是父级在hover...这种"隐形依赖"在大项目里就是定时炸弹。
initial的兼容性小尾巴
虽然2026年了,主流浏览器对这三个关键字的支持都还不错,但initial在某些老旧的WebView(比如某些安卓机自带的浏览器,或者企业微信、钉钉内置的浏览器)里还是会有诡异表现。
更隐蔽的问题是:不同浏览器的"初始值"可能不一样 。虽然CSS规范规定了每个属性的初始值,但用户代理样式表(浏览器默认样式)可能会覆盖这些值。比如color的规范初始值是black,但Safari的默认样式可能是深灰色;font-size的初始值是medium,但具体对应多少像素各个浏览器可能有细微差别。
所以用initial做样式重置时,最好后面再跟一个你确定的具体值,别指望initial能给你跨浏览器一致的表现。
unset的"精神分裂":我到底继承了没有?
unset最烦人的地方是它的不确定性 。看代码的时候,你看到一个color: unset,得先查一下color是不是可继承属性(是的),所以这里表现像inherit;然后又看到display: unset,得查一下display是不是可继承属性(不是),所以这里表现像initial。
这种"上下文相关"的行为增加了心智负担。特别是当你接手别人的代码,看到一堆unset的时候,你得一个个查规范才能确定到底会发生什么。相比之下,inherit和initial虽然简单粗暴,但意图是明确的。
性能那点事儿
很多人担心频繁使用这些关键字会不会影响渲染性能。我专门做过测试(用Chrome DevTools的Performance面板),结论是:在现代浏览器里,影响微乎其微。
CSS的继承和初始值计算是在样式计算(Style Calculation)阶段完成的,这个阶段浏览器本来就做了大量优化。inherit、initial、unset都是标准的CSS关键字,浏览器对它们的处理是高度优化的。除非你在一个有几万个节点的页面上给每个元素都用这些关键字(这种场景本身就有其他更严重的性能问题),否则不用担心性能瓶颈。
真正影响性能的是选择器复杂度 和布局抖动(Layout Thrashing) ,而不是你用的是color: red还是color: inherit。
遇到样式不生效别急着砸键盘,这套"望闻问切"法救过我的命
用了inherit但没反应?写了initial但颜色还是不对?别慌,按这个流程排查,能省你半小时调试时间。
第一招:开发者工具的正确打开方式
别只看Computed面板!虽然Computed面板显示的是最终计算值,但你要知道这个值是怎么来的。点击Styles面板,看看哪些规则被划掉了(overridden),哪些还在生效。
特别注意继承链的显示:在Chrome DevTools里,如果一个值是继承来的,Styles面板会显示"Inherited from [父元素选择器]",点击可以直接跳转到父元素的规则。这是揪出"样式污染源"的最快方法。
第二招:强制颜色可视化
Chrome DevTools有个隐藏功能:在Settings -> Preferences -> Elements里,开启"Show user agent shadow DOM"和"Show comments in render tree"(不同版本位置可能略有不同)。更实用的是**强制颜色(Forced Colors)**模拟,在Rendering面板(按Esc打开Console,然后切到Rendering标签)里,可以模拟高对比度模式、打印模式等,这能帮你看出哪些样式是继承来的,哪些是显式设置的。
第三招:属性继承性速查
不确定某个属性支不支持继承?别猜,直接查。你可以记住最常见的几个:
可继承(用unset会继承) :color, font-*(family, size, weight, style, variant等), line-height, text-align, text-indent, text-transform, letter-spacing, word-spacing, white-space, direction, visibility, list-style-*, cursor, quotes
不可继承(用unset会回初始值) :上面没提到的基本都是,特别是布局相关的width, height, margin, padding, border, display, position, float, clear, overflow, background, z-index
有个小技巧:在MDN上查某个CSS属性,页面右侧的"Inherited"一行会明确告诉你Yes或No。
终极奥义:核打击级别的!important
当你试了所有方法,样式还是被覆盖,那就只能祭出!important这个大杀器了。但注意,配合inherit、initial、unset使用时,语法要正确:
css
/* 正确 */
.my-element {
color: inherit !important;
background: initial !important;
margin: unset !important;
}
/* 错误!important要在值后面,不能在关键字前面 */
.my-element {
color: !important inherit; /* 这会导致解析错误 */
}
但我要严重警告:不到万不得已别用!important。它就像CSS里的核武器,一旦用了,后面所有想覆盖这个样式的代码都得用!important,最后变成军备竞赛,代码可维护性直接归零。我的原则是:能用特异性(Specificity)解决的,绝不用!important;能用更具体的选择器解决的,绝不滥用!important。
老前端私藏的几个骚操作,让你写CSS像在开挂
最后分享几个我在实战中总结的"歪门邪道",虽然看起来不那么"正规",但确实好使。
技巧一:unset配合CSS Variables做主题切换
前面说过主题切换的坑,这里给个更优雅的解决方案:
css
/* 定义基础变量 */
:root {
--btn-bg: #3B82F6;
--btn-color: #FFFFFF;
--btn-padding: 8px 16px;
}
/* 暗黑模式覆盖 */
[data-theme="dark"] {
--btn-bg: #60A5FA;
--btn-color: #1F2937;
}
/* 按钮基础样式 */
.smart-button {
/* 布局属性unset,防止外部污染 */
all: unset;
/* 重新设置基础布局 */
display: inline-flex;
align-items: center;
box-sizing: border-box;
/* 主题相关属性用变量,且使用unset的回退机制 */
background: var(--btn-bg);
color: var(--btn-color);
padding: var(--btn-padding);
/* 但字体继承自父级,保持整体一致性 */
font-family: inherit;
font-size: inherit;
line-height: inherit;
cursor: pointer;
border-radius: 4px;
transition: opacity 0.2s;
}
.smart-button:hover {
opacity: 0.9;
}
/* 尺寸变体只需要改变量值,不用重写所有属性 */
.smart-button--large {
--btn-padding: 12px 24px;
/* 字体大小不想继承,单独设置 */
font-size: 16px;
}
.smart-button--small {
--btn-padding: 4px 8px;
font-size: 12px;
}
这里的关键是all: unset切断了外部所有样式污染,但font-family: inherit等又显式继承了文字相关属性。这样组件既保持了独立性(布局不受外部影响),又保持了协调性(文字风格融入整体)。
技巧二:initial实现真正的样式隔离
做第三方嵌入组件(比如一个可以嵌入任何网站的聊天窗口)时,你需要确保自己的样式不被宿主页面影响,同时也不影响宿主页面。这时候initial比unset更彻底:
css
/* 隔离容器 */
.isolated-widget {
/* 全部重置为浏览器默认,建立干净环境 */
all: initial;
/* 重新设置自己的基础字体(防止继承宿主页面的奇葩字体) */
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-size: 14px;
line-height: 1.5;
color: #1F2937;
/* 确保盒模型可控 */
box-sizing: border-box;
/* 其他组件样式... */
}
/* 组件内部所有元素也重置 */
.isolated-widget * {
all: initial;
font-family: inherit; /* 但至少继承组件的字体 */
font-size: inherit;
color: inherit;
}
/* 然后给具体组件写样式 */
.isolated-widget .widget-header {
display: flex;
justify-content: space-between;
padding: 12px 16px;
background: #3B82F6;
color: white;
/* 这里不需要写font-family,因为继承了.isolated-widget的 */
}
这种"重置-继承"的模式,能最大程度保证你的组件在任何环境下看起来都一样。代价是代码量稍微多一点,但对于需要高度一致性的第三方组件来说,值得。
技巧三:面试装逼顺口溜
下次面试被问到CSS继承相关的问题,或者跟同事撕逼的时候,甩出这句话,显得你很专业:
"inherit是孝顺,initial是叛逆,unset是精明;可继承的传家业,不可继承的各过各,unset看碟下菜最机灵。"
虽然有点土,但确实把三者的核心区别说清楚了。面试官要是懂行,会会心一笑;要是不懂行,会觉得你很有"工程经验"(毕竟能把技术点编成顺口溜的,都是老油条了)。
不为人知的秘密:利用inherit的"副作用"省代码
有时候,我们可以故意利用inherit的强制继承特性,来简化一些复杂的样式设置。比如做一个边框分割线效果:
css
/* 传统做法 */
.divider {
border-top: 1px solid #E5E7EB;
margin: 20px 0;
}
/* 利用inherit的骚操作 */
.parent-container {
color: #E5E7EB; /* 把颜色设成边框色 */
}
.divider {
border-top: 1px solid; /* 不指定颜色,继承父级的 */
margin: 20px 0;
color: inherit; /* 确保继承,虽然默认就会继承,但显式写更保险 */
}
/* 这样当你想改分割线颜色时,只需要改父级的color */
.parent-container.theme-dark {
color: #374151; /* 深色分割线 */
}
这个技巧利用了border-color默认继承color这个特性(对,border-color是可继承的,虽然很少人注意到)。通过控制父级的color,我们可以间接控制所有子元素的边框颜色,这在需要批量调整分割线颜色的场景下,能省不少代码。
但注意,这招有点"邪门",因为color本来是用来控制文字颜色的,拿它来控制边框颜色,代码可读性会下降。建议加上详细注释,不然接手的同事会骂娘。
行了,干货差不多倒完了,再啰嗦就要被群主踢了
说实话,CSS这三个关键字,平时写业务代码的时候可能用得不太多,但一旦遇到样式污染、组件隔离、主题切换这些复杂场景,它们就是你的救命稻草。关键是理解背后的继承机制 和层叠规则,而不是死记硬背语法。
最后给几个血泪教训:
-
别把initial到处乱用 :它确实能重置样式,但你真的确定你知道每个属性的初始值是什么吗?
display: initial会把元素变成inline,这可能彻底破坏你的布局。用之前先查查MDN,确认初始值是你想要的。 -
unset在组件库里是神器,但在业务代码里要慎用 :因为它"智能"的行为,可能导致调试困难。如果团队里有人不熟悉这个关键字,看到你的
unset可能会一脸懵逼。 -
inherit最适合处理文字类样式 :
color、font-size、line-height这些,用inherit通常很安全,而且能保持设计一致性。但布局属性(padding、margin、border)用inherit前要三思,除非你真的想复制父级的布局。 -
记得测试各种边界情况 :特别是父级没有设置某个属性时(此时继承的是浏览器默认值或更上层祖先的值),以及父级值是
unset或initial时的嵌套情况。CSS的继承链有时候比你想的要深。 -
别迷信"最佳实践":有些文章说"永远不要用!important",有些说"always use all: unset to reset",这些教条在特定场景下都可能被打破。理解原理,根据具体情况选择最合适的方案,才是老前端的修养。
赶紧去你的项目里试试这三招吧。要是还搞不定,那可能真不是CSS的问题,是咱们该换个发型冷静一下了------或者,考虑一下是不是该用CSS-in-JS或者Shadow DOM这种更彻底的隔离方案了?
哦对了,差点忘了说:revert和revert-layer这两个关键字现在浏览器支持也挺好的,它们跟unset有点像但行为不同,有兴趣的可以去MDN上瞅瞅。不过那就是另一个故事了,咱们下回再聊(如果还有下回的话)。
记得别把initial到处乱用,不然产品经理找你改需求的时候,你会发现自己连个回退的余地都没有,到时候别怪我没提醒哈。咱们下回再聊点更刺激的,比如怎么用一行CSS让布局崩得更有艺术感,敬请期待(或者永远别期待)。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法[1](#甘特图的mermaid语法1) 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Co
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:DTcode7的博客首页。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!
| 专栏系列(点击解锁) | 学习路线(点击解锁) | 知识定位 |
|---|---|---|
| 《微信小程序相关博客》 | 持续更新中~ | 结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等 |
| 《AIGC相关博客》 | 持续更新中~ | AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结 |
| 《HTML网站开发相关》 | 《前端基础入门三大核心之html相关博客》 | 前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识 |
| 《HTML网站开发相关》 | 《前端基础入门三大核心之JS相关博客》 | 前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。 通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心 |
| 《HTML网站开发相关》 | 《前端基础入门三大核心之CSS相关博客》 | 介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页 |
| 《HTML网站开发相关》 | 《canvas绘图相关博客》 | Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化 |
| 《Vue实战相关博客》 | 持续更新中~ | 详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅 |
| 《python相关博客》 | 持续更新中~ | Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具 |
| 《sql数据库相关博客》 | 持续更新中~ | SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能 |
| 《算法系列相关博客》 | 持续更新中~ | 算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维 |
| 《IT信息技术相关博客》 | 持续更新中~ | 作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识 |
| 《IT信息技术相关博客》 | 《信息化人员基础技能知识相关博客》 | 无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方 |
| 《IT信息技术相关博客》 | 《信息化技能面试宝典相关博客》 | 涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面 |
| 《前端开发习惯与小技巧相关博客》 | 持续更新中~ | 罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等 |
| 《photoshop相关博客》 | 持续更新中~ | 基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结 |
| 日常开发&办公&生产【实用工具】分享相关博客》 | 持续更新中~ | 分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具 |
吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

mmand + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
javascript
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
| 项目 | Value |
|---|---|
| 电脑 | $1600 |
| 手机 | $12 |
| 导管 | $1 |
设定内容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| 第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:
| 原始符号 | 转换后 | 说明 |
|---|---|---|
"引号" |
"引号" | 直引号变弯引号 |
'单引号' |
'单引号' | 直单引号变弯单引号 |
-- |
-- | 两个连字符变短破折号 |
--- |
--- | 三个连字符变长破折号 |
... |
... | 三个点变省略号 |
创建一个自定义列表
:
Text-to- conversion tool
:
John
:
Luke
如何创建一个注脚
一个具有注脚的文本。[2](#2)
注释也是必不可少的
Markdown将文本转换为 。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
- 关于 甘特图 语法,参考 这儿,
UML图表
可以使用UML图表进行渲染,例如下面产生的一个序列图:
王五 李四 张三 王五 李四 张三 李四想了很长时间, 文字太长了 不适合放在一行. 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 打量着王五... 很好... 王五, 你怎么样?
- 关于 UML图表 语法,参考 这儿,
流程图
链接
长方形
圆
圆角长方形
菱形
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart.js的流程图语法:
Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
-
注脚的解释 ↩︎
*[HTML]: 超文本标记语言