All blogs / Frontend / CSS / browsers
Lea Verou’s blog
Web standards, Software Engineering, Product, Usability, and more
Frontend / CSS / browsersWeb developmentJavaScript / TypeScriptEngineering blogs
- Posts
- 263 from 10 Feb 2009 to 11 Oct 2026
- Posting
- monthly (7 in the last year)
- Kind
- personal blog
- Feed
- https://lea.verou.me/feed.xml
2026 7
2025 8
2024 8
- Context Chips in Survey Design: “Okay, but how does it _feel_?”
- 7 posts 2024
- Web Components are not Framework Components — and That’s Okay
- Making the Web more Awesome — for everyone
- Forget “show, don’t tell”. Engage, don’t show!
- Inline conditionals in CSS, now?
- Inline conditionals in CSS?
- On automatically generating contrasting text colors with CSS
2023 13
- Eigensolutions: composability as the antidote to overfit
- 11 posts 2023
- Minimalist Affordances: Making the right tradeoffs
- State of HTML 2023 now open!
- Numbers or Brackets for numeric questions?
- Help Design the Inaugural State of HTML Survey!
- Going Lean
- Rethinking Categorization
- 11ty: Index ALL the things!
- Migrating Disqus from WP to 11ty
- JS private class fields considered harmful
- JS private class fields considered harmful
- Contrast Ratio has a new home — and this is great news!
2022 8
- Position Statement for the 2022 W3C TAG Election
- 7 posts 2022
- State of CSS 2022 now open!
- On ratings and meters
- Help design the State of CSS Survey 2022!
- What is the best way to mark up an exclusive button group?
- Introducing Rety: live coding, without the stress
- Releasing Color.js: A library that takes color seriously
2021 8
- On Yak Shaving and `<md-block>`, a new HTML element for Markdown
- 7 posts 2021
- Custom properties with defaults: 3+1 strategies
- Inherit ancestor font-size, for fun and profit
- Is the current tab active?
- 82% of developers get this 3 line CSS quiz wrong
- Dark mode in 5 minutes, with inverted lightness variables
- Mass function overloading: why and how?
2020 18
- Writable getters
- 17 posts 2020
- Position Statement for the 2020 W3C TAG Election
- The case for Weak Dependencies in JS
- Simple pie charts with fallback, today
- The --var: ; hack to toggle multiple values with one custom property
- The failed promise of Web Components
- Developer priorities throughout their career
- Parsel: A tiny, permissive CSS selector parser
- Introspecting CSS via the CSS OM: Get supported properties, shorthands, longhands
- Import non-ESM libraries in ES Modules, with client-side vanilla JS
- Releasing MaVoice: A free app to vote on repo issues
- The Cicada Principle, revisited with CSS variables
- Refactoring optional chaining into a large codebase: lessons learned
- Hybrid positioning with CSS variables and max()
- New decade, new theme
- Today's Javascript, from an outsider's perspective
- LCH colors in CSS: what, why, and how?
2019 3
2018 8
2017 5
2016 6
2015 11
- My positive experience as a woman in tech
- 10 posts 2015
- Introducing Bliss: A 3KB library for happier Vanilla JS
- Copying object properties, the robust way
- On the blindness of blind reviews
- Stretchy: Form element autosizing, the way it should be
- Spot the unsubscribe (link)!
- Conical gradients, today!
- Idea: Extending native DOM prototypes without collisions
- jQuery considered harmful
- Awesomplete: 2KB autocomplete with zero dependencies
2014 8
- An easy notation for grayscale colors
- 7 posts 2014
- Image comparison slider with pure CSS
- Dynamically generated SVG through SASS + A 3D animated RGB cube!
- I’m going to MIT!!
- Introducing Whathecolor: A color game for web developers!
- Vote for me in the net awards 2014!
- Smooth state animations with animation-play-state
2013 16
- Simple script: Automatic talks list
- 15 posts 2013
- CSS is for developers
- Cleanest CSS spinner, ever
- Flexible Google-style loader with CSS
- Slanted tabs with CSS 3D transforms
- What makes speakers happy
- Leaving W3C
- Meet dpi.lv: More than you probably wanted to know about screen DPI
- Can we get rid of gradient prefixes?
- border-corner-shape is in danger, and you can help!
- Preview corner-shape, before implementations!
- Easily center text vertically, with SVG!
- Use MathML today, with CSS fallback!
- iOS 6 switch style checkboxes with pure CSS
- W3Conf in San Francisco, February 21-22
2012 29
- One year of pastries
- 28 posts 2012
- CSS Animations with only one keyframe
- Lots of improvements coming to dabblet
- Easy color contrast ratios
- Dive deep into CSS3 (and Bolognese!) in Bologna, Italy
- lea@w3․org
- Introducing Prism: An awesome new syntax highlighter
- Important -prefix-free update
- So, you’ve been invited to speak
- Why I bought a high-end MacBook Air instead of the Retina MBP
- Hacking lookahead to mimic intersection, subtraction and negation
- Teaching: General case first or special cases first?
- Poll: ¿Is animation-direction a good idea?
- Text masking — The standards way
- How I got into web development — the long version
- Pure CSS scrolling shadows with background-attachment: local
- git commit -m "EVERYTHING"
- In defense of reinventing wheels
- Flexible multiline definition lists with 2 lines of CSS 2.1
- A List Apart article: Every time you call a proprietary feature "CSS3", a kitten dies
- Vendor prefixes, the CSS WG and me
- Moving an element along a circle
- Simpler CSS typing animation, with the ch unit
- Exactly how much CSS3 does your browser support?
- Why tabs are clearly superior
- My new year’s resolution
- What we still can’t do client-side
- Dabblet blog
2011 51
- On web apps and their keyboard shortcuts
- 50 posts 2011
- Introducing dabblet: An interactive CSS playground
- Vendor prefixes have failed, what’s next?
- Animatable: A CSS transitions gallery
- My experience from Fronteers, JSConf EU, Frontend and FromTheFront
- Optimizing long lists of yes/no values with JavaScript
- Easily keep gh-pages in sync with master
- PrefixFree: Break free from CSS prefix hell!
- My experience from Frontendconf Zurich
- Major update to Chainvas: modularity, a client side build script & more
- A better tool for cubic-bezier() easing
- Chainvas: Make APIs chainable, enhance the canvas API
- Help the community: report browser bugs
- Pure CSS3 typing animation with steps()
- CSS.coloratum: Convert and share CSS colors
- On URL readability
- To write good code, you sometimes have to write bad code
- Accessible star rating widget with pure CSS
- Why I love our industry
- Better “CSS3 ticket-like tags”
- twee+: Longer tweets, no strings attached
- CSS gradients are faster than SVG backgrounds
- CSS3 for developers: My Fronteers 2011 workshop
- My experience from the CSS Summit 2011
- Vote for me in The .net awards 2011!
- Detecting CSS selectors support + my JSConf EU talk
- A polyfill for HTML5 progress element, the obsessive perfectionist way
- CSS reflections for Firefox, with -moz-element() and SVG masks
- Pure CSS Tic Tac Toe
- jQuery Pure: Call for contributors
- My experience from Web Directions @media & Standards.next
- Get your hash — the bulletproof way
- My experience from Geek Meet
- Change URL hash without page jump
- StronglyTyped: A library for strongly typed properties & constants in JavaScript
- Rule filtering based on specific selector(s) support
- CSS3 patterns gallery and a new pattern
- Invert a whole webpage with CSS only
- Create complex RegExps more easily
- Convert standard gradient syntax to -webkit-gradient and others
- Beveled corners & negative border-radius with CSS3 gradients
- On CSS preprocessors
- WD @media talk subject change
- Custom <select> drop downs with CSS3
- Checkerboard pattern with CSS3
- Incrementable length values in text fields
- Convert PHP serialized data to Unicode
- Styling elements based on sibling count
- Yet another redesign
- I'm speaking at @media Web Directions ’11!
2010 17
- Checkerboard, striped & other background patterns with CSS3 gradients
- 16 posts 2010
- rgba.php v1.2: Improved URL syntax, now at Github
- Tag editing UIs
- The curious case of border-radius:50%
- My FT2010 slides and CSSS: My presentation framework
- On attr() and calc()
- Automatic login via notification emails?
- Lea Verou @ Front-Trends 2010
- Organizing a university course on modern Web development
- "Wow, Mona Lisa with pure CSS!"
- On CSS counters plus a CSS3 Reversi UI
- MySQL: Are you actually utilizing your indexes?
- CSS3 structural pseudo-class selector tester
- CSSNinja's custom forms revisited to work with CSS sprites
- iPhone keyboard with CSS3 -- no images
- Redesign
2009 39
- Quickly find the Gravatar that corresponds to a given email
- 38 posts 2009
- Reading cookies the regular expression way
- Yet another email hiding technique?
- Exploring browser-supported Unicode characters and a tweet shortening experiment
- A different approach to elastic textareas
- New version of rgba.php is out!
- A CSS3 learning(?) tool
- Exploring CSS3 text-shadow
- (byte)size matters
- Idea: The simplest registration form ever
- Bevels in CSS3
- On password masking and usability
- Tip: Multi-step form handling
- 9 reasons why I prefer MySQL to MS SQL Server
- Cross-browser imageless linear gradients v2
- Creating the perfect slider
- Java pretty dates
- Better usability in 5 minutes
- Help me: take the color survey
- Advocacy of JavaScript
- Extend Math.log to allow for bases != e
- 100% Cyan in CMYK is NOT rgb(0,255,255)!!
- Cross browser, imageless linear gradients
- Mockup viewer bookmarklet
- CSS3 colors, today (MediaCampAthens session)
- CMYK colors in CSS: Useful or useless?
- On native, single-input, multiple file uploads
- Check whether the browser supports RGBA (and other CSS3 values)
- "Appearances can be deceiving Mr. Anderson" - a.k.a. short code is not always fast code
- Quick & dirty way to run snippets of JavaScript anywhere
- 20 things you should know when not using a JS library
- Silent, automatic updates are the way to go
- Bulletproof, cross-browser RGBA backgrounds, today
- Find the vendor prefix of the current browser
- CSS3 border-radius, today
- Extend Math.round, Math.ceil and Math.floor to allow for precision
- JS library detector
- Check whether a CSS property is supported