Implementing Dynamic Row and Column Layouts with CSS Grid: An In-Depth Analysis

Nov 23, 2025 · Programming · 6 views · 7.8

Keywords: CSS Grid | Dynamic Layout | Responsive Design | repeat Function | auto-fill

Abstract: This article provides a comprehensive analysis of implementing dynamic row and column layouts using CSS Grid Layout. By examining key properties such as grid-template-columns, grid-template-rows, and grid-auto-rows, along with the repeat() function and auto-fill values, it details how to create grid systems with fixed column counts and dynamic row numbers. The paper contrasts Flexbox and Grid layouts and offers complete code implementations with best practice recommendations.

Introduction and Background

In modern web development, responsive layout design has become a fundamental requirement. CSS Grid Layout, as a key feature of CSS3, provides powerful two-dimensional layout capabilities. Compared to traditional Flexbox layouts, Grid demonstrates significant advantages when handling complex grid structures. Particularly in scenarios requiring dynamic adjustment of row and column counts, Grid's automatic layout mechanisms offer more flexible and efficient solutions.

Core Concept Analysis

The essence of CSS Grid lies in the flexible application of grid-template-columns and grid-template-rows properties. Through the repeat() function, developers can concisely define repeating track patterns. For example, repeat(4, 1fr) creates four equally wide column tracks, where the 1fr unit ensures proportional distribution of available space among columns.

For dynamic row number requirements, repeat(auto-fill, 120px) implements an automatic filling mechanism. Here, the auto-fill value instructs the browser to create as many row tracks as possible within the container, with each track having a fixed height of 120px. This mechanism ensures the grid can automatically expand based on content quantity without pre-specifying exact row counts.

Specific Implementation Approach

Based on the best answer solution, we have refactored the core CSS code:

.container {
  width: 100%;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(auto-fill, 120px);
  grid-gap: 1em;
}

.container .item {
  background: var(--item-color);
  min-height: 120px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: 1em;
}

In this implementation, the grid-gap property uniformly sets row and column spacing, replacing the separate definitions of grid-row-gap and grid-column-gap, making the code more concise. Meanwhile, grid items internally use Flexbox for content arrangement, demonstrating the collaborative use of both layout technologies.

Alternative Solution Comparison

Referencing other answers, we note that grid-auto-rows provides another method for dynamic row height control. This property defines the size of implicitly created row tracks, automatically taking effect when grid items exceed explicitly defined row counts. For example:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 120px;
  gap: 1em;
}

Compared to repeat(auto-fill, 120px), grid-auto-rows is more suitable for scenarios where row counts are completely uncertain, while the former provides better performance optimization when maximum row counts are known.

JavaScript Integration Implementation

A complete dynamic grid system requires coordination with frontend logic. We have optimized the original JavaScript code:

const COLORS = ['#FE9', '#9AF', '#F9A', '#AFA', '#FA7'];

function addGridItem(container, template) {
  const colorIndex = Math.floor(Math.random() * COLORS.length);
  const randomNum = Math.floor(Math.random() * 10000);
  
  const renderedHTML = template
    .replace('{{color}}', COLORS[colorIndex])
    .replace('{{num}}', randomNum);
  
  container.insertAdjacentHTML('beforeend', renderedHTML);
}

document.addEventListener('DOMContentLoaded', () => {
  const template = document.getElementById('item_template').innerHTML;
  const container = document.getElementById('app');
  const addButton = document.getElementById('add_el');
  
  // Initialize 5 grid items
  for (let i = 0; i < 5; i++) {
    addGridItem(container, template);
  }
  
  addButton.addEventListener('click', () => {
    addGridItem(container, template);
  });
  
  container.addEventListener('click', (event) => {
    if (event.target.classList.contains('del_el')) {
      event.target.closest('.item').remove();
    }
  });
});

This implementation removes jQuery dependency, using native JavaScript to achieve the same functionality, improving code modernity and performance. Template rendering employs string replacement methods, avoiding the introduction of external libraries like Mustache.js.

Browser Compatibility Considerations

CSS Grid Layout has gained widespread support in modern browsers, including Chrome 57+, Firefox 52+, Safari 10.1+, and Edge 16+. For projects requiring support for older browsers, providing a Flexbox fallback solution is recommended:

.container {
  display: flex;
  flex-wrap: wrap;
  gap: 1em;
}

.container .item {
  flex: 0 0 calc(25% - 1em);
  min-height: 120px;
}

@supports (display: grid) {
  .container {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: 120px;
  }
  
  .container .item {
    flex: none;
  }
}

Performance Optimization Recommendations

In large-scale grid applications, the following optimization strategies are worth considering:

Conclusion

CSS Grid Layout provides powerful and flexible solutions for dynamic grid layouts. Through reasonable application of the repeat() function, auto-fill values, and grid-auto-rows properties, developers can create both aesthetically pleasing and fully functional responsive grid systems. Combined with modern JavaScript techniques, this layout approach can meet various complex business requirements while maintaining good performance and maintainability.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.