Bootstrap学习笔记--表格

本文介绍如何使用不同类名实现各种样式的HTML表格,包括条纹、边框、悬停效果等,并展示了如何创建响应式表格以适应不同尺寸的屏幕。

先来个总体概括:
这里写图片描述
还有一个响应式表

实践出真知:
类:.table
一个轻的填充物和只有水平分隔符。
看代码:

<div class="container">        
  <table class="table">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

看效果图:
这里写图片描述

类:.table-striped
将斑马条纹添加到表格中:

<table class="table">
 改成
<table class="table table-striped">

效果图:
这里写图片描述

.类:table-bordered
加边框:

<table class="table">
 改成
<table class="table table-bordered">

效果图:
这里写图片描述

类:.table-hover
允许上表中的行悬停状态:基础的和table只有水平线一样 但是当鼠标停留在列表的时候 此行会变灰色 但是不能点击

<table class="table">
 改成
 <table class="table table-hover">

效果图:
这里写图片描述

类:.table-condensed
没啥区别和table 只有水平线一样 只是变得更紧凑而已

    <table class="table">
     改成
     <table class="table table-condensed">

这里不贴效果图了……差别不大。

为表格行(<tr>)或表格单元格(<td>)着色
 <table class="table">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr class="success">
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr class="danger">
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td class="info">July</td>
        <td>Dooley</td>
        <td class="danger">july@example.com</td>
      </tr>
    </tbody>
  </table>

效果图:
这里写图片描述

颜色选择:
这里写图片描述

还可以建造响应表:
类:.table-responsive
表格将在小设备上水平滚动(768px以下)。当查看大于768px宽的任何东西时,没有区别

<div class="table-responsive">
  <table class="table">
    ...
  </table>
</div>

栗子:

 <div class="table-responsive">          
  <table class="table">
    <thead>
      <tr>
        <th>#</th>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Age</th>
        <th>City</th>
        <th>Country</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>Anna</td>
        <td>Pitt</td>
        <td>35</td>
        <td>New York</td>
        <td>USA</td>
      </tr>
    </tbody>
  </table>
  </div>
</div>

效果图:
这里写图片描述

这个是响应式的 之前那些类 都没有滑轮缩小后 或者有 更通用

