css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕

现有6X7列的一个布局,如下图所示

想要用户能组成任意矩形盒子,并展示内容,具体效果如下(仅为一个示例,其实可以任意组合矩形):

html代码:

html 复制代码
<div class="grid-container">
	<div class="grid-item"  
		v-for="(v,k) in boxList" 
		:key="k"
		:style="getStyle(v)"
	>{{v.num}}</div>
</div>

首先循环出42个格子,js代码

typescript 复制代码
getData() {
	// 指定每行最大的元素数量
	const maxPerRow = 6;
	// 循环生成 42 个元素
	for (let i = 1; i <= 42; i++) {
		// 计算当前元素所在的行和列
		let row = Math.ceil(i / maxPerRow);
		let col = i % maxPerRow === 0 ? maxPerRow : i % maxPerRow;
		let data = {
			num: i,
			x: [row, col],
			merge: [0, 0],//[合并行数,合并列数]
		};
		// 添加对象到数组
		this.boxList.push(data);
	}
},

此时会生成如图1所示的42个格子,让用户去勾选格子合并,合并逻辑后端完成。

样式合并方法如下:

typescript 复制代码
getStyle(v) {
	const styles = {};
		if (v.merge[0] > 0) {//合并列
			styles['grid-row'] = `${v.x[0]} / span ${v.merge[0]}`;
		}
		if (v.merge[1] > 0) {//合并行
			styles['grid-column'] = `${v.x[1]} / span ${v.merge[1]}`;
		}
		return styles;
	},

模拟后端数据返回方法如下:

bash 复制代码
getData() {
	// 指定每行最大的元素数量
	const maxPerRow = 6;

	// 循环生成 42 个元素
	for (let i = 1; i <= 42; i++) {
		// 计算当前元素所在的行和列
		let row = Math.ceil(i / maxPerRow);
		let col = i % maxPerRow === 0 ? maxPerRow : i % maxPerRow;
		let data = {
			num: i,
			x: [row, col],
			merge: [0, 0],//[合并行数,合并列数]
		};
		if(i == 3) {
			data.merge = [3, 2];
		}
		if(i == 5) {
			data.merge = [3, 2];
		}
		if([19,21,31,33,35].indexOf(i) > -1) {
			data.merge = [2, 2];
		}
		if([23,24].indexOf(i) > -1) {
			data.merge = [2, 0];
		}
		// 添加对象到数组
		if([4,6,9,10,11,12,15,16,17,18,20,22,25,26,27,28,29,30,32,34,36,37,38,39,40,41,42].indexOf(i) == -1) {
			this.boxList.push(data);
		}
	}
},

生成效果为:

相关推荐
华玥作者4 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_4 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠4 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang201509284 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC5 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务6 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整6 小时前
面试点(网络层面)
前端·网络
VT.馒头6 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy7 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07078 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js