- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个图像 slider ,可以通过鼠标拖放或手指在触摸屏上滑动来移动到下一张或上一张图像。到目前为止,一切都很好。但是由于使用笔记本电脑触摸板滑动相当棘手,所以我毕竟想添加下一个/上一个按钮。现在我的问题是他们弄乱了触摸和鼠标手势的代码。
导致的错误是:
我使用 console.log
和开发工具来确定和检查这些错误。由于我发现这个 slider 的问题很难解释,所以我制作了一个代码示例。
// set --n (used for calc in CSS) via JS, after getting
// .container and the number of child images it holds:
const _C = document.querySelector(".slider-container"),
N = _C.children.length;
_C.style.setProperty("--n", N);
// detect the direction of the motion between "touchstart" (or "mousedown") event
// and the "touched" (or "mouseup") event
// and then update --i (current slide) accordingly
// and move the container so that the next image in the desired direction moves into the viewport
// on "mousedown"/"touchstart", lock x-coordiate
// and store it into an initial coordinate variable x0:
let x0 = null;
let locked = false;
function lock(e) {
x0 = unify(e).clientX;
// remove .smooth class
_C.classList.toggle("smooth", !(locked = true));
}
// next, make the images move when the user swipes:
// was the lock action performed aka is x0 set?
// if so, read current x coordiante and compare it to x0
// from the difference between these two determine what to do next
let i = 0; // counter
let w; //image width
// update image width w on resive
function size() {
w = window.innerWidth;
}
function move(e) {
if (locked) {
// set threshold of 20% (if less, do not drag to the next image)
// dx = number of pixels the user dragged
let dx = unify(e).clientX - x0,
s = Math.sign(dx),
f = +(s * dx / w).toFixed(2);
// Math.sign(dx) returns 1 or -1
// depending on this, the slider goes backwards or forwards
if ((i > 0 || s < 0) && (i < N - 1 || s > 0) && f > 0.2) {
_C.style.setProperty("--i", (i -= s));
f = 1 - f;
}
_C.style.setProperty("--tx", "0px");
_C.style.setProperty("--f", f);
_C.classList.toggle("smooth", !(locked = false));
x0 = null;
}
}
size();
addEventListener("resize", size, false);
// ===============
// drag-animation for the slider when it reaches the end
// ===============
function drag(e) {
e.preventDefault();
if (locked) {
_C.style.setProperty("--tx", `${Math.round(unify(e).clientX - x0)}px`);
}
}
// ===============
// prev, next
// ===============
let prev = document.querySelector(".prev");
let next = document.querySelector(".next");
prev.addEventListener("click", () => {
if (i == 0) {
console.log("start reached");
} else if (i > 0) {
// decrease i as long as it is bigger than the number of slides
_C.style.setProperty("--i", i--);
}
});
next.addEventListener("click", () => {
if (i < N) {
// increase i as long as it's smaller than the number of slides
_C.style.setProperty("--i", i++);
}
});
// ===============
// slider event listeners for mouse and touch (start, move, end)
// ===============
_C.addEventListener("mousemove", drag, false);
_C.addEventListener("touchmove", drag, false);
_C.addEventListener("mousedown", lock, false);
_C.addEventListener("touchstart", lock, false);
_C.addEventListener("mouseup", move, false);
_C.addEventListener("touchend", move, false);
// override Edge swipe behaviour
_C.addEventListener(
"touchmove",
e => {
e.preventDefault();
},
false
);
// unify touch and click cases:
function unify(e) {
return e.changedTouches ? e.changedTouches[0] : e;
}
/* parent of book-container & container (slider) */
main {
overflow: hidden;
display: flex;
justify-content: space-between;
}
/* wraps entire slider */
.slider-wrapper {
overflow: hidden;
width: 100%;
position: relative;
}
.slider-nav {
position: absolute;
top: 0;
left: 0;
width: 100%;
text-align: center;
margin: 0;
padding: 1%;
background: rgba(0,0,0,0.6);
color: #fff;
}
/* slider controls*/
.control {
position: absolute;
top: 50%;
width: 40px;
height: 10px;
color: #fff;
font-size: 3rem;
padding: 0;
margin: 0;
line-height: 0;
}
.prev,
.next {
cursor: pointer;
transition: all 0.2s ease;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background: rgba(0,0,0,0.3);
padding: 1rem;
}
.prev {
left: 1.1rem;
}
.next {
right: 1.1rem;
}
.prev:hover,
.next:hover {
transform: scale(1.5,1.5);
}
.slider-container {
/*
n variable holds number of images to make .container wide enough
to hold all its image children
that still have the same width as its parent
*/
display: flex;
align-items: center;
overflow-y: hidden;
width: 100%; /* fallback */
width: calc(var(--n)*100%);
height: 31vw;
max-height: 100vh;
transform: translate(calc(var(--i, 0)/var(--n)*-100% + var(--tx, 0px)));
}
/* transition animation for the slider */
.smooth {
/* f computes actual animation duration via JS */
transition: transform calc(var(--f, 1)*.5s) ease-out;
}
/* images for the slider */
img {
width: 100%; /* can't take this out either as it breaks Chrome */
width: calc(100%/var(--n));
pointer-events: none;
}
<div class="slider-wrapper">
<div class="slider-container">
<img src="https://source.unsplash.com/featured?technology">
<img src="https://source.unsplash.com/featured?dogs">
<img src="https://source.unsplash.com/featured?cats">
<img src="https://source.unsplash.com/featured?cake">
<img src="https://source.unsplash.com/featured?birds">
<img src="https://source.unsplash.com/featured?cities">
</div>
<div class="slider-controls">
<span class="control prev">←</span>
<span class="control next">→</span>
</div>
</div>
<!-- END slider-wrapper -->
如果有人能帮我解决这个问题,那就太好了,这样通过鼠标或触摸滑动幻灯片的代码就不会与下一个/前一个按钮的代码混淆。
最佳答案
我想我已经找到了为您修复代码的快速方法。
prev.addEventListener("click", () => {
if (i == 0) {
console.log("start reached");
} else if (i > 0) {
// decrease i as long as it is bigger than the number of slides
_C.style.setProperty("--i", --i);
}
});
next.addEventListener("click", () => {
if (i+1 < N) {
// increase i as long as it's smaller than the number of slides
_C.style.setProperty("--i", ++i);
console.warn(i);
}
});
您在增加计数器的逻辑时遇到了错误。它在“事后”增加和减少。这会导致您的按钮出现问题。
slider 卡住的问题可以通过缩小浏览器窗口、单击并拖动鼠标到窗口外并在窗口外释放来重现。
提示:您应该为 'mouseleave'
事件实现一个监听器。
附言
整个代码可能会简单得多,如果您需要帮助以“更好”地编写它,请随时联系我:) 我会在有空闲时间时尽力提供帮助:)
关于javascript - 触摸图像 slider : next/prev keys interfere with code for current slide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429425/
我嵌套了 ul li 列表 > dentry > 隔离 Material 活髓剂 eclipse 刻剂 > dentry 矫正 > dentry 药品 > 口服 使用下面的 html De
我查看了一些关于 fragment 之间的动画交易的教程。我已经将这种方法用于动画并且效果很好: fragmentTransaction.setCustomAnimations(android.R.a
我有面板。我希望面板主体在单击面板标题的加号图标时向下滑动和向上滑动。 我不会使用 jquery。我必须使用纯 CSS3 来完成。 我正在使用 Angular 2 来处理条件。 .slide_down
我正在使用周期 2 ( http://jquery.malsup.com/cycle2/ ) 创建轮播,但我无法弄清楚如何通过“幻灯片编号”访问幻灯片。 我可以使用cycle.API循环遍历幻灯片数组
我是记者和官员软件包的狂热用户,目前正试图过渡到官员的 Powerpoint 工作流程。我正在使用包含幻灯片编号占位符的幻灯片模板。 使用 Reporters 时,我可以使用 doc % add_
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如何仅在第一张幻灯片上隐藏 ion slide pager?我的代码是这样的: ABC BCD 所以我有 2 张幻灯片,但只有一个标签。 谢谢 最佳答案 你可以使用
(对不起我的英语) 我在使用 Google Slides API 时遇到问题。使用 Google Slides API 创建新演示文稿时如何选择主题? 谢谢。 1.创建演示文稿 functio
有没有办法通过 rest API 更改 Google Slides 表格的表格单元格填充属性? 更新表格单元格属性似乎没有任何单元格填充属性 最佳答案 虽然不完全相同,但可以通过设置单元格文本段落缩进
我尝试让 ion-slide-box 从某个索引开始。 幻灯片 Controller : $ionicSlideBoxDelegate.slide(index); 滑动框温度: ... 这行不通。可能
我有一个看起来像这样的 slider : $('#slider').cycle({ fx: 'scrollHorz', speed: 1250, timeout: 5000,
我一直在剖析 firebug 中的事件和 ui 对象,但它似乎没有任何我可以使用的东西。我错过了什么吗?我想我可以跟踪值的变化,但这似乎是一种困惑。 $(".selector").slider({
我正在构建一个无限的 jQuery 轮播。无限是它在向用户显示最终幻灯片后立即显示第一张幻灯片。为此,我在完成后回调函数中做了这个小调整 $('#slide li:last').after('#sli
我在顶部菜单(ListItems)的开头插入一个菜单选项并使用 $('#newMenuItem').show('slide'); 成功了。但是,我不喜欢它从左上角滑入的方式,所以我将其更改为 $('#
我正在尝试创建新的 4:3 演示文稿,而不是 16:9。 我阅读了此引用文献并编写了一些 ruby 代码,但它不起作用。新演示文稿的高度与我指定的高度不同。 Method: presentatio
我有一个数组,我正在尝试使用其中的信息来创建 Google 幻灯片演示文稿。我需要一些帮助,如果可能的话,还需要一些我可以阅读的 Material ,以便更好地理解这些问题的可能解决方案。 数组如下:
我有一个没有指示器按钮的 Twitter Bootstrap 3 旋转木马。我没有使用那些指示器按钮,而是使用选项卡(我在我的 CSS 中相应地设置了样式)。这样,用户就知道每张幻灯片是什么(基于选项
在我的页面上,我有一个用于图像的 ion-slide-box。由于在我的应用程序中用户将能够嵌入视频,因此我还应该将带有视频的 iframe 添加到同一个 slider 。这就是我的代码现在的样子:
我正在开发全屏 Bootstrap 4 轮播。幻灯片不包含图像,而是包含视频 和标题。 我的目的是将幻灯片的标题放在事件幻灯片的左侧和右侧,在 slider 控件之上,给人以标题被用作控件的印象。所需
这是我遇到问题的特定 View 的 Controller 。 .controller('MenuCtrl', ['$rootScope','$scope','$state','$timeout','$
我是一名优秀的程序员,十分优秀!