table要包含在<div class="table-responsive"> 里      
<template style="overflow-x: hidden;"> <!-- <div id="index" v-if="isAuth('mqtt:mtbatteryinfolastest:largeDatalist')"> 控制显示--> <div id="index" style="overflow-y: hidden;"> <dv-full-screen-container class="bg"> <dv-loading v-if="loading">Loading...</dv-loading> <div v-else class="host-body"> <div class="d-flex jc-center"> <dv-decoration-10 style="width:33.3%;height:.0625rem;" /> <div class="d-flex jc-center"> <dv-decoration-8 :color="['#568aea', '#000000']" style="width:2.5rem;height:.625rem;" /> <div class="title"> <div ><img @click="back" src="~@/assets/img/logoNew6.png" style="width:3.75rem;margin-top:-0.1rem;margin-bottom:0.175rem;"></div> <div style="margin-top:0.25rem;"><span class="title-text" style='font-family: "Microsoft YaHei";font-size: 26px;color:#fff;width:100%;'>欣云电池孪生管理平台</span> <dv-decoration-6 class="title-bototm" :reverse="true" :color="['#50e3c2', '#67a1e5']" style="width:3.125rem;height:.1rem;" /> </div> </div> <dv-decoration-8 :reverse="true" :color="['#568aea', '#000000']" style="width:2.5rem;height:.625rem;" /> </div> <dv-decoration-10 style="width:33.3%;height:.0625rem; transform: rotateY(180deg);" /> </div> <!-- 第二行 --> <div class="d-flex jc-between px-2"> <div class="d-flex" style="width: 40%"> <div id="index" class="react-right ml-4" style="width: 6.25rem; text-align: left;background-color: #0f1325;" > <!-- <img :src="dataWeather.icontemp" alt=""> --> <!-- 🌤⛅🌥🌦☁🌧⛈🌩☀🌞⚡❄🌨☃⛄🌬💨🌪🌫🌈☔💧💦🌊🧣🧤🌂☂🔅🔆🥵🥶🧊ϟ☀☁☂☃☄☉☼☽☾♨❄❅❆ --> <div class="text dataweather"> <div style="font-size:0.2rem;width:100%"> {{dataWeather.city}} {{dataWeather.weathertemp}} <span v-if="dataWeather.weathertemp === '晴'">🔆</span> <span v-else-if="dataWeather.weathertemp.indexOf('阴') !== -1 ">☁</span> <span v-else-if="dataWeather.weathertemp.indexOf('雨') !== -1 ">🌧</span> <span v-else-if="dataWeather.weathertemp.indexOf('云') !== -1 ">🌤</span> <span v-else-if="dataWeather.weathertemp.indexOf('电') !== -1 ">⚡</span> <span v-else-if="dataWeather.weathertemp.indexOf('雪') !== -1 ">❄</span> <span v-else-if="dataWeather.weathertemp.indexOf('夜') !== -1 ">☽</span> <span v-else>⛅</span> {{dataWeather.peraturetemp}} </div> </div> <span class="react-before"></span> <div class="text" style="float:right;margin-right:20%"> <!-- <el-button type="primary" icon="el-icon-arrow-left" class="back" size="mini" @click="back" circle></el-button> --> <!-- <el-button type="primary" class="back" size="mini" @click="back">返回管理系统</el-button> --> <!-- <i class="el-icon-back" @click="back"></i> --> </div> <!-- <span class="text" style="cursor:pointer" @click="back">返回管理系统</span> --> </div> <div class="react-right bg-color-blue ml-3" > <!-- style="background-color: #0f1325;" --> <!-- <span class="text colorBlue">数据分析2</span> --> </div> </div> <div style="width: 40%" class="d-flex"> <div class="react-left bg-color-blue mr-3"> <!-- <span class="text fw-b">vue-big-screen</span> --> </div> <div class="react-left mr-4" style="width: 6.25rem; background-color: #0f1325; text-align: right;font-size:0.2rem;width:100%" > <div class="text" style="float:left;margin-left:48%;margin-top:0.3%;display: flex;"> <!-- <screenfull id="screenfull" class="right-menu-item hover-effect" /> --> <!-- <i class="el-icon-full-screen">暂无</i> --> <!-- <i @click="toggleFullScreen" class="el-icon-full-screen" style="font-weight:550;margin-right:0.1rem;">全屏</i> --> <div @click="back"><icon-svg name="shouye" class="el-icon-full-screen" style="width: 1.2em; height: 1.2em;"></icon-svg></div> <div @click="toggleFullScreen" style="margin-left:0.1rem;"><icon-svg name="chefangda" class="el-icon-full-screen" style="width: 1.12em; height: 1.12em;"></icon-svg></div> <!-- <div><i class="el-icon-back" @click="back"></i></div> --> </div> <span class="react-after"></span> <span class="text">{{dateYear}} {{dateWeek}} {{dateDay}}</span> </div> </div> </div> <div class="body-box2"> <!-- 第三行数据 --> <div class="content-box2"> <!-- 左侧 --> <div> <dv-border-box-12> <left1 /> <!-- <left2 /> <left3 /> --> </dv-border-box-12> <dv-border-box-12> <left2 /> </dv-border-box-12> <dv-border-box-12> <left3 /> </dv-border-box-12> </div> <!-- 中间 --> <div> <dv-border-box-12> <!-- <center1 /> --> <chinaMap ref="chinaMap"/> <!-- <china /> --> <!-- <centerBottom /> --> </dv-border-box-12> <dv-border-box-12> <centerBottom /> </dv-border-box-12> </div> <!-- 右侧 --> <div> <dv-border-box-12> <right1 /> <!-- <right2 /> <right3 /> --> </dv-border-box-12> <dv-border-box-12> <right2 /> </dv-border-box-12> <dv-border-box-12> <right3 /> </dv-border-box-12> </div> </div> </div> </div> </dv-full-screen-container> </div> </template> <script> import { formatTime } from '../../utils/index.js' import {weatherOption} from '../../config/weatherOption' import left1 from "./map-left1" import left2 from "./map-left2" // import left3 from "./map-left3" import left3 from "./sina_left3" import center1 from "./center1" import centerBottom from "./centerBottomNew" import right1 from "./map-right1" import right2 from "./map-right2" import right3 from "./map-right3" import chinaMap from "./chinaMapNew" import china from "./china" import Screenfull from '@/components/Screenfull' export default { data () { return { loading: true, dateDay: null, dateYear: null, dateWeek: null, weekday: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], dataWeather: { city: '金华市', dayweather: '晴', nightweather: '多云', weathertemp: '晴', // 根据时间判断选白天还是晚上的天气 nighttemp: '25℃', daytemp: '35℃', peraturetemp: '25℃~35℃', // 根据时间判断选白天还是晚上的温度 icontemp: 'https://cdn.heweather.com/cond_icon/100.png', } } }, // 问题原因:在组件mounted钩子中调用的刷新页面内容,但测试发现这个钩子没有被调用。 // 解决办法:使用Vue组件切换过程钩子activated(keep-alive组件激活时调用),而不是挂载钩子mounted activated: function() { //document.html.style.overflow_y = 'hidden'; // alert('进来了...') this.hiddenbar() }, components: { // centerLeft1, // centerLeft2, // centerRight1, // centerRight2, // center, // centerBottom, // bottomLeft, // bottomRight, // centerLeft12, // centerLeft22 left1, left2, left3, center1, centerBottom, right1, right2, right3, chinaMap, china, Screenfull }, mounted () { this.timeFn(); this.requestGetWeather(); this.cancelLoading(); this.hiddenbar(); }, methods: { // 获取天气 requestGetWeather() { // alert("获取天气") $.get({ //这里的url不能写到data对象的外面 url: 'https://api.asilu.com/weather_v2/', dataType: 'jsonp', // 请求方式为jsonp success: (data) => { // alert("天气data.status="+data.status) if (data.status === '1') { let currTime = new Date().getHours(); let dailyForecast = data.forecasts[0].casts[0]; let city = data.forecasts[0].city; let daytemp = dailyForecast.daytemp + '℃'; let nighttemp = dailyForecast.nighttemp + '℃'; let weathertemp = ''; let peraturetemp = ''; if ((currTime >= 6) && (currTime < 18)) { weathertemp = dailyForecast.dayweather; peraturetemp = dailyForecast.nighttemp + "℃~" + dailyForecast.daytemp + "℃"; } else { weathertemp = dailyForecast.nightweather; peraturetemp = dailyForecast.daytemp + "℃~" + dailyForecast.nighttemp + "℃"; } let icontemp = 'https://cdn.heweather.com/cond_icon/' + weatherOption.weatherCode[weathertemp] + '.png'; this.dataWeather = {city, daytemp, nighttemp, weathertemp, peraturetemp, icontemp} // alert(city+"天气") } } }) }, timeFn () { setInterval(() => { this.dateDay = formatTime(new Date(), 'HH: mm: ss'); this.dateYear = formatTime(new Date(), 'yyyy-MM-dd'); this.dateWeek = this.weekday[new Date().getDay()]; }, 1000) }, cancelLoading () { setTimeout(() => { this.loading = false; }, 2000); }, hiddenbar () { // navbar是顶部栏,根据是否全屏让顶部栏高度为0不展示或50展示出来 var navbar = document.getElementById('navbar') navbar.style.display="none"; navbar.style.height = 0+'px' // screenfull.isFullscreen ? 0 + 'px' : 50 + 'px' // sidebar是侧边栏距离顶部距离,如果不设置,可能会空出一块,看自己代码是什么样的 var sidebar = document.getElementById('sidebar') sidebar.style.display="none" // this.$refs.chinaMap.getDataBtsToday(); // 调用子类的方法 this.$refs.chinaMap.getMapData(); // 调用子类的方法 // 刷新 location.reload() // this.$router.go(0) }, back(){ const routeData = this.$router.resolve({ name: 'home' }); window.open(routeData.href, '_blank'); // this.$refs.chinaMap.myChartChinaClear(); // 调用子类的方法 // // navbar是顶部栏,根据是否全屏让顶部栏高度为0不展示或50展示出来 // var navbar = document.getElementById('navbar') // navbar.style.display="block" // // navbar.style.height = 0+'px' // screenfull.isFullscreen ? 0 + 'px' : 50 + 'px' // // sidebar是侧边栏距离顶部距离,如果不设置,可能会空出一块,看自己代码是什么样的 // var sidebar = document.getElementById('sidebar') // sidebar.style.display="block" // // this.$router.go(-1);//返回上一层 // this.$router.push({ name: 'home' }) // // this.$router.replace({ name: 'home' }) }, //这里单独的调用全屏 ================================= toggleFullScreen() { if (!document.fullscreenElement) { this.enterFullScreen(); } else { this.exitFullScreen(); } }, enterFullScreen() { let element = document.documentElement; if (element.requestFullscreen) { element.requestFullscreen().then(() => { this.adjustFullScreenStyles(); }); } }, exitFullScreen() { if (document.exitFullscreen) { document.exitFullscreen().then(() => { this.removeFullScreenStyles(); }); } }, adjustFullScreenStyles() { // 添加全屏时需要的样式,比如全屏时的背景色等 document.html.style.overflow = 'hidden'; // 移除默认边距 document.getElementById('index').style.overflow = 'hidden'; document.body.style.backgroundColor = '#000'; document.body.style.overflow_x = 'hidden'; // 隐藏滚动条 document.body.style.overflow_y = 'hidden'; // 隐藏滚动条 document.body.style.overflow = 'hidden'; // 隐藏滚动条 document.body.style.margin = '0'; // 移除默认边距 //alert('进入全屏模式') }, removeFullScreenStyles() { // 移除全屏时添加的样式 document.body.style.backgroundColor = ''; document.body.style.overflow = ''; // 显示滚动条 document.body.style.margin = ''; // 恢复默认边距 // document.html.style.overflow_y = 'hidden'; // 移除默认边距 } // ======================================== } } </script> <style lang="scss"> @import '../../assets/scss/index.scss' // </style> html { // /*隐藏滚动条,当IE下溢出,仍然可以滚动*/ overflow-y: none; -ms-overflow-style:none; // /*火狐下隐藏滚动条*/ overflow:-moz-scrollbars-none; } body { margin: 0; overflow-y: scroll; overflow-x: hidden; width: calc(100% + 17px); /* 17px是大多数浏览器滚动条的默认宽度 */ } /*Chrome下隐藏滚动条,溢出可以透明滚动*/ // html::-webkit-scrollbar{width:0px} // <style lang="scss" scoped> #index { .dv-border-box-10, .dv-border-box-12, .dv-border-box-13{ height: inherit; } .dataweather { z-index: 999; position: absolute; // top: .2rem; // left: 1.1rem; font-size: .22rem; color: #fff; img { width: .3rem; height: .3rem; filter: brightness(3); vertical-align: bottom; margin-bottom:.18rem; } } .datatime { z-index: 999; position: absolute; top: .3rem; right: 1.1rem; font-size: .22rem; color: #fff; } .topNumber { height: 100%; display: flex; justify-content: space-around; align-items: center } .right-menu-item { display: inline-block; padding: 0 8px; height: 100%; font-size: 18px; color: #5a5e66; vertical-align: text-bottom; &.hover-effect { cursor: pointer; transition: background .3s; &:hover { background: rgba(0, 0, 0, .025) } } } } </style>表格展示顺序改为将工作状态按照充电、放电、搁置、离线排列显示
最新发布
08-19
<think>我们需要将工作状态按照特定的顺序(充电、放电、搁置、离线)排列显示。这通常需要对数据进行排序,然后展示在表格中。 假设我们有一个表格数据,其中每个数据项有一个表示工作状态的字段(例如:status)。我们需要在展示表格时,按照上述顺序排列。 思路: 1. 在获取到表格数据后,对数据进行排序。 2. 自定义排序规则:充电 -> 放电 -> 搁置 -> 离线。 3. 将排序后的数据展示在表格中。 具体步骤: 我们可以使用数组的sort方法,并自定义一个排序函数,根据工作状态的值按照指定顺序排序。 例如,我们定义顺序数组:const order = ['充电', '放电', '搁置', '离线']; 在排序函数中,我们将每个状态在顺序数组中的索引作为排序依据。 注意:如果状态不在顺序数组中,我们可以将其排在最后。 代码示例(使用JavaScript): 假设我们有一个表格数据数组:tableData,每个元素是一个对象,其中status字段表示工作状态。 排序代码: ```javascript const order = ['充电', '放电', '搁置', '离线']; tableData.sort((a, b) => { const indexA = order.indexOf(a.status); const indexB = order.indexOf(b.status); // 如果状态不在顺序数组中,则将其排在后面(比如赋予一个很大的值) return ( (indexA === -1 ? order.length : indexA) - (indexB === -1 ? order.length : indexB) ); }); ``` 然后,将排序后的tableData绑定到表格组件即可。 如果是在Vue的表格组件中,我们可以在计算属性中返回排序后的数据,或者在获取数据后立即排序。 下面是一个在Vue组件中实现的示例: 模板部分(使用Element UI表格): ```html <el-table :data="sortedTableData" style="width: 100%"> <el-table-column prop="status" label="工作状态"></el-table-column> <!-- 其他列 --> </el-table> ``` 脚本部分: ```javascript export default { data() { return { tableData: [], // 原始数据 // ...其他数据 }; }, computed: { sortedTableData() { const order = ['充电', '放电', '搁置', '离线']; // 注意:这里我们返回一个新的排序后的数组,不改变原始数据 return [...this.tableData].sort((a, b) => { const indexA = order.indexOf(a.status); const indexB = order.indexOf(b.status); return (indexA === -1 ? order.length : indexA) - (indexB === -1 ? order.length : indexB); }); } }, created() { // 假设这里调用接口获取数据 this.fetchData(); }, methods: { fetchData() { // 模拟获取数据 // 假设从接口返回的数据赋值给this.tableData this.tableData = [ { status: '离线', /* 其他字段 */ }, { status: '充电', /* 其他字段 */ }, { status: '放电', /* 其他字段 */ }, { status: '搁置', /* 其他字段 */ }, { status: '未知', /* 其他字段 */ } // 测试不在顺序中的状态 ]; } } }; ``` 这样,表格就会按照我们定义的顺序显示工作状态。 注意:如果数据量很大,排序可能会影响性能,但一般情况下数据量不会太大。如果数据量非常大,可以考虑后端排序。 另外,如果状态值不是完全匹配的字符串(比如大小写不一致),我们需要在排序前进行统一处理(如转为相同的大小写)。 如果状态值使用的是英文,则顺序数组也应该使用英文,例如:['charging', 'discharging', 'idle', 'offline']。 根据你的实际需求调整状态字符串。 相关问题: 1. 如果我想让表格按照多个字段排序,比如先按状态排序,再按时间排序,应该如何修改? 2. 如果状态值不是固定的字符串,而是数字编码,比如0表示充电,1表示放电等,如何修改排序? 3. 在Vue中,如果表格数据是异步获取的,排序后表格没有更新,可能是什么原因? 4. 除了使用计算属性,还有哪些方法可以实现表格数据的排序?</think>要将工作状态按照充电、放电、搁置、离线顺序排列显示,需要对表格数据进行自定义排序。以下是完整的解决方案: ```vue <template> <el-table :data="sortedTableData" style="width: 100%"> <el-table-column prop="deviceId" label="设备ID"></el-table-column> <el-table-column prop="status" label="工作状态"> <template #default="{ row }"> <el-tag :type="statusTagType(row.status)"> {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column prop="voltage" label="电压(V)"></el-table-column> <el-table-column prop="temperature" label="温度(℃)"></el-table-column> </el-table> </template> <script> export default { data() { return { // 原始表格数据(无序) tableData: [ { deviceId: 'B001', status: '离线', voltage: 0.0, temperature: 25 }, { deviceId: 'B002', status: '搁置', voltage: 12.3, temperature: 27 }, { deviceId: 'B003', status: '放电', voltage: 48.2, temperature: 35 }, { deviceId: 'B004', status: '充电', voltage: 50.1, temperature: 38 }, { deviceId: 'B005', status: '离线', voltage: 0.0, temperature: 24 }, { deviceId: 'B006', status: '放电', voltage: 46.8, temperature: 34 } ] }; }, computed: { // 计算属性:按指定顺序排序后的数据 sortedTableData() { // 定义状态排序优先级 const statusOrder = { '充电': 1, '放电': 2, '搁置': 3, '离线': 4 }; // 创建新数组并排序 return [...this.tableData].sort((a, b) => { return statusOrder[a.status] - statusOrder[b.status]; }); } }, methods: { // 根据状态返回不同的标签样式 statusTagType(status) { const map = { '充电': 'success', '放电': 'warning', '搁置': 'info', '离线': 'danger' }; return map[status] || ''; } } }; </script> ``` ### 代码解释: 1. **状态排序优先级定义**: ```javascript const statusOrder = { '充电': 1, '放电': 2, '搁置': 3, '离线': 4 }; ``` 使用对象定义每个状态对应的优先级数值,数值越小排序越靠前 2. **排序计算属性**: ```javascript sortedTableData() { return [...this.tableData].sort((a, b) => { return statusOrder[a.status] - statusOrder[b.status]; }); } ``` - 使用扩展运算符 `[...]` 创建原数组的副本,避免直接修改原始数据 - 通过比较状态优先级数值实现自定义排序 3. **状态标签样式**: ```javascript statusTagType(status) { const map = { '充电': 'success', // 绿色 '放电': 'warning', // 黄色 '搁置': 'info', // 蓝色 '离线': 'danger' // 红色 }; return map[status] || ''; } ``` 为不同状态赋予不同的颜色标签,提高可视化效果 4. **表格渲染**: ```vue <el-table :data="sortedTableData"> <el-table-column prop="status" label="工作状态"> <template #default="{ row }"> <el-tag :type="statusTagType(row.status)"> {{ row.status }} </el-tag> </template> </el-table-column> </el-table> ``` 使用作用域插槽自定义状态列的显示方式,添加彩色标签 ### 实现效果: 1. 表格将严格按指定顺序显示:充电 → 放电 → 搁置 → 离线 2. 每种状态有对应的颜色标识: - 充电:绿色 - 放电:黄色 - 搁置:蓝色 - 离线:红色 3. 原始数据顺序不会影响最终显示顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值