【Element入门】4、Element UI 布局组件详解

【Element入门】Element UI 布局组件详解

Element入门系列导航

【Element入门】1、Element UI 介绍与安装
【Element入门】2、Element UI 的基本使用
【Element入门】3、Element UI 表单组件详解
【Element入门】4、Element UI 布局组件详解(本文)
【Element入门】5、Element UI 导航组件详解
【Element入门】6、Element UI 数据展示组件详解
【Element入门】7、Element UI 反馈组件详解
【Element入门】8、Element UI 自定义主题


布局是 Web 应用的重要组成部分,合理的布局可以提升用户体验和界面美观度。Element UI 提供了强大的布局组件,包括 Grid 布局系统和 Container 布局组件,帮助开发者快速构建响应式和灵活的页面布局。本篇文章将详细介绍这两类布局组件的使用方法。

Grid 布局系统

基本概念

Grid 布局系统是基于 24 栅格系统实现的,通过 el-rowel-col 组件来进行布局。el-row 代表行,el-col 代表列,列的宽度通过 span 属性来设置,最大值为 24。

基本使用

首先,我们来看一个简单的 Grid 布局示例:

<template>
  <div id="app">
    <el-row>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.grid-content {
  border-radius: 4px;
  min-height: 36px;
}
.bg-purple {
  background: #d3dce6;
}
.bg-purple-light {
  background: #e9eef3;
}
</style>

在这个示例中,我们创建了一个包含三列的行,每列的宽度为 8 个栅格,总共占满 24 个栅格。

设置列间距

可以通过 el-rowgutter 属性设置列之间的间距:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,每列之间有 20px 的间距。

灵活布局

可以通过 offset 属性设置列的偏移量,实现更加灵活的布局:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :span="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="6" :offset="6"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="6"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,第二列向右偏移了 6 个栅格。

响应式布局

Grid 布局系统也支持响应式布局,可以通过设置 xs, sm, md, lg, xl 等属性来适配不同的屏幕尺寸:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple-light"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,不同屏幕尺寸下每列的宽度不同,实现了响应式布局。

Container 布局组件

基本概念

Container 布局组件包括 el-containerel-headerel-asideel-mainel-footer,用于快速构建常见的页面布局结构,如顶部导航、侧边栏和内容区等。

基本使用

以下是一个简单的 Container 布# 【Element入门】Element UI 布局组件详解

布局是 Web 应用的重要组成部分,合理的布局可以提升用户体验和界面美观度。Element UI 提供了强大的布局组件,包括 Grid 布局系统和 Container 布局组件,帮助开发者快速构建响应式和灵活的页面布局。本篇文章将详细介绍这两类布局组件的使用方法。

Grid 布局系统

基本概念

Grid 布局系统是基于 24 栅格系统实现的,通过 el-rowel-col 组件来进行布局。el-row 代表行,el-col 代表列,列的宽度通过 span 属性来设置,最大值为 24。

基本使用

首先,我们来看一个简单的 Grid 布局示例:

<template>
  <div id="app">
    <el-row>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.grid-content {
  border-radius: 4px;
  min-height: 36px;
}
.bg-purple {
  background: #d3dce6;
}
.bg-purple-light {
  background: #e9eef3;
}
</style>

在这个示例中,我们创建了一个包含三列的行,每列的宽度为 8 个栅格,总共占满 24 个栅格。

设置列间距

可以通过 el-rowgutter 属性设置列之间的间距:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="8"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,每列之间有 20px 的间距。

灵活布局

可以通过 offset 属性设置列的偏移量,实现更加灵活的布局:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :span="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :span="6" :offset="6"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :span="6"><div class="grid-content bg-purple"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,第二列向右偏移了 6 个栅格。

响应式布局

Grid 布局系统也支持响应式布局,可以通过设置 xs, sm, md, lg, xl 等属性来适配不同的屏幕尺寸:

<template>
  <div id="app">
    <el-row :gutter="20">
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple-light"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple"></div></el-col>
      <el-col :xs="24" :sm="12" :md="8" :lg="6"><div class="grid-content bg-purple-light"></div></el-col>
    </el-row>
  </div>
</template>

在这个示例中,不同屏幕尺寸下每列的宽度不同,实现了响应式布局。

Container 布局组件

基本概念

