vue右键自定义样式

在这里插入图片描述

<!-- eslint-disable vue/no-dupe-keys -->
<template>
  <div>
    <div class="search-box">
      <div class="search">
        <el-input placeholder="搜索" prefix-icon="el-icon-search" v-model="input2">
        </el-input>
      </div>
    </div>
    <div @contextmenu.prevent="showMenu" class="card-box">
      <el-card class="card" v-for="(item, index) in DataMergin" :key="index">
        <img :src="item.image" class="image" />
        <div class="card-txt">
          <span>{{ item.title }}</span>
          <div class="bottom clearfix">
            <span>更新时间:{{ item.time }}</span>
          </div>
        </div>
      </el-card>
    </div>
    <div class="fixed-box" :style="{ 'left': menuLeft + 'px', 'top': menuTop + 'px' }" ref="fixedBoxRef" @blur="handle"
      v-show="isShowMenu">
      <div :class="index == currentItmeIndex ? 'current-color' : ''" @mouseenter="handleMouseEnter(item, index)"
        class="menu-item" v-for="(item, index) in menusItme">
        <i class="icon-position" :class="index == currentItmeIndex ? 'el-icon-check' : ''"></i>
        {{ item }}
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      input2: "",
      isShowMenu: false,
      menuLeft: '',
      menuTop: '',
      iconShow: false,
      fixedBoxRef: '',
      menusItme: ['模型详情', '重命名', '分享', '移动到', '更新', '简略图', '模型对比', '删除', '插入', '切换'],
      currentItmeIndex: '',
      DataMergin: [
        {
          title: "Revit",
          image: require("../../assets/DataMerging_img/Revit.png"),
          time: "2021.01.31",
        },
        {
          title: "Navisworks",
          image: require("../../assets/DataMerging_img/Navisworks.png"),
          time: "2021.01.31",
        },
        {
          title: "MicroStation",
          image: require("../../assets/DataMerging_img/MicroStation.png"),
          time: "2021.01.31",
        },
        {
          title: "PDMS",
          image: require("../../assets/DataMerging_img/PDMS.png"),
          time: "2021.01.31",
        },
        {
          title: "Sketchup",
          image: require("../../assets/DataMerging_img/Sketchup.png"),
          time: "2021.01.31",
        },
        {
          title: "Inventor",
          image: require("../../assets/DataMerging_img/Inventor.png"),
          time: "2021.01.31",
        },
        {
          title: "3Ds MAX",
          image: require("../../assets/DataMerging_img/3Ds MAX.png"),
          time: "2021.01.31",
        },
        {
          title: "AUTOCAD",
          image: require("../../assets/DataMerging_img/AUTOCAD.png"),
          time: "2021.01.31",
        },
      ],
    };
  },
  mounted() {
    //失去焦点时关闭右击菜单
    document.addEventListener("click", (e) => {
      if (!this.$refs.fixedBoxRef.contains(e.target)) { this.isShowMenu = false; }
    });
  },

  methods: {
    handleMouseEnter(item, index) {
      // console.log('鼠标移入', item, index);

      this.currentItmeIndex = index;
      if (this.currentItmeIndex === index) {
        // console.log("相同");
        this.iconShow = true
      };
    },
    showMenu(e) {
      // console.log('ssssssssssssssss', e);
      e.preventDefault()
      this.isShowMenu = true
      this.menuLeft = e.pageX
      this.menuTop = e.pageY
    },
    handle() {
      // console.log("失去焦点");
    }


  }
};
</script>
<style lang="scss" scope>
.search-box {
  padding: 15px 55px 50px 0px;
  background-color: #fff;
  box-shadow: 0 3px 10px rgba(202, 196, 196, 0.3);
}

.search {
  width: 15%;
  float: right;
}

.card-box {
  margin: 20px;
  display: flex;
  justify-content: flex-start;
  flex-wrap: wrap;
}

.bottom {
  margin-top: 13px;
  line-height: 12px;
  color: #c1c1c1;
  font-size: 14px;
}

.image {
  width: 100%;
  height: 250px;
  display: block;
}

.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}

.clearfix:after {
  clear: both;
}

.card {
  text-align: center;
  width: 23.5%;
  height: 350px;
  margin: 0.7%;
}

.card-txt {
  padding: 14px;
  text-align: center;
  font-size: 20px;
}

.fixed-box {
  background-color: red;
  // position: absolute;
  position: fixed;
  z-index: 1004;
  background-color: #dadada;
  border-radius: 5px;
  width: 100px;
  padding-bottom: 8px;
  // height: 200px;
}

.menu-item {
  // position: absolute;
  // display: flex;
  // justify-content: center;
  // align-items: center;
  padding-left: 30%;
  cursor: pointer;
  margin-top: 8px;
  position: relative;
}

.current-color {
  background-color: grey;
}


.icon-position {
  position: absolute;
  left: 5px;
  top: 2px
}
</style>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue中实现自定义的鼠标右键菜单,你可以借助第三方插件或者自己编写代码来实现。下面是一个使用第三方插件 `vue-contextmenu` 的示例: 首先,安装 `vue-contextmenu` 插件: ```shell npm install vue-contextmenu ``` 然后,在你的Vue项目中,导入并注册 `vue-contextmenu` 插件: ```javascript import VueContextmenu from 'vue-contextmenu'; Vue.use(VueContextmenu); ``` 接下来,在需要添加右键菜单的元素上使用 `v-contextmenu` 指令,并绑定一个方法来定义菜单的内容和行为: ```html <template> <div> <div v-contextmenu="contextMenu"> Right-click me! </div> </div> </template> <script> export default { data() { return { contextMenu: [ { text: '菜单项1', action: 'menuItem1' }, { text: '菜单项2', action: 'menuItem2' }, { text: '菜单项3', action: 'menuItem3' } ] }; }, methods: { menuItem1() { console.log('执行菜单项1的操作'); }, menuItem2() { console.log('执行菜单项2的操作'); }, menuItem3() { console.log('执行菜单项3的操作'); } } }; </script> ``` 在这个例子中,`contextMenu` 数组定义了右键菜单的内容,每个菜单项都有一个 `text` 属性用于显示菜单项的文本,以及一个 `action` 属性用于定义菜单项被点击时要执行的方法。 运行项目后,当你在指定的元素上右键点击时,就会弹出自定义右键菜单,并执行相应的方法。 除了使用第三方插件外,你也可以根据需求自己编写代码来实现自定义的鼠标右键菜单。这需要使用原生JavaScript事件来捕获右键点击事件,并自定义菜单的样式和行为。 希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值