绝对定位的元素阻止拖动事件

4
我试图制作一个滑块,但遇到了一个问题。 我面临的问题是绝对定位的元素阻塞了滑块拖动事件。 我需要想办法允许拖动底层图像通过绝对定位的元素进行拖动。 您有什么想法如何实现这一点吗? 非常感谢您提前的帮助!
“Draggable =“ true”不是解决方案,因为那个元素变得可拖动(并且会出现幽灵拖动图像)。 这是我的代码:
如果您喜欢Codepen,这里是链接:https://codepen.io/saksija/pen/MWgqNeJ
HTML:
<div id="app">
  <div class="slider" ref="slider">
    <div class="slider-wrapper" ref="sliderContainer">
      <img ref="slide" src="https://image.shutterstock.com/image-photo/really-wide-panoramic-sunrise-shot-260nw-35170.jpg">
      <div v-for="id in 2" :class="['subitem', 'o-'+id]"></div>
    </div>
  </div>
</div>

Vue/Javascript:

var app = new Vue({
  el: '#app',
  data: () => ({
    startX: 0,
    lastTranslate: 0,
    translate: 0
  }),
  watch: {
    translate(value) {
      this.$refs.sliderContainer.style.transform = `translate3d(${value}px, 0px, 0px)`;
    }
  },
  methods: {
    dragStart(event) {
      this.startX = event.screenX;
    },
    dragEnd(event) {
      this.translate = this.lastTranslate;
    },
    dragMove(event) {
      if (event.screenX === 0) return;

      let distance = event.screenX - this.startX;
      let newTranslate = this.translate + distance;
      let sliderContainer = this.$refs.sliderContainer;

      this.lastTranslate = newTranslate;
      sliderContainer.style.transform = `translate3d(${newTranslate}px, 0px, 0px)`;
    },
  },
  mounted() {
    let slider = this.$refs.slider;
    slider.addEventListener('dragstart', this.dragStart);
    slider.addEventListener('drag', this.dragMove);
    slider.addEventListener('dragend', this.dragEnd);
  }
})

CSS:

#app {
  position: relative;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}
.slider {
  position: relative;
  display: flex;
  width: 100%;
  height: 100%;
}
.slider-wrapper {
  position: relative;
  display: block;
  height: 100%;
}
.slider img {
  position: relative;
  display: block;
  height: 100%;
}
.subitem {
  position: absolute;
  top: 20%;
  bottom: 20%;
  width: 100px;
  background-color: red;
  user-select: none;
}
.subitem.o-1 {
  left: 3%;
}
.subitem.o-2 {
  left: 20%;
}

尝试将滑块的“z-index”设置为大于绝对元素。或者,将“pointer-events:none;”添加到绝对元素中。 - Moob
我尝试了z-index,但没有成功。但是pointer-events非常好用!谢谢! - protestator
1个回答

3
假设不需要和 .subitem 进行交互,你可以在它们上面使用 pointer-events:none;。例如:
.subitem {
  position: absolute;
  top: 20%;
  bottom: 20%;
  width: 100px;
  background-color: red;
  user-select: none;
  pointer-events:none;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接