Skip to Content

How do I make every other row a different color?

Row 1
Row 2
Row 3
Row 4

In this example, we are selecting every even numbered row using :nth-child(even) and applying a light gray background color to it. As a result, we get a table with alternating white and gray rows.

The :nth-child selector allows you to target elements based on their numerical order. You can use keywords like even and odd or numerical values like 2n to precisely control the pattern. This makes :nth-child a very flexible and powerful tool for styling repeating elements like table rows.

Some key advantages of using :nth-child for alternating rows:

– Works across all major browsers
– Simple and lightweight method
– Easy to adjust styling as needed
– Maintains semantic HTML structure

The only real limitation is that styling is restricted to CSS properties like color and background-color. For more complex styling needs, you may need to use additional selectors or classes. But for straightforward zebra striping, :nth-child is ideal.

Using CSS classes

In addition to :nth-child, you can also use CSS classes to define alternating row styles. This involves:

1. Adding custom class names like “even” and “odd” to each table row
2. Creating CSS rules to set different colors for each class

Here is an example:

Row 1
Row 2
Row 3
Row 4

This approach provides more flexibility with styling. You can set any CSS properties you want for each class. The downside is it requires modifying the HTML slightly by adding classes to each row.

However, the classes help maintain readability of the code. Anyone viewing the HTML can instantly see that “even” and “odd” rows are styled differently. Overall, this is a simple and intuitive way to implement alternating rows.

Using CSS counters

For more complex tables, CSS counters provide another option for styling rows. Counters let you adjust styling based on a running count of elements. Here is an example:

Row 1
Row 2
Row 3
Row 4

Here we are defining a “rowNumber” counter on the body. This counter gets incremented on each table row. We can then use the counter value to style the even rows differently, in this case adding the row number in the left column.

Counters open up additional possibilities like numbering tables or applying other conditional formatting. By pairing counters with :nth-child and modular arithmetic (like 2n, 3n, etc), you can create advanced row styling logic.

The downside is that counters are newer and less supported in older browsers. But they demonstrate the power and flexibility available with CSS for manipulating table formatting.

Using JavaScript/jQuery

In addition to CSS, you can also use JavaScript code to apply alternating row colors. This involves:

1. Selecting all the table rows
2. Looping through them and checking an index variable to determine if it’s odd or even
3. If even, apply the desired styling

Here is an example using jQuery:

Row 1
Row 2
Row 3
Row 4

This gives you the flexibility to alter the row colors however you want in JavaScript. You can also attach the coloring logic to events like button clicks to re-run it dynamically.

However, JavaScript can be heavier and more complex compared to CSS. It also separates the presentation styling from your HTML structure. For simple zebra striping, CSS is typically best practice unless you need dynamic JavaScript behavior.

When to Use Each Method

So when should you use each technique? Here are some general guidelines:

– **nth-child** – Great default option for simple HTML tables. Keep styling in CSS without touching HTML.

– **CSS Classes** – Better for complex styling needs. HTML class names help communicate purpose.

– **Counters** – Enable advanced conditional formatting. Best for complex data tables.

– **JavaScript** – Dynamic styling that executes on events/interactions. Separates concerns.

Consider the complexity of your data and styling needs. Opt for the simplest approach that gets the job done. The best method depends on your specific use case.

Applying Styling Consistently

When using any of these methods, it’s important to apply the alternating styling consistently across your entire table for best results. Don’t style just a portion of rows and leave others unstyled.

For large tables, this may require optimizing CSS selectors or looping through all rows in JavaScript. Sometimes extra table elements like

and can complicate selectors.

Plan ahead and test styling thoroughly across browsers. Debugging inconsistent row colors can be tricky once a table becomes large and complex. But sticking to semantic HTML practices will help minimize headaches.

You can also reuse and apply the same CSS classes or rules across multiple tables on your site. This will ensure any new tables automatically inherit the zebra striping without extra effort. Consistent alternating colors will make it easier for users to scan and engage with all your data.

Styling Beyond Row Colors

Alternating row colors is just one common use case for styling tables. You can leverage these same CSS and JavaScript techniques to apply other formatting as well. A few ideas:

– Zebra stripe background patterns instead of solid colors

– Underline or bold every 5th row

– Highlight max/min values in a column

– Color code categories like grades or temperature ranges

– Add icons or status indicators as a column

Don’t limit yourself to alternating colors only. The sky’s the limit for creatively styling tables with code to enhance their visual appeal.

Just keep accessibility in mind. Use proper contrast ratios and logical markup. Enhance styling wisely in moderation. Fancy tables may look prettier but usability should drive design.


And there you have it – several straightforward ways to make every other row a different color in HTML tables. Whether it’s a simple static site or complex web app, zebra striping can improve the aesthetic and legibility of tabular data.

Consistent alternating row colors provide visual reference points to help users scan and comprehend information. Styling also adds polish and personality that plain HTML tables lack.

Hopefully these examples provide some ideas and best practices to implement in your own projects. The right approach depends on your specific needs and constraints.

At the end of the day, focus on sufficient contrast, clean code, and thoughtful enhancement of your content. Little design touches go a long way in improving user experience. Your fancy tables and charts may just be the visual flare that brings your pages to life.


Here are some references for further reading:

MDN web docs on :nth-child

CSS Tricks guide on nth-child selectors

W3Schools nth-child reference

jQuery each() method

Smashing Magazine on alternating table rows

MDN guide to CSS counters