- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这很奇怪!
概述:
我正在创建一个网络应用程序,并且我创建了一个类似于您在 Facebook 应用程序中找到的菜单。向右滑动它会显示,向左滑动它会隐藏。
我通过将 touchstart 事件绑定(bind)到页面正文来执行此操作,此时我记录手指按下的起点并绑定(bind) touchmove 和 touchend 事件。触摸移动事件找到当前手指位置,并通过设置 translate3d(x,y,z) 来移动包含页面内容的 div 以匹配手指位置。
它实际上非常好用。
在 touchend 上,然后我计算出手指移动的距离是否足以触发菜单显示或内容是否返回到其原始位置。无论选择什么,我都会应用一个类,该类又将 -webkit-transition: -webkit-transform etc 应用于内容 div。然后,我再次使用 translate3d(x,y,z) 设置了确定的结束位置,还设置了一个变量,用于暂时停止任何进一步的点击。
这就是问题所在!
问题:
此时,如果内容简单且具有基本结构,即文章布局页面,则转换会快速且即时。然而!如果内容很复杂,即一个大数据表,那么就会有一个暂停,从 1 到 30 秒不等……非常令人沮丧。
当它最终起作用时,回调会解除 touchmove 和 touchend 事件与 body 的绑定(bind),停止点击的变量也被取消设置,我们准备好重新开始。
我正在 iPad 1 上进行测试。滑动速度与停顿时间长短之间似乎没有任何相关性。内容移动的剩余距离也没有。
最后,我认为这是关键!
有一个按钮可以自动执行相同的打开关闭操作(同样,就像 facebook),它工作正常,如果你滑动,它会暂停,然后你点击那个按钮,它会立即开始工作,尽管在错误的方向上切换基于在已经设置为打开的变量上。这几乎就像它清除了某种动画队列并自行整理......
部分代码:
JavaScript
$body.bind({
'touchstart': function(e){
if( !swipeBan ){
// Reset
var used = false,
triggered = false,
dir = false;
// Get start point
start.x = e.originalEvent.touches[0].pageX;
start.y = e.originalEvent.touches[0].pageY;
$body.bind({
'touchmove': function(e){
// Get current value (will be the end value too)
end.x = e.originalEvent.touches[0].pageX;
end.y = e.originalEvent.touches[0].pageY;
// If we have not chosen a direction, choose one
if( !dir ){
dir = getDir();
}else{
var left = open && dir == 'left',
right = !open && dir == 'right';
if( left || right ){
var x = left ? maxSwipe - getDist('left') : getDist('right');
$content.setTransform(x);
used = true;
triggered = left ? maxSwipe - x > swipeTrigger : x > swipeTrigger;
e.preventDefault();
}
}
},
'touchend': function(e){
// Only go further if we are going the correct direction
if( used ){
swipeBan = true;
// Get ready for animation
function done(){
// Get touching!
swipeBan = false;
// Stop animating
$content.removeClass('animate');
}
// Add animate class
$content.addClass('animate');
// Set the value
if( ( !open && triggered ) || ( open && !triggered ) ){
$content.setTransform(maxSwipe,0,function(){
done();
});
$body.removeClass('closed');
open = true;
}else if( ( !open && !triggered ) || ( open && triggered ) ){
$content.setTransform(0,0,function(){
done();
});
$body.addClass('closed');
open = false;
}
}
// Unbind everything
$body.unbind('touchmove touchend');
}
});
}else{
e.preventDefault();
}
}
});
您将在上面看到使用的集合转换插件。
$.fn.setTransform = function(x,y,callback){
y = y ? y : '0';
var $this = $(this);
if( callback ){
$this.one('webkitTransitionEnd',function(){
callback.apply(this);
});
}
$this.css({
'-webkit-transform': 'translate3d(' + x + 'px,' + y + '%,0)'
});
return this;
}
CSS,很简单。还应用了其他样式,但它们纯粹是视觉效果:
#content.animate {
-webkit-transition: -webkit-transform .3s cubic-bezier(.16,0,0,1);
}
抱歉发了这么长的帖子,这让我很烦!如果我无法解决问题,我将不得不将其删除。
我希望有人以前看过这个,并且可以提供帮助。 (或者可以在上面的代码中看到一个明显的错误!)
谢谢,
会:)
最佳答案
我最终解决了这个问题,认为它可能对其他人有用!
在触摸移动过渡结束和完成移动的过渡开始之间,根本不要向页面添加任何类。
我的过程曾经是:
但是,添加此类会强制 safari 应用任何样式更改,这显然是相当密集的,即使更改很少甚至没有更改也是如此。这就是暂停的原因。
我更改了我的流程,使用 javascript 而不是添加类来应用转换,现在它如丝般顺滑。
关于jquery - 如何在开始转换之前阻止移动 Safari 暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433668/
在带有 jQuery 的 CoffeeScript 中,以下语句有什么区别吗? jQuery ($) -> jQuery -> $ - > 最佳答案 第一个与其他两个不同,就像在纯 JavaScr
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭13 年前。 Improve th
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
这个问题可能听起来很愚蠢,但请耐心等待,因为我完全是初学者。我下载了两个 jQuery 版本,开发版本和生产版本。我想知道作为学习 jQuery 的初学者,什么更适合我。 最佳答案 如果您对 jQue
The documentation说要使用 1.6.4,但我们现在已经升级到 1.7.2。 我可以在 jQuery Mobile 中使用最新版本的 jQuery 吗? 最佳答案 您当然可以,但如果您想
我在这里看到这个不错的 jquery 插件:prettyphoto jquery lightbox有没有办法只用一个简单的jquery来实现这样的效果。 我只需要弹出和内联内容。你的回复有很大帮助。
很明显我正在尝试做一些 jQuery 不喜欢的事情。 我正在使用 javascript 上传图片。每次上传图片时,我都希望它可见,并附加一个有效的删除脚本。显示工作正常,删除则不然,因为当我用 fir
这两个哪个是正确的? jQuery('someclass').click(function() { alert("I've been clicked!"); }); 或 jQuery('somec
我正在寻找一个具有以下格式的插件 if (jQuery)(function ($) { -- plugin code -- })(jQuery); 我明白 (function ($)
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
我知道这个问题已经被问过几次了,但想知道您是否可以帮助我解决这个问题。 背景:我尝试创建一个使用 Ajax 提交的表单(jQuery 表单提交)。我已经工作得很好,然后我想在表单上得到验证。我可以使用
我正在使用无处不在的jquery validate plugin用于表单验证。它支持使用metadata plugin用于向表单元素添加验证规则。 我正在使用此功能。当验证查找这些规则时,它会对元素进
我更喜欢为我一直在开发的网络社区添加实用的视觉效果,但随着事情开始堆积,我担心加载时间。 拥有用户真的更快吗加载(希望是缓存的)副本来自 Google 存储库的 jquery? 是否使用 jQuery
这个问题已经有答案了: Slide right to left? (17 个回答) 已关闭 9 年前。 你能告诉我有没有办法在 jQuery 中左右滑动而不使用 jQuery UI 和 jQuery
我如何找出最适合某种情况的方法?任何人都可以提供一些示例来了解功能和性能方面的差异吗? 最佳答案 XMLHttpRequest 是原始浏览器对象,jQuery 将其包装成一种更有用和简化的形式以及跨浏
运行时 php bin/console oro:assets:build ,我有 11 个这样的错误: ERROR in ../node_modules/jquery-form/src/jquery.
我试图找到 jQuery.ajax() 在源代码中的定义位置。但是,使用 grep 似乎不起作用。 在哪里? 谢谢。 > grep jQuery.ajax src/* src/ajax.js:// B
$.fn.sortByDepth = function() { var ar = []; var result = $([]); $(this).each(function()
我的页面上有多个图像。为了检测损坏的图像,我使用了在 SO 上找到的这个。 $('.imgRot').one('error',function(){ $(this).attr('src','b
我在理解 $ 符号作为 jQuery 函数的别名时遇到了一些麻烦,尤其是在插件中。你能解释一下 jQuery 如何实现这种别名:它如何定义 '$' 作为 jQuery 函数的别名?这是第一个问题。 其
我是一名优秀的程序员,十分优秀!