Vue3 第三十一篇:常用组件:右键菜单

JSX:

import { reactive } from "vue";
import style from "./home.module.css";

let { rightShow, rightStyle } = reactive({
  // 右键菜单是否正在显示
  rightShow: false,
  // 右键菜单样式:用来控制菜单展示的位置和盒子大小
  rightStyle: {
    left: "0px", // 坐标x
    top: "0px", // 坐标y
    maxHeight: "0px", // 右键菜单的最高高度 (控制是否展开)
  },
});

// 主视图:右键菜单
const RightClickMenu = () => {
  //右键打开菜单
  const rightShowMenu = (event) => {
    // 阻止原生右键菜单
    event.preventDefault();
    rightStyle.left = event.clientX + "px";
    rightStyle.top = event.clientY + "px";
    rightStyle.maxHeight = "200px";
    rightShow = true;
  };

  // 关闭右键菜单 - 立即关闭
  const rightCloseMenu = () => {
    rightStyle.maxHeight = "0px";
    rightShow = false;
  };

  // 关闭右键菜单 - 带动画折叠关闭 (失去焦点和点击取消时调用, 为什么不全部调用这个? 因为其它时候调用这个都太卡了)
  const rightCloseMenu2 = () => {
    rightStyle.maxHeight = "0px";
  };

  // 右键 刷新
  const rightF5 = () => {};

  // 右键 复制
  const rightCopy = () => {};

  // 右键 关闭
  const rightClose = () => {};

  // 右键 关闭其他
  const rightCloseOther = () => {};

  // 右键 关闭所有
  const rightCloseAll = () => {};

  // 右键 悬浮
  const rightXf = () => {};

  // 右键 全屏
  const rightFull = () => {};

  // 右键 - 新窗口打开
  const rightWindowOpen = () => {};
  return(
    <>
      {/* 测试区域 */}
      <div style={{backgroundColor:'blue',width:'300px',height:'300px'}} onContextmenu={rightShowMenu}></div>

      <div className={style.rightBox} style={rightStyle} v-show={rightShow} tabindex="-1" onBlur={rightCloseMenu2}>
        <div className={style.rightBox2}>
          <div onClick={[rightCloseMenu, rightF5]}><el-icon><CaretRight /></el-icon>刷新</div>
          <div onClick={[rightCloseMenu, rightCopy]}><el-icon><CaretRight /></el-icon>复制</div>
          <div onClick={[rightCloseMenu, rightClose]}><el-icon><CaretRight /></el-icon>关闭</div>
          <div onClick={[rightCloseMenu, rightCloseOther]}><el-icon><CaretRight /></el-icon>关闭其它</div>
          <div onClick={[rightCloseMenu, rightCloseAll]}><el-icon><CaretRight /></el-icon>关闭所有</div>
          <div onClick={[rightCloseMenu, rightXf]}><el-icon><CaretRight /></el-icon>悬浮打开</div>
          <div onClick={[rightCloseMenu, rightFull]}><el-icon><CaretRight /></el-icon>全屏打开</div>
          <div onClick={[rightCloseMenu, rightWindowOpen]}><el-icon><CaretRight /></el-icon>新窗口打开</div>
          <div onClick={[rightCloseMenu2]}><el-icon><CaretRight /></el-icon>取消</div>
        </div>
      </div>
    </>
)
};

export default RightClickMenu;

CSS:

/* 右键菜单 样式 */
.rightBox {
  position: fixed;
  z-index: 2147483647;
  transition: max-height 0.2s;
  outline: none;
  max-height: 0px;
  overflow: hidden;
  box-shadow: 3px 3px 3px #666;
}

.rightBox2 {
  font-size: 0.8em;
  padding: 0.5em 0;
  border: 1px #aaa solid;
  border-radius: 1px;
  background-color: #fff;
}
.rightBox2 > div {
  line-height: 2.2em;
  padding-left: 0.7em;
  padding-right: 1.8em;
  cursor: pointer;
  white-space: nowrap;
}
.rightBox2 > div:hover {
  background-color: #ddd;
  color: #2d8cf0;
}
.rightBox2 > div i {
  margin-right: 8px;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值