【VUE】vue3 SFC方式实现九宫格效果

news2025/2/23 18:47:22

效果图

九宫格效果

调用方式

<template>
	<grid class="grid-demo" isScale>
	  <grid-item class="grid-demo-item">1</bg-grid-item>
	  <grid-item class="grid-demo-item">2</bg-grid-item>
	  <grid-item class="grid-demo-item">3</bg-grid-item>
	  <grid-item class="grid-demo-item">4</bg-grid-item>
	  <grid-item class="grid-demo-item">5</bg-grid-item>
	  <grid-item class="grid-demo-item">6</bg-grid-item>
	  <grid-item class="grid-demo-item">7</bg-grid-item>
	  <grid-item class="grid-demo-item">8</bg-grid-item>
	  <grid-item class="grid-demo-item">9</bg-grid-item>
	</grid>
<template>

<style scoped>
.grid-demo{
  background-color: #2b2d42;
}
.grid-demo-item{
  color: #fff;
  background-color: #41497D;
}
</style>

grid-item组件代码

<script setup>
import {ref, inject, watch} from 'vue'

defineOptions({
  name: 'GridItem'
})
const isScale = inject("isScale");

// 自适应高度等于宽度
const liDom = ref();
const height = ref("");
watch(() => liDom.value, (dom) => {
  if (isScale) {
    height.value = dom.clientWidth + "px";
  } else {
    height.value = "";
  }
}, {
  deep: true,
});

</script>

<template>
  <li class="grid-layout-item" ref="liDom">
    <slot />
  </li>
</template>

<style scoped lang="scss">
.grid-layout-item {
  float: left;
  list-style: none;
  height: v-bind(height);
  line-height: v-bind(height);
  text-align: center;
  vertical-align: middle;
  margin-bottom: 10px;
}
</style>

grid组件代码

<script setup>
import {useSlots, provide, ref, computed, watch, onMounted} from "vue";

defineOptions({
  name: "Grid"
})
const props = defineProps({
  /** 间隔 */
  gutter: {type: Number, default: 10},
  /** 列数 */
  column: {type: Number, default: 3},
  /** 约束宽=高 */
  isScale: {type: Boolean, default: false},
})

provide('isScale', props.isScale)
// 插槽列表
const slotList = useSlots()?.default() || []
// 渲染列表
const renderList = ref([])
const columnNum = ref(props.column || 1)
// 尾行编号
const lastRow = ref(0);

const gridStyles = computed(() => {
  return {
    overflow: "hidden",
    padding: `${props.gutter}px`,
    margin: "0px"
  }
})

function _SlotListHandler(el, index) {
  if (typeof el.type === "object" && el.type.name === "GridItem") {
    if (!el.props) el.props = {};
    if (!el.props.style) el.props.style = {};
    el.props.style.width = `calc((100% - ${props.gutter * (columnNum.value - 1)}px) / ${columnNum.value})`;

    // 右边距设置和下边距设置
    el.props.style.marginRight = `${props.gutter}px`;
    el.props.style.marginBottom = `${props.gutter}px`;

    // 每行最后一个不加右边距
    if ((index + 1) % columnNum.value === 0) el.props.style.marginRight = "0px";
    // 最后一行不加下边距
    if ((index + 1) >= lastRow.value * columnNum.value){
      el.props.style.marginBottom = 0;
    }else{
      el.props.style.marginBottom = `${props.gutter}px`
    }

    return el;
  } else if (typeof el.type === 'symbol') {
    let _list = [];
    el.children.forEach((childrenEl, childrenIndex) => {
      _list.push(_SlotListHandler(childrenEl, childrenIndex));
    })
    return _list;
  }
  return false;
}

function renderSlot(list) {
  renderList.value = [];
  lastRow.value = Math.ceil((list[0]?.children||[]).length / columnNum.value) - 1;
  list.forEach((el, index) => {
    let _e = _SlotListHandler(el, index);
    if (_e instanceof Array) {
      renderList.value.push(..._e);
    } else if (typeof _e === 'object') {
      renderList.value.push(_e);
    }
  });
}

