magic-context-menu.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <ul class="magic-context-menu none-select" :style="style">
  3. <li v-for="(menu, key) in menus" :key="key" :class="{ divided: menu.divided }" @click.stop="() => {onMouseup(); menu.onClick && menu.onClick()}">
  4. <span v-if="hasIcon" class="magic-context-menu-icon"><magic-icon :icon="menu.icon" v-if="menu.icon" size="12px"/></span>
  5. <label>{{ menu.label }}</label>
  6. </li>
  7. </ul>
  8. </template>
  9. <script>
  10. export default {
  11. props: {
  12. menus: Array,
  13. onDestory: Function,
  14. position: Object
  15. },
  16. data() {
  17. return {
  18. style: {
  19. left: this.position.x + 'px',
  20. top: this.position.y + 'px'
  21. }
  22. }
  23. },
  24. mounted(){
  25. document.addEventListener('click', this.onMouseup)
  26. const max = this.position.x + this.$root.$el.offsetWidth
  27. const rect = document.querySelector('.magic-editor').getBoundingClientRect()
  28. if(rect.x + rect.width < max){
  29. this.style.left = `${rect.x + rect.width - this.$root.$el.offsetWidth}px`
  30. }
  31. },
  32. unmounted(){
  33. document.removeEventListener('click', this.onMouseup)
  34. },
  35. methods: {
  36. onMouseup(){
  37. this.onDestory && this.onDestory()
  38. }
  39. },
  40. computed: {
  41. hasIcon(){
  42. return this.menus.some(it => it.icon)
  43. }
  44. }
  45. }
  46. </script>
  47. <style scoped>
  48. .magic-context-menu{
  49. position: fixed;
  50. z-index: 999999;
  51. background-color: var(--main-background-color);
  52. border: 1px solid var(--main-border-color);
  53. }
  54. .magic-context-menu li{
  55. height: 24px;
  56. line-height: 24px;
  57. padding:0 10px;
  58. cursor: pointer;
  59. display: flex;
  60. }
  61. .magic-context-menu li > * {
  62. cursor: pointer;
  63. word-break: keep-all;
  64. }
  65. .magic-context-menu li.divided{
  66. border-bottom: 1px solid var(--main-border-color);
  67. }
  68. .magic-context-menu .magic-context-menu-icon{
  69. display: inline-block;
  70. text-align: center;
  71. margin-right: 5px;
  72. width: 13px;
  73. }
  74. .magic-context-menu li:hover{
  75. background-color: var(--select-option-hover-background-color);
  76. color: var(--select-option-hover-color);
  77. }
  78. .magic-context-menu li:hover :deep(.magic-icon){
  79. color: var(--select-option-hover-color);
  80. }
  81. </style>