{"id":696,"date":"2024-01-31T08:08:41","date_gmt":"2024-01-31T14:08:41","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=696"},"modified":"2024-02-08T20:47:37","modified_gmt":"2024-02-09T02:47:37","slug":"heads-up-on-custom-scrollbars-chrome-is-supporting-the-standard-now-which-overrides-the-old-pseudo-elements","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/heads-up-on-custom-scrollbars-chrome-is-supporting-the-standard-now-which-overrides-the-old-pseudo-elements\/","title":{"rendered":"Heads Up on Custom Scrollbars. Chrome is Supporting the Standard Now, which Overrides The Old Pseudo Elements"},"content":{"rendered":"\n<p>There was quite a long period of time (say 2011-2024) where if you wanted to style scrollbars in CSS, your best bet was using the pseudo elements <code>::-webkit-scrollbar<\/code> and friends (there were about 7 of them). That got you custom scrollbars in Safari and Chrome and offshoots. Firefox never supported those. They were never really standardized. But around 2018, Firefox started supporting <code>scrollbar-color<\/code> and <code>scrollbar-width<\/code>, where <em>were <\/em>(are) standardized. <\/p>\n\n\n\n<p>These two groups of selectors didn&#8217;t interfere with each other, because browsers either supported one or the other. So for a bunch of years there, you could safely do something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-selector-class\">.custom-scrollbars<\/span> {\n<\/span><\/span><mark class='shcb-loc'><span>  <span class=\"hljs-comment\">\/* For Safari, Chrome, and offshoots *\/<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>  &amp;::-webkit-scrollbar {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">8px<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attribute\">height<\/span>: <span class=\"hljs-number\">8px<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>  &amp;<span class=\"hljs-selector-pseudo\">::-webkit-scrollbar-thumb<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attribute\">background<\/span>: gray;\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">8px<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>  &amp;<span class=\"hljs-selector-pseudo\">::-webkit-scrollbar-track<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attribute\">background<\/span>: transparent;\n<\/span><\/span><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span>  <span class=\"hljs-comment\">\/* For Firefox and offshoots *\/<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>  <span class=\"hljs-selector-tag\">scrollbar-color<\/span>: <span class=\"hljs-selector-tag\">gray<\/span> <span class=\"hljs-selector-tag\">transparent<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-selector-tag\">scrollbar-width<\/span>: <span class=\"hljs-selector-tag\">thin<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now that Chrome 121 has dropped to stable, that&#8217;s changed. <strong>The presence of one of the new properties like <code>scrollbar-color<\/code> overrides the usage of the pseudo elements.<\/strong> So if you were styling like the above, all the sudden it&#8217;s likely that your scrollbars looked a bit different, because the styling possibilities are much more limited with the standardized properties.<\/p>\n\n\n\n<p>For instance, the <code>scrollbar-width<\/code> property only really does <code>auto<\/code>, which ends up about 16px across, or <code>thin<\/code> which is 16px across. If you were doing super chunky scrollbars that went bigger than that, you&#8217;d see them get smaller. If you were doing super thin scrollbars, which may have looked more visually appropriate in constrained areas (although likely an accessibility issue), you&#8217;d see them get bigger.<\/p>\n\n\n\n<p class=\"learn-more\">As general advice, it&#8217;s probably best to transition yourself over to only using the more limited but standardized properties. <\/p>\n\n\n\n<p>But if you&#8217;d like to stick it out with fancier but not standardized pseudo elements, you&#8217;ll need to ensure the new standardized properties do not apply in browsers supporting both (Chrome). So you could do:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-class\">.custom-scrollbars<\/span> {\n  <span class=\"hljs-comment\">\/* Non-Standard, But More Styling-Capable Properties *\/<\/span>\n  &amp;::-webkit-scrollbar {\n    <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">8px<\/span>;\n    <span class=\"hljs-attribute\">height<\/span>: <span class=\"hljs-number\">8px<\/span>;\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">::-webkit-scrollbar-thumb<\/span> {\n    <span class=\"hljs-attribute\">background<\/span>: gray;\n    <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">8px<\/span>;\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">::-webkit-scrollbar-track<\/span> {\n    <span class=\"hljs-attribute\">background<\/span>: transparent;\n  }\n\n  <span class=\"hljs-comment\">\/* Standardized Properties *\/<\/span>\n  <span class=\"hljs-keyword\">@supports<\/span> <span class=\"hljs-keyword\">not<\/span> selector(::-webkit-scrollbar) {\n    <span class=\"hljs-selector-tag\">scrollbar-color<\/span>: <span class=\"hljs-selector-tag\">gray<\/span> <span class=\"hljs-selector-tag\">transparent<\/span>;\n    <span class=\"hljs-selector-tag\">scrollbar-width<\/span>: <span class=\"hljs-selector-tag\">thin<\/span>;\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>(<a href=\"https:\/\/codepen.io\/chriscoyier\/pen\/gOEveZB\">Demo<\/a>)<\/p>\n\n\n\n<p>Looks like Bramus updated a great article <a href=\"https:\/\/developer.chrome.com\/docs\/css-ui\/scrollbar-styling\">on Scrollbar styling<\/a>, showing off the <code>@supports<\/code> method. <\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_dyrvGaj\" src=\"\/\/codepen.io\/anon\/embed\/dyrvGaj?height=450&amp;theme-id=47434&amp;slug-hash=dyrvGaj&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed dyrvGaj\" title=\"CodePen Embed dyrvGaj\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Read that article for a couple of other nuanced little bits (with work arounds) like:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Note that setting the&nbsp;<code>width<\/code>&nbsp;or&nbsp;<code>height<\/code>&nbsp;of&nbsp;<code>::-webkit-scrollbar<\/code>&nbsp;will force render an overlay scrollbar, effectively turning it into a classic scrollbar.<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>There was quite a long period of time (say 2011-2024) where if you wanted to style scrollbars in CSS, your best bet was using the pseudo elements ::-webkit-scrollbar and friends (there were about 7 of them). That got you custom scrollbars in Safari and Chrome and offshoots. Firefox never supported those. They were never really [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":699,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"sig_custom_text":"","sig_image_type":"featured-image","sig_custom_image":0,"sig_is_disabled":false,"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[7,92],"class_list":["post-696","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-css","tag-scrolling"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/01\/custom-scroll-thumb.jpg?fit=1000%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=696"}],"version-history":[{"count":4,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/696\/revisions"}],"predecessor-version":[{"id":767,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/696\/revisions\/767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/699"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}