<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eris Sulistina</title>
    <description>The latest articles on DEV Community by Eris Sulistina (@sejutaimpian).</description>
    <link>https://dev.to/sejutaimpian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1491741%2F9ac28f50-cd64-4225-9a97-ebb78a92e39d.jpeg</url>
      <title>DEV Community: Eris Sulistina</title>
      <link>https://dev.to/sejutaimpian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sejutaimpian"/>
    <language>en</language>
    <item>
      <title>Regex in CSS</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Thu, 02 Oct 2025 03:17:49 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/regex-in-css-4428</link>
      <guid>https://dev.to/sejutaimpian/regex-in-css-4428</guid>
      <description>&lt;p&gt;Do you know Regex? That weird-looking string you often see in code for validating text inputs. Regex can be used in HTML with the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/pattern" rel="noopener noreferrer"&gt;pattern&lt;/a&gt; attribute, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;pattern=&lt;/span&gt;&lt;span class="s"&gt;"^[\w.-]+@[\w.-]+\.\w{2,}$"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outside HTML, Regex is most commonly used in programming languages where it's more powerful and flexible. For example, in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;]{2}\d{4}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AB1234&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/^[a-z0-9_]&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;3,16&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;$/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"user_123"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;preg_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Valid username"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But here's a question: did you know Regex can also be &lt;em&gt;applied&lt;/em&gt; in &lt;strong&gt;CSS&lt;/strong&gt;?&lt;br&gt;
If you didn't, where do you think Regex-like behavior appears in CSS? Is it used for validation like in HTML and programming languages?&lt;/p&gt;

&lt;p&gt;The answer is: &lt;strong&gt;there is no Regex engine in CSS&lt;/strong&gt;.&lt;br&gt;
However, CSS offers &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors" rel="noopener noreferrer"&gt;Attribute selectors&lt;/a&gt; that adopt a subset of regex-like operators. Attribute selectors support these operators: &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;, and &lt;code&gt;^&lt;/code&gt;. They behave similarly to certain regex patterns, but strictly for selecting elements based on attribute values.&lt;/p&gt;


&lt;h2&gt;
  
  
  Understanding Attribute Selectors
&lt;/h2&gt;

