我创建了一个水平项目画廊。我想让访问者向右拖动,然后向左滚动。
这是我的钢笔:https://codepen.io/omritk1/pen/qBByEoR。我的问题是,在滚动之后,在"mouseup“上,它会触发对链接的单击。如何防止此事件发生,同时也让用户点击链接.
(我用这支笔来设置JS:https://codepen.io/toddwebdev/pen/yExKoj)
const slider = document.querySelector('.catalog-list');
let isDown = false;
let startX;
let scrollLeft;
slider.addEventListener('mousedown', (e) => {
isDown = true;
slider.classList.add('active');
startX = e.pageX - slider.offsetLeft;
scrollLeft = slider.scrollLeft;
});
slider.addEventListener('mouseleave', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mouseup', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mousemove', (e) => {
if(!isDown) return;
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = (x - startX) * 1;
slider.scrollLeft = scrollLeft - walk;
console.log(walk);
});.projects-catalog .catalog-slider {
margin: 50px 0px;
}
.projects-catalog .catalog-cover {
position: relative;
}
.projects-catalog ul {
white-space: nowrap;
overflow-x: auto;
}
.projects-catalog li {
width: 75%;
height: 200px;
}
li.catalog-item {
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.projects-catalog li {
display: inline-block;
margin: 0 10px 0 0;
width: 350px;
height: 250px;
background: #222;
}<div class="projects-catalog">
<div id="imageSlider1" class="catalog-slider">
<div class="catalog-cover">
<ul id="sliderWrapper1" class="catalog-list corporate-projects">
<i id="prev1" class="fas fa-chevron-left move-left" style="display: flex;"></i>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<i id="next1" class="fas fa-chevron-right move-right"></i>
</ul>
</div>
</div>
</div>
发布于 2019-11-10 13:59:50
看起来像是this的复制品。
试试下面的片段。
const slider = document.querySelector(".catalog-list");
const preventClick = (e) => {
e.preventDefault();
e.stopImmediatePropagation();
}
let isDown = false;
let isDragged = false;
let startX;
let scrollLeft;
slider.addEventListener("mousedown", e => {
isDown = true;
slider.classList.add("active");
startX = e.pageX - slider.offsetLeft;
scrollLeft = slider.scrollLeft;
});
slider.addEventListener("mouseleave", () => {
isDown = false;
slider.classList.remove("active");
});
slider.addEventListener("mouseup", (e) => {
isDown = false;
const elements = document.querySelectorAll("a");
if(isDragged){
for(let i = 0; i<elements.length; i++){
elements[i].addEventListener("click", preventClick);
}
}
else{
for(let i = 0; i<elements.length; i++){
elements[i].removeEventListener("click", preventClick);
}
}
slider.classList.remove("active");
isDragged = false;
});
slider.addEventListener("mousemove", e => {
if (!isDown) return;
isDragged = true;
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = (x - startX) * 2;
slider.scrollLeft = scrollLeft - walk;
console.log(walk);
});.projects-catalog .catalog-slider {
margin: 50px 0px;
}
.projects-catalog .catalog-cover {
position: relative;
}
.projects-catalog ul {
white-space: nowrap;
overflow-x: auto;
}
.projects-catalog li {
width: 75%;
height: 200px;
}
li.catalog-item {
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.projects-catalog li {
display: inline-block;
margin: 0 10px 0 0;
width: 350px;
height: 250px;
background: #222;
}<div class="projects-catalog">
<div id="imageSlider1" class="catalog-slider">
<div class="catalog-cover">
<ul id="sliderWrapper1" class="catalog-list corporate-projects">
<i id="prev1" class="fas fa-chevron-left move-left" style="display: flex;"></i>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<a href="https://codepen.io/">
<li class="catalog-item"></li>
</a>
<i id="next1" class="fas fa-chevron-right move-right"></i>
</ul>
</div>
</div>
</div>
发布于 2019-11-10 13:27:10
将此添加到CSS文件中
.active .catalog-item {
pointer-events: none;
}编辑:学分:https://stackoverflow.com/a/24273710/5757893
编辑:然后从mousedown事件中删除以下行
slider.classList.add('active');并将其添加到mousemove事件方法中,如下所示:
if (Math.abs(startX - e.pageX) > 10) {
slider.classList.add('active');
}因此,如果您开始拖动至少10个像素,它将不会注册指针事件,但如果您没有移动太多,它将继续单击链接。
https://stackoverflow.com/questions/58788955
复制相似问题