<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>CSS on Vedant Andhale</title>
    <link>https://www.vedant.me/tags/css/</link>
    <description>Recent content in CSS on Vedant Andhale</description>
    <image>
      <url>https://www.vedant.me/</url>
      <link>https://www.vedant.me/</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 10 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.vedant.me/tags/css/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Use :focus-visible without losing keyboard focus</title>
      <link>https://www.vedant.me/notebook/css-focus-visible-vs-focus/</link>
      <pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.vedant.me/notebook/css-focus-visible-vs-focus/</guid>
      <description>Let the browser decide when a focus indicator is needed, and keep a visible fallback.</description>
      <content:encoded><![CDATA[<p><code>:focus</code> matches the focused element. <code>:focus-visible</code> matches it when the browser&rsquo;s heuristics indicate that a visible focus indicator should be shown.</p>
<p>That is more precise than saying it means “keyboard focus only.” A text input can need a visible indicator even when someone clicks it.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* A visible fallback, including browsers without :focus-visible. */</span>
</span></span><span class="line"><span class="cl"><span class="nt">a</span><span class="p">:</span><span class="nd">focus</span><span class="o">,</span> <span class="nt">button</span><span class="p">:</span><span class="nd">focus</span><span class="o">,</span> <span class="nt">input</span><span class="p">:</span><span class="nd">focus</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">outline</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="mh">#58a6ff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">outline-offset</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">supports</span> <span class="nt">selector</span><span class="o">(</span><span class="p">:</span><span class="nd">focus-visible</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">a</span><span class="p">:</span><span class="nd">focus</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">:</span><span class="nd">focus-visible</span><span class="o">),</span>
</span></span><span class="line"><span class="cl">  <span class="nt">button</span><span class="p">:</span><span class="nd">focus</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">:</span><span class="nd">focus-visible</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">outline</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The example keeps input focus visible and only removes the link/button outline when the browser says the indicator is unnecessary. Adjust the colour for the actual surface; a colour that works on a dark background may be too faint on a light one.</p>
<p>After styling, move through the page with Tab and Shift+Tab. Check links, icon buttons and inputs, including elements inside clipped or scrolling containers. A correct selector does not help if the outline is hidden behind another element.</p>
<p>Reference: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:focus-visible">MDN on :focus-visible</a>.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
