在我的脑海中,我一直都知道在任何项目中使用类而不是内联样式。但是两者之间有什么有效的区别吗?
10 回答
首先:
- 如果 HTML 是独立于整个站点设计(例如共享模板代码)构建或生成的,则添加命名合理的类和 ID,专门链接到外部样式表。使用足够的元素来允许任意 CSS 操作。例如,请参阅CSS Zen Garden。这适用于所有 CMS、程序、脚本和其他动态生成的站点内容。HTML 输出必须绝对不包含任何样式或布局。没有例外。
假设您正在处理静态内容,那么:
如果有任何方法可以重用样式,请将其设为类并链接到样式表。
如果没有办法重用样式(这是一次性的东西,在其他任何地方都没有意义),那么使用
<style>
引用元素#id 的块。如果 CSS 属性仅在周围 HTML 的上下文中有意义(例如 的某些用法
clear:
),那么我将样式内联到元素中。
很多人称之为异端邪说,就像很多人谴责goto
在现代编程语言中的任何使用一样。
但是,我的观点是,您应该根据自己的情况选择最能减少整体工作量的方法,而不是接受风格教条。样式表添加了一个间接级别,使站点级别的更改变得容易并有助于建立一致性。但是,如果您在每个页面上有几十个只在一个地方使用的类,那么您实际上是在增加工作量,而不是减少工作量。
换句话说,不要仅仅因为人们告诉你这样做是正确的,就去做一些愚蠢和令人困惑的事情。
有一个简单的原因。CSS 的重点是将内容 (HTML) 与表示 (CSS) 分开。一切都与可访问性和代码重用有关。
如果有选择,我的首选将是类/其他选择器。但是,在某些情况下,内联样式是唯一的方法。在其他情况下,仅仅一个 CSS 类本身就需要太多的工作,而其他类型的 CSS 选择器在那里更有意义。
假设您必须对给定的列表或表格进行斑马条纹。您可以简单地使用选择器来完成这项工作,而不是将特定类应用于每个备用元素或行。这将使代码保持简单,但不会使用 CSS 类。来说明三种方式:
仅使用类
.alternate {
background-color: #CCC;
}
<ul>
<li>first</li>
<li class="alternate">second</li>
<li>third</li>
<li class="alternate">fourth</li>
</ul>
使用类 + 结构选择器
.striped :nth-child(2n) {
background-color: #CCC;
}
<ul class="striped">
<li>first</li>
<li>second</li>
<li>third</li>
<li>fourth</li>
</ul>
使用内联样式
<ul>
<li>first</li>
<li style="background-color: #CCC">second</li>
<li>third</li>
<li style="background-color: #CCC">fourth</li>
</ul>
第二种方式对我来说看起来最便携和封装。要从任何给定的容器元素中添加或删除条纹,只需添加或删除striped
类。
但是,在某些情况下,内联样式不仅有意义,而且是唯一可行的方法。当可能值的集合很大时,尝试为每个可能的状态提前进行类是愚蠢的。例如,允许用户通过拖动将某些项目动态放置在屏幕上的任何位置的 UI。该项目必须以绝对或相对的实际坐标定位,例如:
<div style="position: absolute; top: 20px; left: 49px;">..</div>
当然,我们可以为 div 可以采取的每个可能位置使用类,但不建议这样做。人们可以很容易地看出原因:
.pos_20_49 {
top: 20px;
left: 49px;
}
.pos_20_50 {
top: 20px;
left: 50px;
}
// keep going for a million such classes if the container size is 1000x1000 px
<div class="pos_20_49">..</div>
使用常识。
每个人都知道,在理想的世界中,呈现和内容应该是分开的。每个人也都知道,这在很多时候都不能很好地工作。我们都知道您应该使用 div 而不是表格进行布局,但我们也知道,对于您无法完全控制内容的任何情况,它都无法正常工作。
下载一个 500k 的样式表来设置一个元素的样式,因为您已经采用了所有可能的样式并将其粘贴在样式表中,这将导致您的页面失效,下载 500 个较小的样式表来为您的页面设置样式,因为您需要它们都将导致您的页面失效。
重用在概念上很棒,但现实是它只在某些情况下有用。这几乎同样适用于存在该概念的任何地方。如果你的项目做你想做的事,在每一个合理的浏览器中做,以一种有效的方式做,而且做的很可靠,那么你就可以开始了,重构 css 并不比重构代码更难。
我想不出内联样式的任何优点。
CSS 是关于渐进增强的,而不是重复自己 (DRY)。
使用样式表,更改外观就像更改 HTML 代码中的一行一样简单。犯了一个错误或客户不喜欢改变?恢复到旧样式表。
其他优点:
您的站点可以自动适应不同的媒体,例如打印输出和手持设备。
有条件地包含 CSS 修复,对于那个 gawd-awful browser-that-shall-not-be-named,变得轻而易举。
您的用户可以使用 Stylish 等插件轻松自定义网站。
您可以更轻松地在站点之间重用或共享代码。
我只能想到两种内联样式合适和/或合理的情况。
如果以编程方式应用内联样式。例如,使用 JavaScript 显示和隐藏元素,或在呈现页面时应用内容特定的样式(参见 #2)。
如果在 id 既不合适也不合理的情况下,内联样式完成了单个元素的类定义。例如,
background-image
为图库中的单个图像设置元素的 :
HTML
<div id="gallery">
<div class="image" style="background-image:url(...)">...</div>
<div class="image" style="background-image:url(...)">...</div>
<div class="image" style="background-image:url(...)">...</div>
</div>
CSS
#gallery .image {
background: none center center;
}
假设您使用的是外部样式表,除了前面提到的那些之外,还有一个好处是缓存。浏览器将下载并缓存您的样式表一次,然后在每次引用时使用本地副本。这使您的标记更加紧凑。传输和解析的标记越少,意味着用户的响应速度越快,体验越好。
内联样式绝对是要走的路。只要看看http://www.csszengarden.com/ -类和外部样式表永远不可能......
或者等等……
随着向 CSS 添加自定义属性,现在有了另一个用例。可能想使用内联样式来设置自定义属性。
例如,下面我使用 CSS 网格来对齐 HTML 列表和 Div 块,并且我希望在 HTML 中具有灵活性(就像 BootStrap 或任何其他框架提供的方式一样),因为这个 HTML 是由应用程序动态生成的。
CSS:
:root{
--grid-col : 12;
--grid-col-gap:1em;
--grid-row-gap:1em;
--grid-col-span:1;
--grid-row-span:1;
--grid-cell-bg:lightgray;
}
.grid{
display: grid;
grid-template-columns: repeat(var(--grid-col), 1fr);
column-gap: var(--grid-col-gap);
row-gap: var(--grid-row-gap);
}
.grid-item{
grid-column-end: span var(--grid-col-span);
grid-row-end: span var(--grid-row-span);
background: var(--grid-cell-bg);
}
HTML:
<ul class="grid" style="--grid-col:4">
<li class="grid-item">Item 1</li>
<li class="grid-item">Item 2</li>
<li class="grid-item">Item 3</li>
<li class="grid-item">Item 4</li>
<li class="grid-item">Item 5</li>
<li class="grid-item">Item 6</li>
<li class="grid-item">Item 7</li>
<li class="grid-item">Item 8</li>
</ul>
在上面的 HTML 中将四列更改为 3 我使用样式属性更改自定义属性:
<ul class="grid" style="--grid-col:3">
<li class="grid-item">Item 1</li>
<li class="grid-item">Item 2</li>
<li class="grid-item">Item 3</li>
<li class="grid-item">Item 4</li>
<li class="grid-item">Item 5</li>
<li class="grid-item">Item 6</li>
<li class="grid-item">Item 7</li>
<li class="grid-item">Item 8</li>
</ul>
类是可以添加到 HTML 元素中的可重用样式。例如-
<style>
.blue-text{color:Blue;}
</style>
您可以对任何 HTML 元素使用和重用这个蓝色文本类 请注意,在您的 CSS 样式元素中,类应该以句点开头。在您的 HTML 元素的类声明中,类不应以句点开头。而内联样式就像例如-
<p style="color:Blue;">---</p>
所以两者之间的区别是你可以重用类,而你不能重用内联样式。