vue实现九宫格首页
实现九宫格布局
使用Vue实现九宫格首页可以通过Flex布局或Grid布局完成。以下是两种常见实现方式:
Flex布局实现
<template>
<div class="grid-container">
<div v-for="(item, index) in gridItems" :key="index" class="grid-item">
<img :src="item.icon" />
<p>{{ item.text }}</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {
gridItems: [
{ icon: 'icon1.png', text: '功能1' },
{ icon: 'icon2.png', text: '功能2' },
// ...共9个item
]
}
}
}
</script>
<style>
.grid-container {
display: flex;
flex-wrap: wrap;
width: 100%;
}
.grid-item {
width: 33.33%;
text-align: center;
padding: 15px;
box-sizing: border-box;
}
</style>
CSS Grid实现
<template>
<div class="grid-container">
<div v-for="(item, index) in gridItems" :key="index" class="grid-item">
<!-- 内容同上 -->
</div>
</div>
</template>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
</style>
添加交互效果
为九宫格项目添加点击事件和悬停效果:
<template>
<div class="grid-container">
<div
v-for="(item, index) in gridItems"
:key="index"
class="grid-item"
@click="handleClick(index)"
@mouseover="hoverIndex = index"
@mouseout="hoverIndex = null"
:class="{ 'active': hoverIndex === index }"
>
<!-- 内容 -->
</div>
</div>
</template>
<script>
export default {
methods: {
handleClick(index) {
// 处理点击逻辑
console.log('点击了', this.gridItems[index].text)
}
}
}
</script>
<style>
.grid-item {
transition: all 0.3s;
}
.grid-item.active {
transform: scale(1.05);
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
</style>
响应式适配
针对不同屏幕尺寸调整布局:
@media (max-width: 768px) {
.grid-container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
.grid-container {
grid-template-columns: 1fr;
}
}
数据动态加载
从API获取九宫格数据:
export default {
async created() {
try {
const response = await axios.get('/api/grid-items')
this.gridItems = response.data
} catch (error) {
console.error('获取数据失败', error)
}
}
}
样式优化建议
-
为图标设置固定尺寸:
.grid-item img { width: 50px; height: 50px; object-fit: contain; } -
添加圆角和背景色:
.grid-item { background: #fff; border-radius: 8px; padding: 20px; } -
使用CSS变量统一风格:
:root { --grid-gap: 15px; --item-bg: #ffffff; }
.grid-container { gap: var(--grid-gap); }
.grid-item { background: var(--item-bg); }