Container 布局组件包括 el-containerel-headerel-asideel-mainel-footer,用于快速构建常见的页面布局结构,如顶部导航、侧边栏和内容区等。通过组合这些组件,可以方便地实现复杂的页面布局。

基本使用

以下是一个简单的 Container 布局示例:

<template>
  <div id="app">
    <el-container>
      <el-header>Header</el-header>
      <el-main>Main Content</el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}
.el-main {
  padding: 20px;
}
</style>

在这个示例中,我们使用 el-container 作为容器组件,并使用 el-headerel-mainel-footer 组件分别创建了页眉、主体内容区和页脚。

垂直布局

可以通过在 el-container 内部嵌套多个 el-container 组件来实现垂直布局,如下所示:

<template>
  <div id="app">
    <el-container>
      <el-header>Header</el-header>
      <el-container>
        <el-aside width="200px">Aside</el-aside>
        <el-main>Main Content</el-main>
      </el-container>
      <el-footer>Footer</el-footer>
    </el-container>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}
.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 200px;
}
.el-main {
  padding: 20px;
}
</style>

在这个示例中,我们在 el-container 内部嵌套了一个包含 el-asideel-mainel-container,实现了典型的侧边栏布局。

垂直与水平布局结合

通过组合使用 el-containerel-headerel-asideel-mainel-footer,可以实现更加复杂的布局,例如包含顶部导航栏、侧边栏和内容区的布局:

<template>
  <div id="app">
    <el-container>
      <el-header>Header</el-header>
      <el-container>
        <el-aside width="200px">Aside</el-aside>
        <el-container>
          <el-main>Main Content</el-main>
          <el-footer>Footer</el-footer>
        </el-container>
      </el-container>
    </el-container>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}
.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 200px;
}
.el-main {
  padding: 20px;
}
</style>

在这个示例中,我们使用了多个嵌套的 el-container,实现了一个包含顶部导航栏、侧边栏、主内容区和页脚的复杂布局。

配置组件属性

el-container 布局组件还提供了一些有用的属性,可以根据需要进行配置。例如:

  • el-asidewidth 属性可以设置侧边栏的宽度。
  • el-headerel-footerheight 属性可以设置页眉和页脚的高度。

以下是一个带有自定义属性的示例:

<template>
  <div id="app">
    <el-container>
      <el-header height="60px">Header</el-header>
      <el-container>
        <el-aside width="250px">Aside</el-aside>
        <el-main>Main Content</el-main>
      </el-container>
      <el-footer height="40px```vue
<template>
  <div id="app">
    <el-container>
      <el-header height="60px">Header</el-header>
      <el-container>
        <el-aside width="250px">Aside</el-aside>
        <el-main>Main Content</el-main>
      </el-container>
      <el-footer height="40px">Footer</el-footer>
    </el-container>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}
.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 200px;
}
.el-main {
  padding: 20px;
}
</style>

在这个示例中,我们自定义了 el-headerel-footer 的高度,以及 el-aside 的宽度,进一步展示了布局组件的灵活性。

结语

通过本章的学习,我们了解了 Element UI 提供的两种主要布局系统:Grid 布局系统和 Container 布局组件。Grid 布局系统基于 24 栅格系统,适用于灵活和复杂的栅格布局;Container 布局组件则用于快速构建常见的页面结构,如顶部导航、侧边栏和内容区等。Element UI 提供的这些布局组件可以帮助我们快速构建响应式和美观的页面布局。

在接下来的章节中,我们将继续深入探讨 Element UI 的其他组件和高级功能,敬请期待!希望这篇文章对你有所帮助,祝你在前端开发的道路上越走越远!

