
本文介绍如何在 Vue.js 中摒弃语义不符的传统 ,改用 CSS Grid 实现灵活、响应式的固定列数布局(如每行 3 列),自动按顺序填充数据,完美适配任意长度的数据列表。
<script setup>
import { ref } from 'vue'
const items = ref([
{ id: 1, name: "Item 1", price: 10.99 },
{ id: 2, name: "Item 2", price: 20.50 },
{ id: 3, name: "Item 3", price: 15.75 },
{ id: 4, name: "Item 4", price: 15.75 },
{ id: 5, name: "Item 5", price: 25.00 },
{ id: 6, name: "Item 6", price: 18.99 }
])
</script><template><div class="items-grid">
<article v-for="item in items" :key="item.id" class="item-card"><header class="item-header"><span class="item-id">ID: {{ item.id }}</span>
<h3 class="item-name">{{ item.name }}</h3>
</header><footer class="item-footer"><span class="item-price">${{ item.price.toFixed(2) }}</span>
</footer></article>
</div>
</template><style scoped>
.items-grid {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 固定 3 列,等宽 */
gap: 1.25rem; /* 列与行间距 */
padding: 0.75rem;
}
.item-card {
border: 1px solid #e0e0e0;
border-radius: 0.5rem;
background: #fff;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
transition: box-shadow 0.2s;
}
.item-card:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.item-header {
padding: 1rem 0.75rem 0.5rem;
border-bottom: 1px solid #f5f5f5;
}
.item-id {
font-size: 0.85rem;
color: #666;
font-weight: 500;
}
.item-name {
margin: 0.25rem 0 0;
font-size: 1.1rem;
font-weight: 600;
color: #333;
}
.item-footer {
padding: 0.5rem 0.75rem 0.75rem;
text-align: center;
}
.item-price {
font-size: 1.25rem;
font-weight: 700;
color: #2c7a3d;
}
</style>
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











