前言
下面以一个小案例来复习下网格布局
<template>
<div class="app">
<!-- DateTimePicker 日期时间选择器 -->
<div class="container">
<div class="box1" style="background-color: saddlebrown;">
<span>Default</span>
<el-date-picker v-model="formData.value1" type="date" placeholder="Select date" />
</div>
<div class="box2" style="background-color: red;">
<span>height:300px</span>
<el-date-picker v-model="formData.value2" type="date" placeholder="Select date" />
</div>
<div class="box3" style="background-color: green;">
<span>height:300px</span>
<el-date-picker v-model="formData.value3" type="date" placeholder="Select date" />
</div>
<div class="box4" style="background-color: yellow;">
<span>height:300px</span>
<el-date-picker v-model="formData.value4" type="date" placeholder="Select date" />
</div>
<div class="box5" style="background-color: skyblue;">
<span>Default</span>
<el-date-picker v-model="formData.value5" type="date" placeholder="Select date" />
</div>
<div class="box6" style="background-color: purple;">
<span>Default</span>
<el-date-picker v-model="formData.value6" type="date" placeholder="Select date" />
</div>
<div class="box7" style="background-color: orange;">
<span>Default</span>
<el-date-picker v-model="formData.value7" type="date" placeholder="Select date" />
</div>
<div class="box8" style="background-color: orchid;">
<span>Default</span>
<el-date-picker v-model="formData.value8" type="date" placeholder="Select date" />
</div>
<div class="box9" style="background-color: #ccc;">
<span>Default</span>
<el-date-picker v-model="formData.value9" type="date" placeholder="Select date" />
</div>
<div class="box10" style="background-color: white;">
<span>Default</span>
<el-select v-model="formData.value10" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const formData = ref({
value1: null,
value2: null,
value3: null,
value4: null,
value5: null,
value6: null,
value7: null,
value8: null,
value9: null,
value10: null,
})
const options = ref([
{
value: 'Option1',
label: 'Option1',
},
{
value: 'Option2',
label: 'Option2',
}
])
</script>
<style lang="less" scoped>
.app {
.mockdemo {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
margin-bottom: 50px;
}
.container {
width: 100%;
height: 800px;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 200px 1fr 200px 100px;
:not(:nth-child(3n)) span{ //css复习:不是3的倍数的盒子改变字体大小
font-size: 28px;
font-weight: 700;
}
.box1{
grid-column: span 3;
display: flex;
justify-content: center;
align-items: center;
span{
padding-right: 20px;
}
}
// 隐藏select默认placeholder请选择文字
:deep(.is-transparent) {
opacity: 0;
}
}
}
</style>
显示效果如下:
正题来了
实际项目中需要更改日期时间选择器的默认图标和位置,检查DOM结构如下:
步骤一:
把原来类名为el-input__prefix的隐藏起来,代码如下:
:deep(.el-input__prefix) {
display: none;
}
步骤二:
往类名为el-input__suffix-inner的地方,追加进一个i标签,类名为el-icon el-input__icon里面用innerHTML填充svg标签,svg获取可以去iconfont下载,或者直接用检查DOM结构里element-plus的svg标签拷贝下就行啦
最终代码,这里找了iconfont图标库的支付宝图标:
onMounted(() => {
let keyNodes: NodeList = document.querySelectorAll('.el-input__suffix .el-input__suffix-inner')//获取节点集合
// console.log(typeof keyNodes[Symbol.iterator]);打印function说明实现了Iterator,可以用for of
for (const item of keyNodes) {
console.log(item);
const iNode = document.createElement("i")//创建一个i标签
iNode.className = "el-icon el-input__icon"//增加类名,所有浏览器都支持。
iNode.innerHTML = '<svg t="1706099515515" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1741" width="200" height="200"><path d="M1024.0512 701.0304V196.864A196.9664 196.9664 0 0 0 827.136 0H196.864A196.9664 196.9664 0 0 0 0 196.864v630.272A196.9152 196.9152 0 0 0 196.864 1024h630.272a197.12 197.12 0 0 0 193.8432-162.0992c-52.224-22.6304-278.528-120.32-396.4416-176.64-89.7024 108.6976-183.7056 173.9264-325.3248 173.9264s-236.1856-87.2448-224.8192-194.048c7.4752-70.0416 55.552-184.576 264.2944-164.9664 110.08 10.3424 160.4096 30.8736 250.1632 60.5184 23.1936-42.5984 42.496-89.4464 57.1392-139.264H248.064v-39.424h196.9152V311.1424H204.8V267.776h240.128V165.632s2.1504-15.9744 19.8144-15.9744h98.4576V267.776h256v43.4176h-256V381.952h208.8448a805.9904 805.9904 0 0 1-84.8384 212.6848c60.672 22.016 336.7936 106.3936 336.7936 106.3936zM283.5456 791.6032c-149.6576 0-173.312-94.464-165.376-133.9392 7.8336-39.3216 51.2-90.624 134.4-90.624 95.5904 0 181.248 24.4736 284.0576 74.5472-72.192 94.0032-160.9216 150.016-253.0816 150.016z" fill="#009FE8" p-id="1742"></path></svg>'
item.appendChild(iNode)
iNode.style.position = "absolute"; //根据自己需要调节位置
iNode.style.top = "8px";
iNode.style.right = "12px";
}
})
最终效果:
扩展一波:
iNode.setAttribute("class", "el-icon el-input__icon") IE6/7不支持setAttribute('class',xxx)方式设置元素的class。
iNode.className = "el-icon el-input__icon" //所有浏览器都支持。
//其他添加和删除class的方法
//添加:节点.classList.add("类名");
//删除:节点.classList.remove("类名");
写在最后
本文是通过操作DOM来解决这个需求,如果写的不对或者有更好的解决办法可以在评论区留言哦,觉得这篇文章能给你带来一点点帮助的话,请点个赞再走吧,谢谢!