Element UI 的 Upload 组件是一个文件上传组件,允许用户上传多个文件,并支持拖拽上传和文件预览。下面我将详细介绍这个组件的使用方法。 ## 安装 首先,需要在项目中安装 Element UI。 ```bash npm install element-ui --save ``` 然后,在 main.js 中引入 Element UI。 ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` ## 基本用法 在需要使用 Upload 的组件中,可以这样写: ```html <el-upload class="upload-demo" action="/upload" :data="{ user_id: 123 }" :on-success="handleSuccess" :on-error="handleError" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> ``` 上面代码中,`action` 属性是上传的后端接口地址,`data` 属性是上传时需要携带的额外参数,`on-success` 和 `on-error` 属性分别是上传成功和失败时的回调函数,`before-upload` 属性是上传前的校验函数,`file-list` 属性是已经上传的文件列表,`auto-upload` 属性表示是否自动上传。 在 Upload 组件中,需要通过 `slot` 分别定义两个按钮,分别是选取文件和上传到服务器的按钮。同时,可以通过 `slot` 定义提示信息。 ```html <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> ``` 最后,需要在 Vue 实例中定义对应的函数。 ```javascript export default { data() { return { fileList: [] } }, methods: { handleSuccess(response, file, fileList) { console.log(response, file, fileList); }, handleError(error, file, fileList) { console.log(error, file, fileList); }, beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('上传头像图片只能是 JPG 格式!'); } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!'); } return isJPG && isLt2M; }, submitUpload() { this.$refs.upload.submit(); } } } ``` 上面代码中,`handleSuccess` 和 `handleError` 分别是上传成功和失败时的回调函数,在这里可以对上传的结果进行处理。`beforeUpload` 是上传前的校验函数,可以在这里对上传的文件进行校验。`submitUpload` 用于手动触发上传。 ## 高级用法 ### 限制上传文件类型和大小 可以通过 `accept` 和 `before-upload` 属性来限制上传文件的类型和大小。 ```html <el-upload class="upload-demo" action="/upload" :data="{ user_id: 123 }" :on-success="handleSuccess" :on-error="handleError" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false" accept="image/*" :limit="3" :on-exceed="handleExceed"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> ``` 上面代码中,`accept` 属性限制了只能上传图片类型的文件,`before-upload` 函数限制了文件大小不超过 500KB,同时还设置了最多上传 3 个文件的限制,并在超出限制时触发 `on-exceed` 方法。 ```javascript handleExceed(files, fileList) { this.$message.warning(`当前限制选择 ${this.limit} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`); } ``` ### 上传到阿里云 OSS 可以通过 `before-upload` 和 `custom-request` 属性来实现上传到阿里云 OSS。 ```html <el-upload class="upload-demo" :action="ossConfig.host" :data="ossConfig.params" :on-success="handleSuccess" :on-error="handleError" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false" :custom-request="ossConfig.customRequest"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> ``` 上面代码中,`action` 属性设置为阿里云 OSS 的上传地址,`data` 属性设置为上传时需要携带的额外参数。在 `before-upload` 函数中,需要返回一个 Promise 对象,该 Promise 对象中需要实现上传到阿里云 OSS 的逻辑。 ```javascript beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('上传头像图片只能是 JPG 格式!'); } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!'); } return isJPG && isLt2M && new Promise((resolve, reject) => { const ossConfig = this.getOssConfig(); this.ossConfig = ossConfig; const client = new OSS({ accessKeyId: ossConfig.accessid, accessKeySecret: ossConfig.accesskey, stsToken: ossConfig.securitytoken, bucket: ossConfig.bucket, region: ossConfig.region, cname: true }); client.multipartUpload(ossConfig.dir + '/' + file.name, file).then((result) => { console.log(result); resolve(); }).catch((error) => { console.log(error); reject(); }); }); }, getOssConfig() { // 获取阿里云 OSS 的配置 } ``` 在 `custom-request` 函数中,可以实现上传成功和失败的回调函数。 ```javascript ossConfig: { host: '', params: {}, customRequest: (config) => { const { action, data, file, headers, onError, onSuccess, onProgress } = config; const xhr = new XMLHttpRequest(); xhr.open('POST', action, true); Object.keys(headers).forEach((key) => { xhr.setRequestHeader(key, headers[key]); }); xhr.onload = function onload() { if (xhr.readyState === 4 && xhr.status === 200 && xhr.responseText !== '') { try { const response = JSON.parse(xhr.responseText); onSuccess(response, xhr); } catch (error) { onError(error, xhr); } } else { onError(new Error('上传失败'), xhr); } }; xhr.onerror = function onerror(error) { onError(error, xhr); }; xhr.upload.onprogress = function onprogress(event) { if (event.total > 0) { event.percent = (event.loaded / event.total) * 100; } onProgress(event, xhr); }; const formData = new FormData(); Object.keys(data).forEach((key) => { formData.append(key, data[key]); }); formData.append('file', file); xhr.send(formData); } }, ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值