div 可编辑 及placeholder设置 并且可以去掉 默认边框

本文介绍了一种利用CSS伪元素:before实现内容占位及动态显示效果的方法,适用于输入框默认提示文字的美观展示,当输入框获得焦点时默认文字自动消失。

<div contenteditable="true" class="ipt" placeholder="输入个人介绍,最多输入200个字"></div>

 

样式:

/*为空时显示 element attribute content*/
.ipt:empty:before{
  content: attr(placeholder); /* element attribute*/
  /*content: 'this is content';*/
  color:#ddd;
}
/*焦点时内容为空*/
.ipt:focus:before{
  content:none;
}
.ipt:focus{
  border: none;outline:none;
}

 

转载于:https://www.cnblogs.com/vsmart/p/6400770.html

这段代码中,表格没有展开,帮我改一下,给我全部的代码<template> <div class="container"> <!-- 头部区域 --> <div class="header"> <div class="left-section"> <!-- 左侧可放置标题或其他内容 --> </div> <div class="right-section"> <el-select v-model="filterType" placeholder="选择仓库类型" clearable style="width: 200px;" > <el-option v-for="type in uniqueTypes" :key="type" :label="type" :value="type" /> </el-select> </div> </div> <!-- 仓库表格 --> <el-table :data="pagedWarehouses" border stripe v-loading="loading" style="width: 100%" class="main-table" > <el-table-column prop="sn" label="SN" width="180" /> <el-table-column prop="label" label="标签" width="150" /> <el-table-column prop="type" label="类型" width="120"> <template #default="scope"> {{ scope.row.type }} ({{ scope.row.type_label }}) </template> </el-table-column> <el-table-column prop="status" label="状态" width="120"> <template #default="scope"> {{ scope.row.status }} ({{ scope.row.status_label }}) </template> </el-table-column> <el-table-column label="操作" width="180" fixed="right"> <template #default="scope"> <el-button size="small" type="primary" @click="handleEdit(scope.row)" >修改</el-button> <el-button size="small" type="danger" @click="handleDelete(scope.row)" >删除</el-button> </template> </el-table-column> </el-table> <!-- 分页组件 --> <div class="pagination-center"> <el-pagination background layout="total, prev, pager, next" :total="filteredWarehouses.length" :page-size="pageSize" v-model:current-page="currentPage" /> </div> <!-- 编辑对话框 --> <el-dialog v-model="dialogVisible" title="修改仓库信息" width="500px"> <el-form :model="currentItem" label-width="100px"> <el-form-item label="SN"> <el-input v-model="currentItem.sn" disabled /> </el-form-item> <el-form-item label="标签"> <el-input v-model="currentItem.label" /> </el-form-item> <el-form-item label="类型"> <el-select v-model="currentItem.type" placeholder="选择类型"> <el-option v-for="type in uniqueTypes" :key="type" :label="type" :value="type" /> </el-select> </el-form-item> <el-form-item label="状态"> <el-select v-model="currentItem.status" placeholder="选择状态"> <el-option label="正常" value="normal" /> <el-option label="维护" value="maintenance" /> <el-option label="停用" value="disabled" /> </el-select> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="confirmUpdate">确认</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { ref, computed, onMounted, onBeforeUnmount } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' // 仓库数据 const warehouses = ref([]) const filterType = ref('') const dialogVisible = ref(false) const currentItem = ref({}) const eventSource = ref(null) const loading = ref(false) // 分页相关状态 const currentPage = ref(1) const pageSize = ref(20) // 计算唯一类型列表 const uniqueTypes = computed(() => { return [...new Set(warehouses.value.map(item => item.type))] }) // 计算过滤后的仓库列表 const filteredWarehouses = computed(() => { if (!filterType.value) return warehouses.value return warehouses.value.filter(item => item.type === filterType.value) }) // 计算分页后的仓库列表 const pagedWarehouses = computed(() => { const start = (currentPage.value - 1) * pageSize.value const end = start + pageSize.value return filteredWarehouses.value.slice(start, end) }) // 初始化SSE连接 const initSSE = () => { const url = 'http://127.0.0.1:8888/sse/warehouse' if (eventSource.value) { eventSource.value.close() } loading.value = true eventSource.value = new EventSource(url) eventSource.value.onmessage = (event) => { try { const data = JSON.parse(event.data) warehouses.value = data loading.value = false } catch (error) { console.error('解析SSE数据出错:', error) loading.value = false } } eventSource.value.onerror = (error) => { console.error('SSE连接错误:', error) loading.value = false // 尝试重新连接 setTimeout(initSSE, 3000) } } // 处理编辑操作 const handleEdit = (row) => { currentItem.value = { ...row } dialogVisible.value = true } // 处理删除操作 const handleDelete = (row) => { ElMessageBox.confirm(`确定要删除仓库 ${row.label} (${row.sn}) 吗?`, '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { try { const response = await fetch(`http://127.0.0.1:8888/warehouse/${row.id}`, { method: 'DELETE' }) if (response.ok) { ElMessage.success('删除成功') } else { const errorData = await response.json() throw new Error(errorData.detail || '删除失败') } } catch (error) { ElMessage.error(`删除失败: ${error.message}`) } }).catch(() => {}) } // 确认更新操作 const confirmUpdate = async () => { try { const response = await fetch(`http://127.0.0.1:8888/warehouse/${currentItem.value.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ label: currentItem.value.label, type: currentItem.value.type, status: currentItem.value.status }) }) if (response.ok) { ElMessage.success('更新成功') dialogVisible.value = false } else { const errorData = await response.json() throw new Error(errorData.detail || '更新失败') } } catch (error) { ElMessage.error(`更新失败: ${error.message}`) } } onMounted(() => { initSSE() }) onBeforeUnmount(() => { if (eventSource.value) { eventSource.value.close() } }) </script> <style scoped> .container { padding: 20px; height: 100%; display: flex; flex-direction: column; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .left-section { display: flex; align-items: center; } .right-section { display: flex; align-items: center; } .main-table { flex: 1; overflow: hidden; } /* 分页居中样式 */ .pagination-center { display: flex; justify-content: center; margin-top: 15px; } /* 调整分页组件样式 */ .el-pagination { --el-pagination-bg-color: #fff; --el-pagination-button-disabled-bg-color: #fff; --el-pagination-button-bg-color: #fff; --el-pagination-hover-color: #409eff; --el-pagination-button-radius: 4px; } /* 分页按钮样式优化 */ .el-pagination .btn-prev, .el-pagination .btn-next, .el-pager li { min-width: 32px; height: 32px; line-height: 32px; margin: 0 4px; border-radius: 4px; } /* 当前页样式 */ .el-pager li.is-active { background-color: #409eff; color: #fff; font-weight: bold; } /* 表格边框优化 */ .el-table--border { border: 1px solid #ebeef5; border-radius: 4px; } /* 单元格内边距 */ .el-table td, .el-table th { padding: 8px 0; } </style>
最新发布
08-16
表格没展开,下拉框改到右边 <template> <div class="container"> <!-- 头部区域(左侧标题,右侧筛选框) --> <div class="header"> <div class="right-section"> <el-select v-model="filterType" placeholder="选择仓库类型" clearable style="width: 200px;" > <el-option v-for="type in uniqueTypes" :key="type" :label="type" :value="type" /> </el-select> </div> </div> <!-- 仓库表格 --> <el-table :data="pagedWarehouses" style="width: 100%" border stripe v-loading="loading" > <el-table-column prop="sn" label="SN" width="120" /> <el-table-column prop="label" label="标签" width="150" /> <el-table-column prop="type" label="类型" width="120"> <template #default="scope"> {{ scope.row.type }} ({{ scope.row.type_label }}) </template> </el-table-column> <el-table-column prop="status" label="状态" width="120"> <template #default="scope"> {{ scope.row.status }} ({{ scope.row.status_label }}) </template> </el-table-column> <el-table-column label="操作" width="180" fixed="right"> <template #default="scope"> <el-button size="small" type="primary" @click="handleEdit(scope.row)" >修改</el-button> <el-button size="small" type="danger" @click="handleDelete(scope.row)" >删除</el-button> </template> </el-table-column> </el-table> <!-- 分页组件 --> <div class="pagination-center"> <el-pagination background layout="total, prev, pager, next" :total="filteredWarehouses.length" :page-size="pageSize" v-model:current-page="currentPage" /> </div> <!-- 编辑对话框 --> <el-dialog v-model="dialogVisible" title="修改仓库信息" width="500px"> <el-form :model="currentItem" label-width="100px"> <el-form-item label="SN"> <el-input v-model="currentItem.sn" disabled /> </el-form-item> <el-form-item label="标签"> <el-input v-model="currentItem.label" /> </el-form-item> <el-form-item label="类型"> <el-select v-model="currentItem.type" placeholder="选择类型"> <el-option v-for="type in uniqueTypes" :key="type" :label="type" :value="type" /> </el-select> </el-form-item> <el-form-item label="状态"> <el-select v-model="currentItem.status" placeholder="选择状态"> <el-option label="正常" value="normal" /> <el-option label="维护" value="maintenance" /> <el-option label="停用" value="disabled" /> </el-select> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="confirmUpdate">确认</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { ref, computed, onMounted, onBeforeUnmount } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' // 仓库数据 const warehouses = ref([]) const filterType = ref('') const dialogVisible = ref(false) const currentItem = ref({}) const eventSource = ref(null) const loading = ref(false) // 分页相关状态 const currentPage = ref(1) const pageSize = ref(20) // 计算唯一类型列表 const uniqueTypes = computed(() => { return [...new Set(warehouses.value.map(item => item.type))] }) // 计算过滤后的仓库列表 const filteredWarehouses = computed(() => { if (!filterType.value) return warehouses.value return warehouses.value.filter(item => item.type === filterType.value) }) // 计算分页后的仓库列表 const pagedWarehouses = computed(() => { const start = (currentPage.value - 1) * pageSize.value const end = start + pageSize.value return filteredWarehouses.value.slice(start, end) }) // 初始化SSE连接 const initSSE = () => { const url = 'http://127.0.0.1:8888/sse/warehouse' if (eventSource.value) { eventSource.value.close() } loading.value = true eventSource.value = new EventSource(url) eventSource.value.onmessage = (event) => { try { const data = JSON.parse(event.data) warehouses.value = data loading.value = false } catch (error) { console.error('解析SSE数据出错:', error) loading.value = false } } eventSource.value.onerror = (error) => { console.error('SSE连接错误:', error) loading.value = false // 尝试重新连接 setTimeout(initSSE, 3000) } } // 处理编辑操作 const handleEdit = (row) => { currentItem.value = { ...row } dialogVisible.value = true } // 处理删除操作 const handleDelete = (row) => { ElMessageBox.confirm(`确定要删除仓库 ${row.label} (${row.sn}) 吗?`, '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { try { const response = await fetch(`http://127.0.0.1:8888/warehouse/${row.id}`, { method: 'DELETE' }) if (response.ok) { ElMessage.success('删除成功') } else { const errorData = await response.json() throw new Error(errorData.detail || '删除失败') } } catch (error) { ElMessage.error(`删除失败: ${error.message}`) } }).catch(() => {}) } // 确认更新操作 const confirmUpdate = async () => { try { const response = await fetch(`http://127.0.0.1:8888/warehouse/${currentItem.value.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ label: currentItem.value.label, type: currentItem.value.type, status: currentItem.value.status }) }) if (response.ok) { ElMessage.success('更新成功') dialogVisible.value = false } else { const errorData = await response.json() throw new Error(errorData.detail || '更新失败') } } catch (error) { ElMessage.error(`更新失败: ${error.message}`) } } onMounted(() => { initSSE() }) onBeforeUnmount(() => { if (eventSource.value) { eventSource.value.close() } }) </script> <style scoped> .container { padding: 20px; height: 100%; display: flex; flex-direction: column; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .left-section { display: flex; align-items: center; } .right-section { display: flex; align-items: center; } .el-table { flex: 1; overflow: hidden; } /* 分页居中样式 */ .pagination-center { display: flex; justify-content: center; /* 水平居中 */ margin-top: 15px; } /* 调整分页组件样式 */ .el-pagination { --el-pagination-bg-color: #fff; --el-pagination-button-disabled-bg-color: #fff; --el-pagination-button-bg-color: #fff; --el-pagination-hover-color: #409eff; --el-pagination-button-radius: 4px; } /* 分页按钮样式优化 */ .el-pagination .btn-prev, .el-pagination .btn-next, .el-pager li { min-width: 32px; height: 32px; line-height: 32px; margin: 0 4px; border-radius: 4px; } /* 当前页样式 */ .el-pager li.is-active { background-color: #409eff; color: #fff; font-weight: bold; } /* 表格边框优化 */ .el-table--border { border: 1px solid #ebeef5; border-radius: 4px; } /* 单元格内边距 */ .el-table td, .el-table th { padding: 8px 0; } /* 操作按钮间距 */ .el-button + .el-button { margin-left: 8px; } </style>
08-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值