watch(
    () => slotList,
    (list) => {
      console.log('list:', list)
      renderSlot(list);
    },
    {deep: true}
)

onMounted(()=>{
  renderSlot(slotList);
})
</script>

<template>
  <div class="grid-layout">
    <ul :style="gridStyles">
      <component v-for="(element, key) in renderList" :key="key"
                 :is="element"/>
    </ul>
  </div>
</template>

<style scoped lang="scss">
.grid-layout {
  list-style: none;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

索引的数据结构

索引的数据结构 部分资料来自B站尚硅谷-宋红康老师 1. 为什么使用索引 使用索引是为了加快数据库的查询速度和提高数据库的性能。索引是数据库表中的一种数据结构&#xff0c;它可以帮助数据库快速定位并检索所需的数据。 当数据库表中的数据量较大时&#xff0c;如果没有索…

Training-Time-Friendly Network for Real-Time Object Detection 论文学习

1. 解决了什么问题&#xff1f; 目前的目标检测器很少能做到快速训练、快速推理&#xff0c;并同时保持准确率。直觉上&#xff0c;推理越快的检测器应该训练也很快&#xff0c;但大多数的实时检测器反而需要更长的训练时间。准确率高的检测器大致可分为两类&#xff1a;推理时…

uni-app:实现账号密码登录,并且实现当页面登录过该账号在下次登录时无需再输入账号密码(本地缓存实现)

效果 前端代码 一、完整代码 <template><view><view class"all"><view class"title"><image :src"title_login" alt"图片损坏" /></view><form class"login-form" submit"fo…

JAVA面试总结-Redis篇章(二)——缓存击穿

JAVA面试总结-Redis篇章&#xff08;二&#xff09; 缓存击穿解决方案一&#xff1a;互斥锁解决方案二&#xff1a;逻辑过期![在这里插入图片描述](https://img-blog.csdnimg.cn/176dfab3e26044a9a730fabea4314e8e.png) 缓存击穿 解决方案一&#xff1a;互斥锁 解决方案二&…

SpringBoot-5

Spring Boot 的项目属性配置 在项目中很多时候需要用到一些配置的信息&#xff0c;这些信息可能在测试环境和生产环境下会有不同的配置&#xff0c;后面根据实际业务情况有可能还会做修改&#xff0c;针对这种情况不能将这些配置在代码中写死&#xff0c;最好就是写到配置文件…

Rust vs Go:常用语法对比(六)

题图来自[1] 101. Load from HTTP GET request into a string Make an HTTP request with method GET to URL u, then store the body of the response in string s. 发起http请求 package mainimport ( "fmt" "io/ioutil" "net" "net/http…

Fiddler使用说明及中文绿化版

Fiddler是最常用的Web调试工具之一。 对于开发来说&#xff0c;前端可以通过fiddler代理来调试JS、CSS、HTML样式。后端可以通过fiddler查看请求和相应&#xff0c;定位问题。 对于测试来说&#xff0c;可以通过抓包方式修改前端请求参数和模拟后端返回&#xff0c;快速定位缺…

Pr LOGO平滑过渡效果

哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何制作LOGO平滑过渡效果&#xff1f; 准备工作 两个透明LOGO&#xff0c;一个水滴音效 ​新建序列 新建一个1920*1080的序列&#xff0c;将图片拖拽至轨道 CtrlR 图片时长设置为3SCtrlD 快速添加过渡效果右键…

【Python】生成md5码

目录 1 代码 2 运行结果 使用hashlib库来生成md5码。如下代码会生成Happy every day的md5哈希值。 1 代码 import hashlibdef generate_md5(string):md5 hashlib.md5()md5.update(string.encode(utf-8))return md5.hexdigest()if __name__ __main__:MD5 generate_md5(&qu…

测试开源C#人脸识别模块ViewFaceCore(3:人脸特征提取和对比)

ViewFaceCore模块的FaceRecognizer支持人脸特征提取和对比&#xff0c;将人脸中的关键信息转换为矢量信息&#xff0c;然后通过计算两个矢量的相似度以判断人脸的相似程序。   调用FaceRecognizer对比人脸相似度主要包括以下步骤&#xff1a;   1&#xff09;调用faceDetec…

第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)

string基本概念 string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别 1、char是一个指针 2、string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char型的容器。 特点&#xff1a; string类内部封装了很多成员方…

idea社区版(2023.1)设置spring boot项目热启动

热启动 在开发过程中&#xff0c;当写完一个功能我们需要运行应用程序测试时需要重启服务器&#xff0c;一个最简单的项目也要花费10多秒&#xff0c;如果是更大的项目则耗时更多。SpringBoot提供了spring-boot-devtools&#xff0c;使得项目在发生改动时能够自动重启应用 id…

hadoop3编译安装

1.参考资料 官方的https://github.com/apache/hadoop/blob/trunk/BUILDING.txt 2.编译环境 Linux系统&#xff1a;Centos7.2 Jdk版本&#xff1a;jdk1.8 cmake版本&#xff1a;3.19 Hadoop版本&#xff1a;3.1.2 Maven版本&#xff1a;3.6.3 Protobuf版本&#xff1a;2…

【数据分析专栏之Python篇】二、Jupyer Notebook安装配置及基本使用

文章目录 前言一、Jupter Notebook是什么1.1 简介1.2 组成部分1.3 Jupyter Notebook的主要特点 二、为什么使用Jupyter Notebook?三、安装四、Jupyter Notebok配置4.1 基本配置4.2 配置开机自启与后台运行4.3 开启代码自动补全 五、两种键盘输入模式5.1 编辑模式5.2 命令模式5…

J2EE通用分页02

目录 一.重构-提取公用方法 1.为了进行公共方法的抽取&#xff0c;需要找出上面实习中的可通用部分&#xff0c;和差异化部分 2.公用方法封装思路 3. 具体实现 二.分页标签 2.1 准备一个Servlet 3.2 结果展示页面 三. 过滤器解决中文乱码问题 四.加入分页功能 四…

Qt Core学习日记——第七天QMetaObject(上)

每一个声明Q_OBJECT的类都具有QMetaObject对象 Q_OBJECT宏源代码&#xff1a; #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ vir…

Rust vs Go:常用语法对比(五)

题图来自 Rust vs Go 2023[1] 81. Round floating point number to integer Declare integer y and initialize it with the rounded value of floating point number x . Ties (when the fractional part of x is exactly .5) must be rounded up (to positive infinity). 按规…

垃圾回收标记阶段算法

1.标记阶段的目的 主要是在GC在前&#xff0c;判断出哪些是有用的对象&#xff0c;哪些是需要回收的对象&#xff0c;只有被标记为垃圾对象&#xff0c;GC才会对其进行垃圾回收。判断对象是否为垃圾对象的两种方式&#xff1a;引用计数算法和可达性分析算法。 2.引用计数算法…

MySQL基础(一)

目录 前言 一、概述 1.什么是数据库 2.数据库能干什么 3.为什么要用数据库&#xff0c;优势、特性 二、数据库类型 &#xff08;一&#xff09;、关系型数据库&#xff0c;RDBMS 1.概述 2.特点 3.代表产品 &#xff08;二&#xff09;、非关系型数据库&#xff0c;No…

性能测试常见故障和解决思路

目录 一、性能问题分析流程 二、内存溢出 &#xff08;一&#xff09;堆内存溢出 &#xff08;二&#xff09;永久代/方法区溢出 &#xff08;三&#xff09;栈内存溢出 &#xff08;四&#xff09;系统内存溢出 三、CPU过高 &#xff08;一&#xff09;us cpu过高 &a…