&lt;p&gt;Attribute selectors target HTML attributes and are written inside square brackets. Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* select all elements that have the x-data attribute */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;x-cloak&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* select all &amp;lt;a&amp;gt; elements that have an href attribute */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Types of Attribute Selectors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Existence Selector → &lt;code&gt;[attr]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements that have the attribute, regardless of its value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all &amp;lt;img&amp;gt; elements that have an alt attribute */&lt;/span&gt;
&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Exact Match → &lt;code&gt;[attr="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements whose attribute value matches &lt;strong&gt;exactly&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all &amp;lt;input&amp;gt; elements with type="text" */&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"text"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Prefix Match → &lt;code&gt;[attr^="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements where the attribute value &lt;strong&gt;starts with&lt;/strong&gt; the given string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all &amp;lt;a&amp;gt; elements with href starting with https */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;^=&lt;/span&gt;&lt;span class="s1"&gt;"https"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Suffix Match → &lt;code&gt;[attr$="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements where the attribute value &lt;strong&gt;ends with&lt;/strong&gt; the given string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all &amp;lt;a&amp;gt; elements with href ending in .pdf */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;".pdf"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Substring Match → &lt;code&gt;[attr*="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements where the attribute value &lt;strong&gt;contains&lt;/strong&gt; the substring.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all elements with a class name that contains "btn" */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s1"&gt;"btn"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;pink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example elements that match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sm-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"ghost-btn-danger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Word Match → &lt;code&gt;[attr~="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements where the attribute value contains the word (space-separated).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* all elements whose class attribute contains the word "btn" */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;~=&lt;/span&gt;&lt;span class="s1"&gt;"btn"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Dash Match → &lt;code&gt;[attr|="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects elements where the attribute value is &lt;strong&gt;exactly&lt;/strong&gt; the given value, or &lt;strong&gt;starts with it followed by a dash&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* matches lang="en" or lang="en-US", etc. */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;|=&lt;/span&gt;&lt;span class="s1"&gt;"en"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en-US"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;I hope this post helps level up your CSS skills as a frontend developer.&lt;/p&gt;

&lt;p&gt;If you enjoyed this article, don’t forget to 💖 save, 🗨️ comment, and 🔁 share it with fellow developers!&lt;/p&gt;

&lt;p&gt;See you in the next post 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>Regex di CSS</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Thu, 02 Oct 2025 02:50:28 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/regex-di-css-5fp9</link>
      <guid>https://dev.to/sejutaimpian/regex-di-css-5fp9</guid>
      <description>&lt;p&gt;Kalian tahu Regex kan? Itu loh tulisan random yang suka ada di baris kode untuk validasi tulisan. Regex bisa diterapkan di HTML untuk validasi input dengan bantuan attribute &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/pattern" rel="noopener noreferrer"&gt;pattern&lt;/a&gt; seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;pattern=&lt;/span&gt;&lt;span class="s"&gt;"^[\w.-]+@[\w.-]+\.\w{2,}$"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selain di html, Regex paling sering digunakan di bahasa pemrograman sehingga lebih kuat dan fleksibel penggunaannya. Contoh di bahasa Javascript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;]{2}\d{4}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AB1234&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh lain di bahasa PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/^[a-z0-9_]&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;3,16&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;$/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"user_123"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;preg_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Username valid"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apakah kalian tahu kalau Regex bisa diterapkan di CSS? Kalau kalian tidak tahu, coba tebak menurut kalian Regex di CSS diterapkan di mana? Apakah digunakan sebagai validasi juga seperti di HTML dan bahasa pemrograman? Jawabannya adalah &lt;strong&gt;Tidak ada Regex di CSS&lt;/strong&gt;, tapi ada &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors" rel="noopener noreferrer"&gt;Attribute selectors&lt;/a&gt; yang mengadopsi sebagian Regex. Pada Attribute selectors hanya mendukung 5 Regex operator &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;, dan &lt;code&gt;^&lt;/code&gt;. Setiap operator tersebut berfungsi sama seperti di Regex yaitu sebagai validasi.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mengenal Attribute Selectors
&lt;/h2&gt;

&lt;p&gt;Attribute Selectors adalah salah satu selector di CSS yang menargetkan attribute html. Aturan penulisan attribute adalah diapit oleh kurung siku. Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen yang punya atribut x-data */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;x-data&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* semua elemen &amp;lt;a&amp;gt; yang punya atribut href */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Jenis-jenis Attribute Selectors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Existence Selector → &lt;code&gt;[attr]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut, tanpa peduli nilainya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen &amp;lt;img&amp;gt; yang punya atribut alt */&lt;/span&gt;
&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Exact Match → &lt;code&gt;[attr="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;sama persis&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen &amp;lt;input&amp;gt; yang punya atribut type dengan value text */&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"text"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Prefix Match → &lt;code&gt;[attr^="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;diawali&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen &amp;lt;a&amp;gt; yang punya atribut href dengan value diawali https */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;^=&lt;/span&gt;&lt;span class="s1"&gt;"https"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Suffix Match → &lt;code&gt;[attr$="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;diakhiri&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen &amp;lt;a&amp;gt; yang punya atribut href dengan value diakhiri .pdf */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;".pdf"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Substring Match → &lt;code&gt;[attr*="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;mengandung tulisan&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen yang punya atribut class dengan value mengandung tulisan btn */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s1"&gt;"btn"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;pink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh 4 elemen yang akan menerapkan style di atas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sm-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"ghost-btn-danger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Word Match → &lt;code&gt;[attr~="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;mengandung kata&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen yang punya atribut class dengan value mengandung kata btn */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;~=&lt;/span&gt;&lt;span class="s1"&gt;"btn"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh 2 elemen yang akan menerapkan style di atas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Klik aku!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Dash Match → &lt;code&gt;[attr|="value"]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memilih elemen yang punya atribut tersebut dengan value &lt;strong&gt;sama persis atau diawali lalu diikuti dengan strip (-)&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* semua elemen yang punya atribut lang dengan value sama persis atau diawali en- */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;|=&lt;/span&gt;&lt;span class="s1"&gt;"en"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh 2 elemen yang akan menerapkan style di atas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en-US"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;click me!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Semoga tulisan saya ini dapat mengupgrade kemampuan css kamu sebagai frontend developer.&lt;/p&gt;

&lt;p&gt;Kalau kamu suka artikel ini, jangan lupa 💖 save, 🗨️ comment, dan 🔁 share ke teman developer lainnya!&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan berikutnya 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Sat, 31 May 2025 12:10:30 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/-56hi</link>
      <guid>https://dev.to/sejutaimpian/-56hi</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/railsdesigner/10-modern-css-features-you-want-to-use-1h7m" class="crayons-story__hidden-navigation-link"&gt;10 Modern CSS Features You Want to Use&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/railsdesigner" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1172988%2F12fc6c7d-f168-4e28-bd6e-fb4d3715b8d5.jpg" alt="railsdesigner profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/railsdesigner" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Rails Designer
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Rails Designer
                
              
              &lt;div id="story-author-preview-content-2528659" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/railsdesigner" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1172988%2F12fc6c7d-f168-4e28-bd6e-fb4d3715b8d5.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Rails Designer&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/railsdesigner/10-modern-css-features-you-want-to-use-1h7m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 29 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/railsdesigner/10-modern-css-features-you-want-to-use-1h7m" id="article-link-2528659"&gt;
          10 Modern CSS Features You Want to Use
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/css"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;css&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ruby"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ruby&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rails"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rails&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/railsdesigner/10-modern-css-features-you-want-to-use-1h7m" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/railsdesigner/10-modern-css-features-you-want-to-use-1h7m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              6&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>css</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Logical Pseudo-Classes in CSS</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Wed, 28 May 2025 05:18:19 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/logical-pseudo-classes-in-css-37j</link>
      <guid>https://dev.to/sejutaimpian/logical-pseudo-classes-in-css-37j</guid>
      <description>&lt;p&gt;Logical pseudo-classes are a type of CSS pseudo-class that allow you to select elements based on &lt;strong&gt;logical conditions&lt;/strong&gt;, filtering elements based on &lt;strong&gt;structure&lt;/strong&gt; or &lt;strong&gt;relationships within the DOM&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  List of Logical Pseudo-Classes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-Class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:not(selector)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements that &lt;strong&gt;do not&lt;/strong&gt; match a given selector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;button:not(.primary)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:is(selector, …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Simplifies multiple selectors that share the same rule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:is(h1, h2, h3)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:where(selector, …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;:is()&lt;/code&gt;, but always has &lt;strong&gt;zero specificity&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:where(article, section)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:has(selector)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements that &lt;strong&gt;contain a child/descendant&lt;/strong&gt; matching the selector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:has(img)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-child(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements based on their order among siblings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;li:nth-child(2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-of-type(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;:nth-child&lt;/code&gt; but only counts elements of the same type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p:nth-of-type(2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-child(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;:nth-child&lt;/code&gt; but counts from the end&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tr:nth-last-child(1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-of-type(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combines &lt;code&gt;:nth-last-child&lt;/code&gt; and &lt;code&gt;:nth-of-type&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:nth-last-of-type(1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:first-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects the first child of a parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p:first-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:last-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects the last child of a parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;li:last-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements that are the &lt;strong&gt;only child&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;span:only-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-of-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements that are the only one of their type within a parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;h2:only-of-type&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:empty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects elements that are &lt;strong&gt;completely empty&lt;/strong&gt; (no text or whitespace)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:empty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Big 4
&lt;/h2&gt;

&lt;p&gt;Among all logical pseudo-classes, I highly recommend mastering these four, as they are modern CSS selectors for writing more &lt;strong&gt;flexible&lt;/strong&gt; and &lt;strong&gt;efficient&lt;/strong&gt; rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;:not&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:is&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:where&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:has&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ❗ &lt;code&gt;:not()&lt;/code&gt; — Exclude Elements
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:not&lt;/code&gt; is used to target &lt;strong&gt;all elements that do not match&lt;/strong&gt; a given selector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Targets all &amp;lt;a&amp;gt; elements without the .btn class */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Targets all &amp;lt;textarea&amp;gt; elements without a rows attribute */&lt;/span&gt;
&lt;span class="nt"&gt;textarea&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 &lt;code&gt;:is()&lt;/code&gt; — Combine Multiple Selectors
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:is&lt;/code&gt; is used to target elements that match &lt;strong&gt;any&lt;/strong&gt; of the selectors inside it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Targets h1, h2, and h3 elements */&lt;/span&gt;
&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 
    Targets both:
    1. article &amp;gt; p
    2. article &amp;gt; span
 */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 &lt;code&gt;:where()&lt;/code&gt; — Like &lt;code&gt;:is()&lt;/code&gt;, But Zero Specificity
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Targets h1, h2, and h3 without specificity */&lt;/span&gt;
&lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 
    Targets both without specificity for p and span:
    1. article &amp;gt; p
    2. article &amp;gt; span
 */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔎 &lt;code&gt;:has()&lt;/code&gt; — Target Elements That CONTAIN Other Elements
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:has&lt;/code&gt; is used to select elements based on whether they have specific children or descendants.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Targets buttons that contain an svg */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;svg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Targets article elements with a direct child &amp;lt;img&amp;gt; */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Targets &amp;lt;label&amp;gt; with a required input as next sibling */&lt;/span&gt;
&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"*"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ Closing
&lt;/h2&gt;

&lt;p&gt;I hope this post helps level up your CSS skills as a frontend developer.&lt;/p&gt;

&lt;p&gt;If you enjoyed this article, don’t forget to 💖 save, 🗨️ comment, and 🔁 share it with fellow developers!&lt;/p&gt;

&lt;p&gt;See you in the next post 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>Logical Pseudo-class di dalam CSS</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Wed, 28 May 2025 05:14:25 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/logical-pseudo-class-4a77</link>
      <guid>https://dev.to/sejutaimpian/logical-pseudo-class-4a77</guid>
      <description>&lt;p&gt;Logical pseudo-class adalah jenis pseudo-class dalam CSS yang memungkinkan kita membuat seleksi elemen berdasarkan &lt;strong&gt;logika kondisi&lt;/strong&gt; untuk menyaring elemen berdasarkan &lt;strong&gt;struktur&lt;/strong&gt; atau &lt;strong&gt;hubungan dalam DOM&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Daftar Logical Pseudo-class
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-Class&lt;/th&gt;
&lt;th&gt;Deskripsi&lt;/th&gt;
&lt;th&gt;Contoh Penggunaan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:not(selector)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen yang &lt;strong&gt;tidak&lt;/strong&gt; cocok dengan selector tertentu&lt;/td&gt;
&lt;td&gt;&lt;code&gt;button:not(.primary)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:is(selector, …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyederhanakan banyak selector yang memiliki deklarasi sama&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:is(h1, h2, h3)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:where(selector, …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sama seperti &lt;code&gt;:is()&lt;/code&gt; tapi dengan specificity &lt;strong&gt;selalu 0&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:where(article, section)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:has(selector)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen &lt;strong&gt;yang memiliki anak/cucu&lt;/strong&gt; yang cocok dengan selector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:has(img)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-child(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen berdasarkan urutan anak&lt;/td&gt;
&lt;td&gt;&lt;code&gt;li:nth-child(2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-of-type(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sama seperti &lt;code&gt;:nth-child&lt;/code&gt; tapi hanya memperhitungkan jenis tag yang sama&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p:nth-of-type(2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-child(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Seperti &lt;code&gt;:nth-child&lt;/code&gt; tapi dihitung dari belakang&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tr:nth-last-child(1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-of-type(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kombinasi &lt;code&gt;:nth-last-child&lt;/code&gt; dan &lt;code&gt;:nth-of-type&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:nth-last-of-type(1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:first-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen pertama dalam parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p:first-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:last-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen terakhir dalam parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;li:last-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen yang menjadi &lt;strong&gt;satu-satunya&lt;/strong&gt; anak&lt;/td&gt;
&lt;td&gt;&lt;code&gt;span:only-child&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-of-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi satu-satunya elemen dari jenisnya dalam parent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;h2:only-of-type&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:empty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menyeleksi elemen &lt;strong&gt;yang tidak punya isi&lt;/strong&gt; (termasuk teks/spasi)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div:empty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Big 4
&lt;/h2&gt;

&lt;p&gt;Diantara banyaknya Logical pseudo-class, saya sangat merekomendeasikan kamu untuk menguasai 4 diantaranya karena itu merupakan selector CSS modern untuk menulis rule yang lebih fleksibel dan efisien. 4 pseudo-class tersebut adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;:not&lt;/li&gt;
&lt;li&gt;:is&lt;/li&gt;
&lt;li&gt;:where&lt;/li&gt;
&lt;li&gt;:has&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ❗ :not() — Mengecualikan Elemen
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:not&lt;/code&gt; berfungsi untuk menargetkan &lt;strong&gt;semua elemen yang tidak cocok&lt;/strong&gt; dengan selector tertentu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Menargetkan elemen a yang tidak memiliki class .btn */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Menargetkan elemen textarea yang tidak memiliki attribute rows */&lt;/span&gt;
&lt;span class="nt"&gt;textarea&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 :is() — Menyatukan Beberapa Selector
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:is&lt;/code&gt; berfungsi untuk menargetkan elemen yang cocok dengan salah satu selector di dalamnya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Menargetkan elemen h1, h2, h3 */&lt;/span&gt;
&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 
    Menargetkan 2 kondisi.
    1. article &amp;gt; p
    2. article &amp;gt; span
 */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 :where() — Mirip :is(), Tapi Tanpa Bobot Spesifisitas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Menargetkan elemen h1, h2, h3 tanpa spesifisitas */&lt;/span&gt;
&lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 
    Menargetkan 2 kondisi tanpa spesifisitas pada p dan span.
    1. article &amp;gt; p
    2. article &amp;gt; span
 */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔎 :has() — Menargetkan Elemen yang MENGANDUNG Elemen Tertentu
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:has&lt;/code&gt; berfungsi untuk menyeleksi elemen berdasarkan child atau selector yang diberikan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Menargetkan button yang memiliki descendant child svg */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;svg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Menargetkan article yang memiliki direct child img */&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Menargetkan label yang memiliki attribute required pada next-sibling */&lt;/span&gt;
&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"*"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ Penutup
&lt;/h2&gt;

&lt;p&gt;Semoga tulisan saya ini dapat mengupgrade kemampuan css kamu sebagai frontend developer.&lt;/p&gt;

&lt;p&gt;Kalau kamu suka artikel ini, jangan lupa 💖 save, 🗨️ comment, dan 🔁 share ke teman developer lainnya!&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan berikutnya 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>📝 Give the Stage to Attributes Because Accessibility Deserves the Spotlight</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Wed, 28 May 2025 00:48:21 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/give-the-stage-to-attributes-because-accessibility-deserves-the-spotlight-bpg</link>
      <guid>https://dev.to/sejutaimpian/give-the-stage-to-attributes-because-accessibility-deserves-the-spotlight-bpg</guid>
      <description>&lt;p&gt;There are many ways to target elements with selectors—Universal selector &lt;code&gt;*&lt;/code&gt;, Type selector like &lt;code&gt;header&lt;/code&gt;, ID selector &lt;code&gt;#header&lt;/code&gt;, Class selector &lt;code&gt;.header&lt;/code&gt;, and others.&lt;br&gt;&lt;br&gt;
But among all of them, I find myself (and other developers too) mostly using class selectors for styling. I get it—classes are more flexible.&lt;br&gt;&lt;br&gt;
But that doesn't mean you should use them everywhere. Sometimes all you need is a type selector. Sometimes, you just need an attribute selector.&lt;br&gt;&lt;br&gt;
Overusing classes can blind you to the unique powers other selectors have to offer.&lt;/p&gt;

&lt;p&gt;And just like attributes, accessibility is often overlooked by developers.&lt;br&gt;&lt;br&gt;
Even though implementing accessibility may feel like doing twice the work, it actually makes your website healthier, more inclusive, and increases your value as a developer.&lt;/p&gt;

&lt;p&gt;In this article, I want to open your eyes to attribute selectors and how they can shine—especially when combined with accessibility.&lt;/p&gt;
&lt;h2&gt;
  
  
  🤔 What is an Attribute Selector?
&lt;/h2&gt;

&lt;p&gt;Attribute selectors let you target elements based on their HTML attributes. The syntax uses square brackets &lt;code&gt;[attribute]&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Targets elements with the hidden attribute */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;hidden&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Targets input elements with the required attribute */&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Targets elements with aria-hidden="true" */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-hidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 When Does an Attribute Selector Make More Sense?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The attribute has clear semantic/functional meaning
&lt;/li&gt;
&lt;li&gt;It's not possible or efficient to use a class
&lt;/li&gt;
&lt;li&gt;You want to style elements based on &lt;code&gt;data-&lt;/code&gt; attributes
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ✅ Semantically Meaningful Attributes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Example 1: Alert UI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt; &lt;span class="na"&gt;aria-live=&lt;/span&gt;&lt;span class="s"&gt;"assertive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Profile updated successfully
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"alert"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need for a &lt;code&gt;.alert&lt;/code&gt; class—just use its semantic meaning directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example 2: Required Form Field
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This selector helps provide a visual indicator for required fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example 3: Tab UI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tab"&lt;/span&gt; &lt;span class="na"&gt;aria-selected=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Tab 1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can replace &lt;code&gt;.active&lt;/code&gt; with something more semantic.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example 4: Active Navigation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;aria-current=&lt;/span&gt;&lt;span class="s"&gt;"page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-current&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"page"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accessible and clean styling, all in one.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚫 When Classes Aren’t Ideal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Example 1: Framework Elements
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;data-bs-button&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-bs-button&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can’t touch third-party code? No problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example 2: Detect Missing &lt;code&gt;alt&lt;/code&gt; Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://picsum.photos/600/400"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;]),&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for debugging or warning about missing descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example 3: Label Without &lt;code&gt;for&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="o"&gt;]),&lt;/span&gt; &lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helps catch potential UX issues in forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Styling Based on &lt;code&gt;data-*&lt;/code&gt; Attributes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Example 1: Dark Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;data-theme=&lt;/span&gt;&lt;span class="s"&gt;"dark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  💡 Example 2: Button Variants
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"primary"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✨ Final Words
&lt;/h2&gt;

&lt;p&gt;I hope this article helps you open up to using attribute selectors more intentionally—especially when dealing with semantics and accessibility.&lt;/p&gt;

&lt;p&gt;With the right usage, we can write CSS that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner
&lt;/li&gt;
&lt;li&gt;More semantic
&lt;/li&gt;
&lt;li&gt;More inclusive
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So from now on, let’s &lt;strong&gt;give the stage to attributes, because accessibility deserves the spotlight&lt;/strong&gt; 🙌&lt;/p&gt;

&lt;p&gt;Got a cool trick with attribute selectors? Share it in the comments!&lt;br&gt;&lt;br&gt;
If you liked this article, don’t forget to 💖 save, 🗨️ comment, and 🔁 share it with your dev friends!&lt;/p&gt;

&lt;p&gt;See you in the next post 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>📝 Kasih Panggung untuk Attribute karena Accesibility perlu disambut</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Wed, 28 May 2025 00:36:26 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/kasih-panggung-untuk-attribute-karena-accesibility-perlu-disambut-3pic</link>
      <guid>https://dev.to/sejutaimpian/kasih-panggung-untuk-attribute-karena-accesibility-perlu-disambut-3pic</guid>
      <description>&lt;p&gt;Selector untuk memberikan style ke elemen dapat menggunakan banyak cara yang di antaranya adalah Universal Selector &lt;code&gt;*&lt;/code&gt;, Type Selector &lt;code&gt;header&lt;/code&gt;, ID selector &lt;code&gt;#header&lt;/code&gt;, Class Selector: &lt;code&gt;.header&lt;/code&gt;, dan selector lainnya. Tapi dari sekian banyaknya selector, saya lebih sering menggunakan dan melihat developer lain menggunakan class selector untuk memberikan style. Saya paham penggunaan class lebih fleksibel, tapi bukan berarti kamu perlu menggunakannya di semua tempat. Bisa jadi kamu hanya membutuhkan type selector, atau bisa jadi kamu hanya membutuhkan attribute selector. Penggunaan class di semua tempat akan membutakan matamu terhadap kemampuan-kemampuan unik dari selector lain. &lt;/p&gt;

&lt;p&gt;Selain attribute, ternyata accessibility juga sering diabaikan oleh developer. Walaupun pengerjaannya seakan membuat developer jadi kerja 2 kali, tapi penerapan accessibility akan membuat website lebih sehat, lebih banyak merangkul user, dan akan menaikkan value kamu sebagai developer.&lt;/p&gt;

&lt;p&gt;Pada tulisan ini saya akan membukakan matamu agar lebih perhatian terhadap attribute selector sekaligus penggunaannya bersamaan dengan accessibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Apa Itu Attribute Selector?
&lt;/h2&gt;

&lt;p&gt;Attribute selector adalah jenis selector yang menargetkan elemen berdasarkan atribut HTML-nya. Aturan penulisannya adalah nama elemen diapit oleh kurung siku &lt;code&gt;[attribute]&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Menargetkan elemen yang memiliki atribut hidden */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;hidden&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Menargetkan elemen input yang memiliki atribut required */&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Menargetkan elemen yang memiliki atribut aria-hidden dengan value true */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-hidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;....&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 Kapan Attribute Selector Lebih Baik?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Atribut memiliki arti semantik/fungsional yang jelas
&lt;/li&gt;
&lt;li&gt;Tidak memungkinkan atau tidak efisien menambahkan class
&lt;/li&gt;
&lt;li&gt;Kamu ingin styling berdasarkan &lt;code&gt;data-&lt;/code&gt; attribute
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ✅ Atribut Semantik
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Contoh 1: Alert UI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt; &lt;span class="na"&gt;aria-live=&lt;/span&gt;&lt;span class="s"&gt;"assertive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Berhasil mengupdate profile
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"alert"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tanpa perlu class &lt;code&gt;.alert&lt;/code&gt;, kita bisa styling berdasarkan arti semantiknya langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Contoh 2: Form Wajib Isi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"*"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selector ini membantu kita untuk memberikan indikator visual ke field yang wajib diisi.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Contoh 3: Tab UI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tab"&lt;/span&gt; &lt;span class="na"&gt;aria-selected=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Tab 1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selector ini bisa menggantikan class &lt;code&gt;.active&lt;/code&gt; dengan lebih semantik.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Contoh 4: Navigation Aktif
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;aria-current=&lt;/span&gt;&lt;span class="s"&gt;"page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Beranda&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;aria-current&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"page"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aksesibilitas dapet, styling pun tetap rapi.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚫 Tidak memungkinkan atau tidak efisien menggunakan class
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Contoh 1: Elemen dari Framework
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;data-bs-button&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-bs-button&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kalau elemen dari third-party library gak bisa diutak-atik, ini solusinya.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Contoh 2: Deteksi Gambar Tanpa alt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://picsum.photos/600/400"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;]),&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bisa buat debugging atau memperingatkan kalau ada gambar yang lupa dikasih deskripsi.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Contoh 3: Label tanpa &lt;code&gt;for&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="o"&gt;]),&lt;/span&gt; &lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bantu mendeteksi potensi masalah UX di form.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Styling Berdasarkan data-* Attribute
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Contoh 1: Dark Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;data-theme=&lt;/span&gt;&lt;span class="s"&gt;"dark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  💡 Contoh 2: Variant Button
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"primary"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✨ Penutup
&lt;/h2&gt;

&lt;p&gt;Semoga tulisan ini bisa bikin kamu lebih terbuka untuk mempertimbangkan attribute selector dalam styling, terutama untuk kasus-kasus yang menyangkut semantik dan aksesibilitas.&lt;/p&gt;

&lt;p&gt;Dengan pemakaian yang tepat, kita bisa menulis CSS yang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lebih bersih&lt;/li&gt;
&lt;li&gt;Lebih semantik&lt;/li&gt;
&lt;li&gt;Lebih inklusif&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yuk, mulai sekarang, kasih panggung untuk attribute karena accessibility perlu disambut 🙌&lt;/p&gt;

&lt;p&gt;Punya trik menarik dengan attribute selector? Share di kolom komentar ya!&lt;br&gt;&lt;br&gt;
Kalau kamu suka artikel ini, jangan lupa 💖 save, 🗨️ comment, dan 🔁 share ke teman developer lainnya!&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan berikutnya 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>🧠 Learn CSS Pseudo-classes by Category — With Priorities!</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Mon, 26 May 2025 03:49:32 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/learn-css-pseudo-classes-by-category-with-priorities-1oeh</link>
      <guid>https://dev.to/sejutaimpian/learn-css-pseudo-classes-by-category-with-priorities-1oeh</guid>
      <description>&lt;p&gt;CSS comes with a wide variety of pseudo-classes that allow us to target elements based on their state, structure, and user interaction. Below is a categorized summary of commonly used pseudo-classes, complete with brief descriptions and learning priority levels (based on my personal opinion).&lt;/p&gt;




&lt;h2&gt;
  
  
  👁️ Element Display State Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;These pseudo-classes target elements based on their display state.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:fullscreen" rel="noopener noreferrer"&gt;:fullscreen&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements in fullscreen mode&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:modal" rel="noopener noreferrer"&gt;:modal&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets an open &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element displayed as a modal&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:picture-in-picture" rel="noopener noreferrer"&gt;:picture-in-picture&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; elements in picture-in-picture mode&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:open" rel="noopener noreferrer"&gt;:open&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets open elements like &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:popover-open" rel="noopener noreferrer"&gt;:popover-open&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets an element currently open as a popover&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⌨️ Input Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Used to target input elements based on their state, validation, and user interaction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:autofill" rel="noopener noreferrer"&gt;:autofill&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets form fields filled in automatically by the browser&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:enabled" rel="noopener noreferrer"&gt;:enabled&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets input elements that are enabled&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled" rel="noopener noreferrer"&gt;:disabled&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets input elements that are disabled&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only" rel="noopener noreferrer"&gt;:read-only&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets input elements that are read-only&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:placeholder-shown" rel="noopener noreferrer"&gt;:placeholder-shown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets input elements that show placeholder text&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:default" rel="noopener noreferrer"&gt;:default&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets default form elements (like a default button)&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:checked" rel="noopener noreferrer"&gt;:checked&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets selected checkboxes or radio buttons&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:blank" rel="noopener noreferrer"&gt;:blank&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets completely empty input fields&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:valid" rel="noopener noreferrer"&gt;:valid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets inputs that pass HTML5 validation&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:user-valid" rel="noopener noreferrer"&gt;:user-valid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets valid inputs &lt;em&gt;after&lt;/em&gt; user interaction&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid" rel="noopener noreferrer"&gt;:invalid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets inputs that fail HTML5 validation&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:user-invalid" rel="noopener noreferrer"&gt;:user-invalid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets invalid inputs &lt;em&gt;after&lt;/em&gt; user interaction&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:in-range" rel="noopener noreferrer"&gt;:in-range&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets inputs with values within a valid range&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:out-of-range" rel="noopener noreferrer"&gt;:out-of-range&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets inputs with values outside the valid range&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:required" rel="noopener noreferrer"&gt;:required&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets required input fields&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:optional" rel="noopener noreferrer"&gt;:optional&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets optional input fields&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌍 Location Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Target links or elements based on the URL or fragment identifier.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:any-link" rel="noopener noreferrer"&gt;:any-link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets all &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; elements with an href, whether visited or not&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:link" rel="noopener noreferrer"&gt;:link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets links that have &lt;em&gt;not&lt;/em&gt; been visited&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:visited" rel="noopener noreferrer"&gt;:visited&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets links that &lt;em&gt;have&lt;/em&gt; been visited&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:local-link" rel="noopener noreferrer"&gt;:local-link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets links pointing to the same page (internal links)&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:target" rel="noopener noreferrer"&gt;:target&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements that match the URL fragment identifier (e.g., &lt;code&gt;#section&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌳 Tree-structural Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Used to target elements based on DOM structure.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:root" rel="noopener noreferrer"&gt;:root&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the root element of the document (usually &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;)—great for global CSS vars&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:empty" rel="noopener noreferrer"&gt;:empty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements with no children (including text/comments)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child" rel="noopener noreferrer"&gt;:first-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the first child of its parent&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type" rel="noopener noreferrer"&gt;:first-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the first sibling of its type&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child" rel="noopener noreferrer"&gt;:last-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the last child of its parent&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:last-of-type" rel="noopener noreferrer"&gt;:last-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the last sibling of its type&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child" rel="noopener noreferrer"&gt;:nth-child()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements based on their position among siblings&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-child" rel="noopener noreferrer"&gt;:nth-last-child()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements from the end based on their position&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type" rel="noopener noreferrer"&gt;:nth-of-type()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets siblings of the same type based on order&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-of-type" rel="noopener noreferrer"&gt;:nth-last-of-type()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets same-type siblings from the end&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:only-child" rel="noopener noreferrer"&gt;:only-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements that are the only child of their parent&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:only-of-type" rel="noopener noreferrer"&gt;:only-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements that are the only one of their type among siblings&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🖱️ User Action Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;These target elements based on user interaction like hovering, clicking, or focusing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:hover" rel="noopener noreferrer"&gt;:hover&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements when hovered&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:active" rel="noopener noreferrer"&gt;:active&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements during active state (click or tap)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus" rel="noopener noreferrer"&gt;:focus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets elements receiving focus&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible" rel="noopener noreferrer"&gt;:focus-visible&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Focus styles shown only when navigating with keyboard/tab&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within" rel="noopener noreferrer"&gt;:focus-within&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets an element that contains a focused child element&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 Functional Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;These pseudo-classes use parentheses &lt;code&gt;()&lt;/code&gt; to create more dynamic and flexible selectors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:is" rel="noopener noreferrer"&gt;:is()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Simplifies writing complex selectors. Great for targeting multiple elements at once&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:where" rel="noopener noreferrer"&gt;:where()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;:is()&lt;/code&gt;, but doesn’t add specificity. Perfect for resets or default styling&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:has" rel="noopener noreferrer"&gt;:has()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A powerful parent selector that targets elements based on their children or content&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:not" rel="noopener noreferrer"&gt;:not()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Excludes elements that match a certain selector&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;These four pseudo-classes are powerful and highly recommended for writing expressive and maintainable CSS selectors.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: The priority ratings above are entirely based on my personal opinion. Feel free to adjust based on your own needs and experience.&lt;/p&gt;

&lt;p&gt;If you found this cheat sheet helpful, feel free to 💖 save it, 🗨️ leave a comment, or 🔁 share it with other web developers!&lt;/p&gt;

&lt;p&gt;See you in the next post 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>CSS Pseudo-classes Cheat Sheet 🔍</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Mon, 26 May 2025 03:43:37 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/css-pseudo-classes-cheat-sheet-1j18</link>
      <guid>https://dev.to/sejutaimpian/css-pseudo-classes-cheat-sheet-1j18</guid>
      <description>&lt;p&gt;CSS memiliki banyak pseudo-class yang memungkinkan kita menarget elemen berdasarkan status, struktur, dan interaksi. Berikut ini adalah ringkasan beberapa pseudo-class yang dikelompokkan berdasarkan kategori, lengkap dengan deskripsi singkat dan tingkat prioritas mempelajarinya.&lt;/p&gt;




&lt;h2&gt;
  
  
  👁️ Element display state pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Pseudo-class berikut digunakan untuk menarget elemen berdasarkan status tampilannya.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:fullscreen" rel="noopener noreferrer"&gt;:fullscreen&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen saat berada dalam mode fullscreen&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:modal" rel="noopener noreferrer"&gt;:modal&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen  yang sedang terbuka sebagai modal&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:picture-in-picture" rel="noopener noreferrer"&gt;:picture-in-picture&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen  saat berada dalam mode picture-in-picture
&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:open" rel="noopener noreferrer"&gt;:open&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen seperti  yang sedang terbuka&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:popover-open" rel="noopener noreferrer"&gt;:popover-open&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang sedang terbuka sebagai popover&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⌨️ Input pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Digunakan untuk menarget elemen input berdasarkan status, validasi, dan interaksi pengguna.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:autofill" rel="noopener noreferrer"&gt;:autofill&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan field form yang diisi otomatis oleh browser&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:enabled" rel="noopener noreferrer"&gt;:enabled&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen input yang tidak dinonaktifkan&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled" rel="noopener noreferrer"&gt;:disabled&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen input yang dinonaktifkan&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only" rel="noopener noreferrer"&gt;:read-only&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen input yang bersifat hanya-baca&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:placeholder-shown" rel="noopener noreferrer"&gt;:placeholder-shown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input yang sedang menampilkan placeholder&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:default" rel="noopener noreferrer"&gt;:default&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen input yang menjadi pilihan default&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:checked" rel="noopener noreferrer"&gt;:checked&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input seperti checkbox/radio yang tercentang&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:blank" rel="noopener noreferrer"&gt;:blank&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input kosong (belum diisi sama sekali)&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:valid" rel="noopener noreferrer"&gt;:valid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input yang lolos validasi HTML5&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:user-valid" rel="noopener noreferrer"&gt;:user-valid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input valid &lt;em&gt;setelah&lt;/em&gt; ada interaksi user&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid" rel="noopener noreferrer"&gt;:invalid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input yang gagal validasi HTML5&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:user-invalid" rel="noopener noreferrer"&gt;:user-invalid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input tidak valid &lt;em&gt;setelah&lt;/em&gt; ada interaksi user&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:in-range" rel="noopener noreferrer"&gt;:in-range&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input dengan nilai di dalam rentang yang valid&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:out-of-range" rel="noopener noreferrer"&gt;:out-of-range&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input dengan nilai di luar rentang yang valid&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:required" rel="noopener noreferrer"&gt;:required&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input yang wajib diisi&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:optional" rel="noopener noreferrer"&gt;:optional&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan input yang tidak wajib diisi&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌍 Location Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Digunakan untuk menarget link atau elemen berdasarkan URL dan fragment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:any-link" rel="noopener noreferrer"&gt;:any-link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan semua elemen &lt;a&gt; dengan atribut href, baik yang dikunjungi maupun belum&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:link" rel="noopener noreferrer"&gt;:link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan link yang &lt;em&gt;belum&lt;/em&gt; dikunjungi&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:visited" rel="noopener noreferrer"&gt;:visited&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan link yang &lt;em&gt;sudah&lt;/em&gt; dikunjungi&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:local-link" rel="noopener noreferrer"&gt;:local-link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan link yang mengarah ke halaman yang sama (internal link)&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:target" rel="noopener noreferrer"&gt;:target&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang sesuai dengan fragment identifier di URL (misalnya #section)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:target-within" rel="noopener noreferrer"&gt;:target-within&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang &lt;em&gt;mengandung&lt;/em&gt; target&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌳 Tree-structural Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Digunakan untuk menarget elemen berdasarkan struktur DOM-nya.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:root" rel="noopener noreferrer"&gt;:root&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen root dari dokumen (biasanya )—berguna untuk deklarasi CSS global seperti variabel&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:empty" rel="noopener noreferrer"&gt;:empty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang tidak memiliki anak (termasuk teks, komentar, dan elemen)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child" rel="noopener noreferrer"&gt;:first-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang merupakan anak pertama dari parent-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type" rel="noopener noreferrer"&gt;:first-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen pertama dari jenisnya di antara sibling-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child" rel="noopener noreferrer"&gt;:last-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen terakhir dari parent-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:last-of-type" rel="noopener noreferrer"&gt;:last-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen terakhir dari jenisnya di antara sibling-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child" rel="noopener noreferrer"&gt;:nth-child()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen berdasarkan urutan posisinya dalam parent&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-child" rel="noopener noreferrer"&gt;:nth-last-child()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen dari belakang berdasarkan urutan dalam parent&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type" rel="noopener noreferrer"&gt;:nth-of-type()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen berdasarkan urutan dari jenisnya di antara sibling-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-of-type" rel="noopener noreferrer"&gt;:nth-last-of-type()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen terakhir dari jenisnya di antara sibling-nya dari belakang&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:only-child" rel="noopener noreferrer"&gt;:only-child&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang merupakan satu-satunya anak dari parent-nya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:only-of-type" rel="noopener noreferrer"&gt;:only-of-type&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang merupakan satu-satunya dari jenisnya di antara sibling-nya&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🖱️ User Action Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Menargetkan elemen berdasarkan interaksi pengguna seperti hover, klik, atau fokus.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:hover" rel="noopener noreferrer"&gt;:hover&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen saat pointer berada di atasnya&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:active" rel="noopener noreferrer"&gt;:active&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen saat sedang di-&lt;em&gt;klik&lt;/em&gt; atau di-&lt;em&gt;tap&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus" rel="noopener noreferrer"&gt;:focus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen saat mendapatkan fokus input (keyboard, mouse, dll)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible" rel="noopener noreferrer"&gt;:focus-visible&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fokus hanya terlihat ketika pengguna menavigasi dengan keyboard/tab (bukan mouse)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within" rel="noopener noreferrer"&gt;:focus-within&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen yang memiliki anak yang sedang fokus&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 Functional Pseudo-classes
&lt;/h2&gt;

&lt;p&gt;Ini adalah pseudo-class dengan tanda kurung () dan biasanya digunakan untuk membuat selector lebih dinamis dan fleksibel.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-class&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Prioritas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:is" rel="noopener noreferrer"&gt;:is()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menyederhanakan penulisan selector kompleks. Cocok untuk menarget banyak elemen sekaligus.&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:where" rel="noopener noreferrer"&gt;:where()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Mirip seperti :is(), tapi tidak berkontribusi pada specificity (sangat berguna untuk reset atau default styling)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:has" rel="noopener noreferrer"&gt;:has()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Selector powerful yang bisa memilih elemen berdasarkan anak/cucu atau kontennya (parent selector!)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:not" rel="noopener noreferrer"&gt;:not()&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Menargetkan elemen &lt;strong&gt;kecuali&lt;/strong&gt; yang memenuhi selector tertentu&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Keempat pseudo-class ini sangat powerful dan wajib dikuasai karena membuat kita bisa menulis selector yang lebih ekspresif dan maintainable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Disclaimer: Penilaian kolom prioritas datangnya murni dari opini saya sendiri. Jadi jika kamu tidak setuju, silakan sesuaikan.&lt;/p&gt;

&lt;p&gt;Kalau kamu suka cheat sheet ini, jangan lupa 💖 save, 🗨️ comment, atau 🔁 share ke sesama web developer lainnya!&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan selanjutnya 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>🔍 How to Access x-data from Outside an Alpine.js Component (Without Alpine.store)</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Sat, 24 May 2025 01:22:55 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/how-to-access-x-data-from-outside-an-alpinejs-component-without-alpinestore-42hc</link>
      <guid>https://dev.to/sejutaimpian/how-to-access-x-data-from-outside-an-alpinejs-component-without-alpinestore-42hc</guid>
      <description>&lt;p&gt;By default, data defined inside &lt;code&gt;x-data&lt;/code&gt; in Alpine.js is only accessible within the element where it’s initialized—and its child elements.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Awesome' }"&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;Main Content&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;Footer&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, you &lt;strong&gt;can’t access&lt;/strong&gt; the &lt;code&gt;title&lt;/code&gt; value from the &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; element because it’s outside the &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;🤔 Common Solution: Move &lt;code&gt;x-data&lt;/code&gt; Up &lt;br&gt;
A typical solution would be to move the &lt;code&gt;x-data&lt;/code&gt; up to a common parent, like &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. This works but comes with a drawback: you’ll end up with &lt;strong&gt;prop drilling hell&lt;/strong&gt;—passing data down manually through several components. 😫&lt;/p&gt;

&lt;p&gt;💡 Better Solution: Use a Global Store &lt;br&gt;
Alpine has a built-in global store feature called &lt;a href="https://alpinejs.dev/globals/alpine-store" rel="noopener noreferrer"&gt;Alpine.store&lt;/a&gt;, similar to React's Context API. It’s a great solution when you need to share state across many components.&lt;/p&gt;

&lt;p&gt;But sometimes, you don’t need full global state—just a &lt;strong&gt;quick way to update one component’s state from the outside&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post will walk you through &lt;strong&gt;3 practical ways&lt;/strong&gt; to access or modify &lt;code&gt;x-data&lt;/code&gt; from outside a component &lt;strong&gt;without using Alpine.store&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 1. Passing $data to a JavaScript Function
&lt;/h2&gt;

&lt;p&gt;Alpine exposes a &lt;code&gt;$data&lt;/code&gt; reference that contains all the reactive properties of your component. You can pass this to a regular JS function and update the state there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.html --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: "&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;AlpineJS&lt;/span&gt; &lt;span class="na"&gt;Suck&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"setTitle($data)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Change Title&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// script.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📝 Use this when you want to update Alpine state from an external JS file.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 2. Manipulate State with Alpine.$data()
&lt;/h2&gt;

&lt;p&gt;This is an &lt;strong&gt;undocumented&lt;/strong&gt; trick shared by an Alpine.js maintainer in the article &lt;a href="https://awesomealpine.com/posts/underrated-alpine-api/" rel="noopener noreferrer"&gt;Underrated Alpine API Features&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Suck' }"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"trigger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Change from Outside&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trigger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#trigger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Alpine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;code&gt;Alpine.$data(el)&lt;/code&gt; gives you access to the component's internal data—so you can manipulate it directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 3. Access from Another Alpine Component
&lt;/h2&gt;

&lt;p&gt;Let’s say you want a component in &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; to update the state inside &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Suck' }"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{
    updateTitle() {
      Alpine.$data(document.querySelector('#header')).title = 'AlpineJS Awesome';
    }
  }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"updateTitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Update Title&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Quick tip: If you give an element an &lt;code&gt;id="header"&lt;/code&gt;, many browsers automatically expose it as a global JS variable. So instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Alpine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can shorten it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Alpine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💻 Bonus Demo
&lt;/h2&gt;

&lt;p&gt;Want to see it in action? Check out the demo here 👉 &lt;a href="https://iCodeThis.com/code/3972" rel="noopener noreferrer"&gt;https://iCodeThis.com/code/3972&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✍️ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you only need to interact with Alpine's reactive data occasionally from outside a component, these lightweight methods are great alternatives to global stores.&lt;/p&gt;

&lt;p&gt;But when your app grows and multiple components need access to the same state, stick with &lt;a href="https://alpinejs.dev/globals/alpine-store" rel="noopener noreferrer"&gt;Alpine.store&lt;/a&gt; for maintainability.&lt;/p&gt;

&lt;p&gt;✨ Hope this helped! If you know other tips or have questions about Alpine.js, feel free to drop a comment.&lt;br&gt;
See you in the next post 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>alpinejs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🔍 Cara Mengakses x-data dari Luar Komponen Alpine.js (Tanpa Alpine.store)</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Sat, 24 May 2025 00:54:16 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/cara-mengakses-x-data-dari-luar-komponen-alpinejs-tanpa-alpinestore-18o9</link>
      <guid>https://dev.to/sejutaimpian/cara-mengakses-x-data-dari-luar-komponen-alpinejs-tanpa-alpinestore-18o9</guid>
      <description>&lt;p&gt;Secara default, data yang kamu deklarasikan di dalam &lt;code&gt;x-data&lt;/code&gt; hanya bisa diakses oleh elemen tempat &lt;code&gt;x-data&lt;/code&gt; itu di-mount dan turunannya. Misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Awesome' }"&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;Isi Content&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;Footer&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di contoh di atas, kamu &lt;strong&gt;nggak bisa&lt;/strong&gt; akses &lt;code&gt;title&lt;/code&gt; dari elemen &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;. Data tersebut hanya hidup di &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; dan child-nya saja.&lt;/p&gt;

&lt;p&gt;🤔 Solusi Umum: Pindahkan ke Atas &lt;br&gt;
Solusi pertama yang terlintas biasanya: &lt;strong&gt;pindahkan&lt;/strong&gt; &lt;code&gt;x-data&lt;/code&gt; &lt;strong&gt;ke parent-nya&lt;/strong&gt;, misalnya ke &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. Tapi ini bisa menjebak kamu dalam &lt;strong&gt;prop drilling hell&lt;/strong&gt; — seperti di React, data harus "diturunkan" manual ke banyak anak komponen. 😩&lt;/p&gt;

&lt;p&gt;💡 Solusi Lebih Baik: Gunakan Global Store &lt;br&gt;
Alpine punya built-in global store bernama &lt;a href="https://alpinejs.dev/globals/alpine-store" rel="noopener noreferrer"&gt;Alpine.store&lt;/a&gt;, mirip dengan context di React. Cocok untuk data global yang sering diakses dari berbagai tempat.&lt;/p&gt;

&lt;p&gt;Tapi… kadang kita nggak butuh global, cuma pengen "sesekali" ubah state dari luar komponen.&lt;/p&gt;

&lt;p&gt;Nah, artikel ini akan membahas &lt;strong&gt;3 alternatif&lt;/strong&gt; cara mengakses atau memanipulasi data &lt;code&gt;x-data&lt;/code&gt; dari luar komponen &lt;em&gt;tanpa harus pakai store&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 1. Passing $data ke Fungsi JavaScript
&lt;/h2&gt;

&lt;p&gt;Alpine punya binding &lt;code&gt;$data&lt;/code&gt; yang berisi semua properti dalam &lt;code&gt;x-data&lt;/code&gt;. Kamu bisa &lt;strong&gt;lempar&lt;/strong&gt; &lt;code&gt;$data&lt;/code&gt; &lt;strong&gt;ke fungsi eksternal&lt;/strong&gt; dan ubah di sana.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.html --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: "&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;AlpineJS&lt;/span&gt; &lt;span class="na"&gt;Suck&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"setTitle($data)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Change Title&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// script.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📝 Cocok untuk: ketika ingin mengubah data Alpine dari file JavaScript biasa.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 2. Manipulasi via Alpine.$data()
&lt;/h2&gt;

&lt;p&gt;Trik ini &lt;strong&gt;tidak terdokumentasi resmi&lt;/strong&gt;, tapi dibahas oleh salah satu maintainer di artikel &lt;a href="https://awesomealpine.com/posts/underrated-alpine-api/" rel="noopener noreferrer"&gt;Underrated Alpine API Features&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Suck' }"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"trigger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Change from Outside&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trigger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#trigger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Alpine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Kuncinya: &lt;code&gt;Alpine.$data(el)&lt;/code&gt; akan mengembalikan data dari elemen Alpine yang dimaksud.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 3. Mengakses dari Komponen Lain
&lt;/h2&gt;

&lt;p&gt;Misalnya kamu punya komponen lain (misalnya di &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;) yang ingin mengubah data di &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ title: 'AlpineJS Suck' }"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;x-text=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{
    updateTitle() {
      Alpine.$data(document.querySelector('#header')).title = 'AlpineJS Awesome';
    }
  }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"updateTitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Update Title&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Fun fact: Kalau kamu pakai &lt;code&gt;id="header"&lt;/code&gt;, maka &lt;code&gt;header&lt;/code&gt; langsung jadi variabel global di JS (di banyak browser modern). Jadi kode tadi bisa disingkat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Alpine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AlpineJS Awesome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Bonus Demo
&lt;/h2&gt;

&lt;p&gt;Lihat demo lengkapnya di sini 👉 &lt;a href="https://iCodeThis.com/code/3972" rel="noopener noreferrer"&gt;https://iCodeThis.com/code/3972&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✍️ Penutup
&lt;/h2&gt;

&lt;p&gt;Kalau kamu cuma butuh akses data Alpine secara ringan dari luar komponen, gunakan teknik &lt;code&gt;$data&lt;/code&gt; atau &lt;code&gt;Alpine.$data()&lt;/code&gt; ini. Lebih fleksibel daripada harus memindahkan semuanya ke store.&lt;/p&gt;

&lt;p&gt;Tapi kalau kamu butuh state global yang diakses dari banyak tempat, tetap gunakan &lt;a href="https://alpinejs.dev/globals/alpine-store" rel="noopener noreferrer"&gt;Alpine.store&lt;/a&gt; ya!&lt;/p&gt;

&lt;p&gt;🚀 Semoga tips ini bermanfaat. Kalau kamu punya cara lain atau pengalaman menarik seputar Alpine, share di komentar!&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan selanjutnya 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>alpinejs</category>
      <category>javascript</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>🎭 Must-Know CSS Pseudo-elements (and When to Use Them)</title>
      <dc:creator>Eris Sulistina</dc:creator>
      <pubDate>Tue, 20 May 2025 01:11:23 +0000</pubDate>
      <link>https://dev.to/sejutaimpian/must-know-css-pseudo-elements-and-when-to-use-them-3a48</link>
      <guid>https://dev.to/sejutaimpian/must-know-css-pseudo-elements-and-when-to-use-them-3a48</guid>
      <description>&lt;p&gt;If you’ve ever styled a &lt;code&gt;placeholder&lt;/code&gt; inside an &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, you’ve already met a &lt;strong&gt;pseudo-element&lt;/strong&gt; — even if you didn’t realize it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 What Are Pseudo-elements?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;In simple terms: pseudo-elements are "&lt;strong&gt;virtual elements&lt;/strong&gt;" that let you style specific parts of an element that you normally can’t target with regular selectors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, when you do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nd"&gt;::placeholder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;silver&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're not styling the whole input — you're specifically targeting the placeholder &lt;em&gt;inside&lt;/em&gt; it. That placeholder is a &lt;strong&gt;pseudo-element&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;All pseudo-elements start with a double colon &lt;code&gt;::&lt;/code&gt;, like &lt;code&gt;::before&lt;/code&gt;, &lt;code&gt;::after&lt;/code&gt;, or &lt;code&gt;::selection&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Want to explore the full list? Check out the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements" rel="noopener noreferrer"&gt;MDN docs on Pseudo-elements&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📋 Common Pseudo-elements You Should Know
&lt;/h2&gt;

&lt;p&gt;Here’s a quick reference table of useful pseudo-elements, what they do, and how important they are (in my opinion 😉):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-element&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::after" rel="noopener noreferrer"&gt;::after&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inserts content &lt;em&gt;after&lt;/em&gt; an element&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::before" rel="noopener noreferrer"&gt;::before&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inserts content &lt;em&gt;before&lt;/em&gt; an element&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::selection" rel="noopener noreferrer"&gt;::selection&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles the part of text the user selects&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::file-selector-button" rel="noopener noreferrer"&gt;::file-selector-button&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles the button inside &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::marker" rel="noopener noreferrer"&gt;::marker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles bullets or numbers in lists&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::backdrop" rel="noopener noreferrer"&gt;::backdrop&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles the overlay behind &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::details-content" rel="noopener noreferrer"&gt;::details-content&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Targets the content of a &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter" rel="noopener noreferrer"&gt;::first-letter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles the first letter of a block&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::first-line" rel="noopener noreferrer"&gt;::first-line&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles the first line of text&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::target-text" rel="noopener noreferrer"&gt;::target-text&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Highlights text targeted by URL fragment&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::cue" rel="noopener noreferrer"&gt;::cue&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Styles video captions (WebVTT)&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API#pseudo-elements" rel="noopener noreferrer"&gt;::view-transition and friends&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Powers page transition animations&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The priority stars are totally subjective, based on my dev experience. Feel free to disagree or reorder based on your needs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧪 How to See Pseudo-elements in Action?
&lt;/h2&gt;

&lt;p&gt;Most browser dev tools (like Chrome and Firefox) let you inspect pseudo-elements directly in the Elements tab. Open DevTools, select an element, and you’ll often see &lt;code&gt;::before&lt;/code&gt;, &lt;code&gt;::after&lt;/code&gt;, or others appear in the sidebar when used.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✍️ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Pseudo-elements are small but powerful — they let you enhance your UI without bloating your HTML with extra tags.&lt;/p&gt;

&lt;p&gt;Hope this list helps you recognize and use them more effectively in your next project! 🚀&lt;/p&gt;

&lt;p&gt;If you found this useful, drop a ❤️ or share your favorite pseudo-element in the comments!&lt;/p&gt;

&lt;p&gt;See you in the next post! 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
    </item>
  </channel>
</rss>
