在哪里最好声明font-family
CSS属性?在html
或body
元素上?
html {
font-family: sans-serif;
}
或
body {
font-family: sans-serif;
}
我在网上搜索,但我找不到明确的答案。
简短的回答是,你可以使用任何一个。由于每个显示的元素都是body
元素的后代,并且body
元素本身是html
元素的子元素,因此所有继承font-family
属性的元素都会很乐意从任一元素采用它。(如果特定元素不继承它,则始终可以使用值inherit
重写其font-family
属性。
但是什么是最佳实践,为什么?这有点难以回答,但我会试一试。让我们从语义开始...
html
元素表示整个文档(包括不可见的元数据),而body
元素表示文档的内容。由于font-family
是样式内容的属性,因此将其应用于body
似乎是合乎逻辑的。这是body
的一点。
下一个问题:浏览器在哪里定义文本格式属性,如font-family
?我查看了Safari(WebKit),Mozilla Firefox和Chrome的用户代理样式表,并在没有覆盖CSS的页面上使用了Web Inspector,但是我在任何地方都找不到全局font-family
声明。但这里有一些有趣的事情...在 Safari 中,全局文本color
属性是在html
元素上定义的。因此,如果这有什么可取之处,它建议 WebKit 浏览器确实在html
元素上定义了全局字体属性。
这里有CSS重置也可以解决这个问题,比如Bootstrap的_reboot.scss
文件:
// 2. Change the default font family in all browsers.
html {
font-family: sans-serif; // 2
…
}
不过,我们可以在body
元素上覆盖它,而这正是 Bootstrap 稍后几行所做的:
body {
margin: 0; // 1
font-family: $font-family-base;
…
}
半分html
?
CSS规范(据我所知)并没有规定在哪里声明font-family
(它适用于"所有元素"),但它确实给了我们一些提示。W3C 文档 CSS 字体模块级别 3 中的第一个代码示例如下:
body {
font-family: Helvetica;
font-weight: bold;
}
另一个在这里:
body {
font-family: "Gill Sans", sans-serif;
font-size: 12pt;
margin: 3em;
}
它解释说:
BODY 元素上的第一个声明将字体系列设置为 "Gill Sans"。如果该字体不可用,则用户代理(通常称为"浏览器")将使用无衬线字体系列,这是所有用户代理都知道的五个通用字体系列之一。BODY 的子元素将继承字体系列属性的值。
另一点要body
.
最终得分:
body
: 2html
: 0.5
获胜者:body
! :-D
最佳做法是在body
中设置font-family
。
body {
font-family: Arial !important;
}
该!important
在这里很有用,因此,如果您使用的是任何其他框架,您的font-family
不会被覆盖。
您也可以使用*
选择器。
* {
font-family: Arial !important;
}
*
-选择器意味着任何/所有元素,但在覆盖更具体的选择器时,显然将位于属性链的底部。
请注意,!important
标志会将*
的字体样式呈现为绝对样式,即使已使用其他选择器来设置文本(例如,body
或p
)。
*
选择器将为您提供更好的覆盖范围。例如,form
元素(如input
)不会继承html
和body
标签的字体样式。但是,如果您使用*
设置它,那么您将确保您的字体样式传递到所有 HTML 元素。
* {
font-family: 'Open Sans', Helvetica, sans-serif;
}
这是一个演示。使用 * 选择器与 html 和正文。
向<body>
标签添加样式的最佳方式。因为它包含层次结构,所以它必须包含所有全局样式。
参考: https://css-tricks.com/html-vs-body-in-css/
根据项目的不同,最好的位置是包含所有 css 代码的单独链接样式页面。但是从你的问题听起来好像你想把它写到你的HTML中。
如果你想在与HTML相同的文件中执行此操作,那么内部样式表是第二好的选择,并将"样式"标签放在"head"标签中,并在"样式标签"中编写CSS。
<head>
<style>
<!–– Insert CSS Code Here -->
</style>
</head>
否则,您只需内联编写它(在您尝试设置样式的元素点处)。
现在哪种方法最好取决于项目,但通常认为外部样式表是第一个选项,因为它使其他人可以轻松跟踪哪些元素受哪种样式的影响。如果它是一个没有太多CSS的小项目,那么"内部样式表是下一个最佳选择,同样是为了可读性并将CSS保存在一个地方。内联样式虽然可能,但并不真正鼓励。
我假设您将在网站上有一个字体系列,最好的方法是使用
*
选择器中,这个选择所有元素,以便:
*{
font-family:"your-font-family";
}
如果您尝试更改整个页面的字体系列,我必须同意user7357089和nashcheez的观点,即"最佳"方法是将其放在正文标签中。无论如何,所有可见的 HTML 都将包含在 body 标签中,将其添加到 HTML 中是不必要的。
正如其他人所说,在body
上指定font-family
可能是有意义的。但是,由于将其应用于html
元素并没有太多缺点,因此我认为值得一提的是:root
伪类选择器,它选择页面的根(大多数情况下的html
元素),在这种情况下可能更方便。
通常,:root
选择器用于设置 CSS 自定义属性(变量)和字体大小,但我想说对其应用font-family
是合理的。
:root {
/* ...custom properties, font-size, etc... */
font-family: sans-serif;
}
我知道大多数人在 body 元素上设置字体系列。但是由于没有对错(所有元素都是 html 和 body 元素的子元素),请选择一个并坚持下去。这适用于您所做的所有编程选择。这使得调试工作变得更加容易。
对于更改您网站的字体系列,您可以使用以下内容:
*{
font-family:"your-font-family";
}
或这个:
html, body, div, span, applet, object, iframe, table, caption, tbody, tfoot, thead, tr, th, td,
del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var,
h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code,
dl, dt, dd, ol, ul, li, fieldset, form, label, legend {
font-family: iransans !important;
}