vue3 选中对话框时,对话框右侧出一个箭头

先看下做出的效果:

html代码,其中listPlan.records是后台拿到的数据进行遍历

<template>
 <ul class="list">
          <li  style="height: 180px;width: 95%"
            :key="index"
            v-for="(item, index) in listPlan.records"
            :style="liStyle(index)"
            @click="selectItem(index,item.id)" >

            <span v-if="selectedIndex === index" class="shixin"></span>
            <span v-if="selectedIndex === index" class="kongxin"></span>
            <div   class="notice">
              <div class="fsPnameDiv">
                <div  class="fsPname" >
                    {{ item.fsPname }}
                </div>

                <div v-if="item.fsStatus=='00'" style="color: #0a8fe9">
                  <span class="ant-badge-status-dot" style="background: rgb(68, 160, 239);"></span>
                  激活
                </div>
                <div v-if="item.fsStatus!='00'" style="color: rgb(208 213 217)">
                  <span class="ant-badge-status-dot" style="background: rgb(208 213 217);"></span>
                   禁用
                </div>
              </div>
              <div style="margin-top: 5px">
                每隔{{ item.fsExecinterval }}  {{ item.fsExecintervaltype  }} 执行一次
              </div>
              <div style="margin-top: 5px">
                创建时间:{{ item.createTime }}
              </div>
            </div>
          </li>
        </ul>

</template>

ts代码

原理:选中时判断比较选中的下标是和循环中的游标一致改变样式

let planId=null;

// 当前选中的索引
const selectedIndex = ref(-1);
// 动态生成 li 的样式
const liStyle = (index: number) => {
  return {
    border: '1px solid #ccc', // 添加边框
    borderRadius: '5px',
    padding: '10px', // 内边距
    margin: '5px 0', // 外边距
    cursor: 'pointer', // 鼠标指针样式
    position: 'relative', // 相对定位,用于放置箭头
    borderLeft: selectedIndex.value === index ? '2px solid rgb(9 95 240)' : '1px solid #ccc', // 选中时的框样式
    borderBottom: selectedIndex.value === index ? '2px solid rgb(9 95 240)' : '1px solid #ccc',
    borderTop: selectedIndex.value === index ? '2px solid rgb(9 95 240)' : '1px solid #ccc',
    borderRight: selectedIndex.value === index ? '2px solid rgb(9 95 240)' : '1px solid #ccc',
  };
};

css

原理:无大小的div设置30px的边框全透明,再单独设置要显示一侧边框的颜色和大框一致

<style lang="less" scoped>

.notice{
  align-items: flex-start;
  display: flex;
  flex-direction: column;
  padding: 8px 8px 12px;
}

.shixin {
  border: 10px solid transparent;
  border-left-color: #095ff0;
  position: absolute;
  top: 45%;
  right: -20px;
}
.kongxin {
  border: 10px solid transparent;
  border-left-color: #fff;
  position: absolute;
  top: 45%;
  right: -18px;
}
</style>

参考:通过css画出带箭头的提示框 - 简书

上一篇:Docker 导入导出指南


下一篇:面试域——个人简历准备