Update ID and class selector/attribute guidance

We now recommend avoiding unnecessary `id` attributes and prefer using class selectors for styling.

Where `id` attributes are strictly required, we recommend always including a hyphen in the value.
This commit is contained in:
Tony Ruscoe 2022-01-13 14:13:57 +00:00 committed by GitHub
parent 5ac8b604fa
commit 8d4a22bd69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -371,6 +371,34 @@ as defaults. This can be safely done even for older browsers.</p>
&lt;script src="https://www.google.com/js/gweb/analytics/autotrack.js"&gt;&lt;/script&gt; &lt;script src="https://www.google.com/js/gweb/analytics/autotrack.js"&gt;&lt;/script&gt;
</code></pre> </code></pre>
<h4 id="id_Attributes" class="numbered"><code>id</code> Attributes</h4>
<p>Avoid unnecessary <code>id</code> attributes.</p>
<p>Prefer <code>class</code> attributes for styling and <code>data</code> attributes for scripting.</p>
<p>Where <code>id</code> attributes are strictly required, always include a hyphen in the
value to ensure it does not match the JavaScript identifier syntax, e.g. use
<code>user-profile</code> rather than just <code>profile</code> or <code>userProfile</code>.</p>
<p>When an element has an <code>id</code> attribute, browsers will make that available as a
<a href="https://html.spec.whatwg.org/multipage/window-object.html#named-access-on-the-window-object">named property on the global <code>window</code> prototype</a>,
which may cause unexpected behavior. While <code>id</code> attribute values containing a
hyphen are still available as property names, these cannot be referenced as
global JavaScript variables.</p>
<pre><code class="language-html bad">&lt;!-- Not recommended: `window.userProfile` will resolve to reference the &lt;div&gt; node --&gt;
&lt;div id="userProfile"&gt;&lt;/div&gt;
</code></pre>
<pre><code class="language-html good">&lt;!-- Recommended: `id` attribute is required and its value includes a hyphen --&gt;
&lt;div aria-describedby="user-profile"&gt;
&lt;div id="user-profile"&gt;&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<h3 id="HTML_Formatting_Rules" class="numbered">HTML Formatting Rules</h3> <h3 id="HTML_Formatting_Rules" class="numbered">HTML Formatting Rules</h3>
<h4 id="General_Formatting" class="numbered">General Formatting</h4> <h4 id="General_Formatting" class="numbered">General Formatting</h4>
@ -477,12 +505,12 @@ to test.</p>
CSS code that may not have any effect and can be removed, and that ensures CSS code that may not have any effect and can be removed, and that ensures
proper CSS usage.</p> proper CSS usage.</p>
<h4 id="ID_and_Class_Naming" class="numbered">ID and Class Naming</h4> <h4 id="ID_and_Class_Naming" class="numbered">Class Naming</h4>
<p>Use meaningful or generic ID and class names.</p> <p>Use meaningful or generic class names.</p>
<p>Instead of presentational or cryptic names, always use ID and class names that <p>Instead of presentational or cryptic names, always use class names that reflect
reflect the purpose of the element in question, or that are otherwise generic.</p> the purpose of the element in question, or that are otherwise generic.</p>
<p>Names that are specific and reflect the purpose of the element should be <p>Names that are specific and reflect the purpose of the element should be
preferred as these are most understandable and the least likely to change.</p> preferred as these are most understandable and the least likely to change.</p>
@ -494,7 +522,7 @@ meaning different from their siblings. They are typically needed as “helpers.
document or template changes.</p> document or template changes.</p>
<pre><code class="language-css bad">/* Not recommended: meaningless */ <pre><code class="language-css bad">/* Not recommended: meaningless */
#yee-1901 {} .yee-1901 {}
/* Not recommended: presentational */ /* Not recommended: presentational */
.button-green {} .button-green {}
@ -502,8 +530,8 @@ document or template changes.</p>
</code></pre> </code></pre>
<pre><code class="language-css good">/* Recommended: specific */ <pre><code class="language-css good">/* Recommended: specific */
#gallery {} .gallery {}
#login {} .login {}
.video {} .video {}
/* Recommended: generic */ /* Recommended: generic */
@ -511,28 +539,28 @@ document or template changes.</p>
.alt {} .alt {}
</code></pre> </code></pre>
<h4 id="ID_and_Class_Name_Style" class="numbered">ID and Class Name Style</h4> <h4 id="ID_and_Class_Name_Style" class="numbered">Class Name Style</h4>
<p>Use ID and class names that are as short as possible but as long as necessary.</p> <p>Use class names that are as short as possible but as long as necessary.</p>
<p>Try to convey what an ID or class is about while being as brief as possible.</p> <p>Try to convey what a class is about while being as brief as possible.</p>
<p>Using ID and class names this way contributes to acceptable levels of <p>Using class names this way contributes to acceptable levels of understandability
understandability and code efficiency.</p> and code efficiency.</p>
<pre><code class="language-css bad">/* Not recommended */ <pre><code class="language-css bad">/* Not recommended */
#navigation {} .navigation {}
.atr {} .atr {}
</code></pre> </code></pre>
<pre><code class="language-css good">/* Recommended */ <pre><code class="language-css good">/* Recommended */
#nav {} .nav {}
.author {} .author {}
</code></pre> </code></pre>
<h4 id="ID_and_Class_Name_Delimiters" class="numbered">ID and Class Name Delimiters</h4> <h4 id="ID_and_Class_Name_Delimiters" class="numbered">Class Name Delimiters</h4>
<p>Separate words in ID and class names by a hyphen.</p> <p>Separate words in class names by a hyphen.</p>
<p>Do not concatenate words and abbreviations in selectors by any characters <p>Do not concatenate words and abbreviations in selectors by any characters
(including none at all) other than hyphens, in order to improve understanding (including none at all) other than hyphens, in order to improve understanding
@ -546,7 +574,7 @@ and scannability.</p>
</code></pre> </code></pre>
<pre><code class="language-css good">/* Recommended */ <pre><code class="language-css good">/* Recommended */
#video-id {} .video-id {}
.ads-sample {} .ads-sample {}
</code></pre> </code></pre>
@ -555,36 +583,52 @@ and scannability.</p>
<p>Prefix selectors with an application-specific prefix (optional).</p> <p>Prefix selectors with an application-specific prefix (optional).</p>
<p>In large projects as well as for code that gets embedded in other projects or on <p>In large projects as well as for code that gets embedded in other projects or on
external sites use prefixes (as namespaces) for ID and class names. Use short, external sites use prefixes (as namespaces) for class names. Use short, unique
unique identifiers followed by a dash.</p> identifiers followed by a dash.</p>
<p>Using namespaces helps preventing naming conflicts and can make maintenance <p>Using namespaces helps preventing naming conflicts and can make maintenance
easier, for example in search and replace operations.</p> easier, for example in search and replace operations.</p>
<pre><code class="language-css good">.adw-help {} /* AdWords */ <pre><code class="language-css good">.adw-help {} /* AdWords */
#maia-note {} /* Maia */ .maia-note {} /* Maia */
</code></pre> </code></pre>
<h4 id="Type_Selectors" class="numbered">Type Selectors</h4> <h4 id="Type_Selectors" class="numbered">Type Selectors</h4>
<p>Avoid qualifying ID and class names with type selectors.</p> <p>Avoid qualifying class names with type selectors.</p>
<p>Unless necessary (for example with helper classes), do not use element names in <p>Unless necessary (for example with helper classes), do not use element names in
conjunction with IDs or classes.</p> conjunction with classes.</p>
<p>Avoiding unnecessary ancestor selectors is useful for <p>Avoiding unnecessary ancestor selectors is useful for
<a href="http://www.stevesouders.com/blog/2009/06/18/simplifying-css-selectors/">performance reasons</a>.</p> <a href="http://www.stevesouders.com/blog/2009/06/18/simplifying-css-selectors/">performance reasons</a>.</p>
<pre><code class="language-css bad">/* Not recommended */ <pre><code class="language-css bad">/* Not recommended */
ul#example {} ul.example {}
div.error {} div.error {}
</code></pre> </code></pre>
<pre><code class="language-css good">/* Recommended */ <pre><code class="language-css good">/* Recommended */
#example {} .example {}
.error {} .error {}
</code></pre> </code></pre>
<h4 id="ID_Selectors" class="numbered">ID Selectors</h4>
<p>Avoid ID selectors.</p>
<p>ID attributes are expected to be unique across an entire page, which is
difficult to guarantee when a page contains many components worked on by many
different engineers. Class selectors should be preferred in all situations.</p>
<pre><code class="language-css bad">/* Not recommended */
#example {}
</code></pre>
<pre><code class="language-css good">/* Recommended */
.example {}
</code></pre>
<h4 id="Shorthand_Properties" class="numbered">Shorthand Properties</h4> <h4 id="Shorthand_Properties" class="numbered">Shorthand Properties</h4>
<p>Use shorthand properties where possible.</p> <p>Use shorthand properties where possible.</p>
@ -757,19 +801,19 @@ begins the
rule.</p> rule.</p>
<pre><code class="language-css bad">/* Not recommended: missing space */ <pre><code class="language-css bad">/* Not recommended: missing space */
#video{ .video{
margin-top: 1em; margin-top: 1em;
} }
/* Not recommended: unnecessary line break */ /* Not recommended: unnecessary line break */
#video .video
{ {
margin-top: 1em; margin-top: 1em;
} }
</code></pre> </code></pre>
<pre><code class="language-css good">/* Recommended */ <pre><code class="language-css good">/* Recommended */
#video { .video {
margin-top: 1em; margin-top: 1em;
} }
</code></pre> </code></pre>
@ -848,11 +892,11 @@ sections with new lines.</p>
<pre><code class="language-css good">/* Header */ <pre><code class="language-css good">/* Header */
#adw-header {} .adw-header {}
/* Footer */ /* Footer */
#adw-footer {} .adw-footer {}
/* Gallery */ /* Gallery */