2011 年 12 月更新:此错误已在 Opera 11.60 中修复。
这是一个有趣数字。 谷歌 搜索 了一些与错误相关的主题。 我之所以会遇到这个问题,是因为我收到了很多这样的邮件。
The AnythingSlider 在 Opera 中无法使用!
他们是正确的……但这似乎是一个相当新的问题,我始终无法弄清楚原因。 事实证明,这一切都归结于 32766。
我过去经常收到使用 AnythingSlider 的用户的邮件,他们添加了 80 多个幻灯片,结果发现它无法正常工作。 原因始终是包装所有幻灯片的内部 <ul> 元素太窄,无法容纳 80 个幻灯片。 它被设置为 9999px 的固定宽度。 正确的答案应该是使包装器的宽度等于单个幻灯片的宽度乘以幻灯片的数量(通过 JavaScript)。 但只是为了偷懒,我就在宽度上添加了一个“9”,使包装器变成了 99999px。 就是这个更改导致 Opera 出现问题。
显然,Opera 无法处理大于 32766px 的宽度。 Opera 论坛中有一个 主题,这意味着我并非孤军奋战。
读者 Erdei Csaba 向我提供了提示
32766px … 是最高有符号 16 位数 (32767) – 1。
Opera 必须将这些值存储为有符号 16 位数。 显然,更高的正值 (> 32767) 被处理为负值。 The CSS1 规范 明确禁止负宽度值,但较新的规范对此没有任何说明。 它们可能认为不需要说明,因为负宽度显然是荒谬的。
简而言之:Opera 中元素的最大宽度为 32766px,这应该得到修复。
我不知道什么更奇怪,是人们可以制作具有 80 个幻灯片的滑块,还是他们实际上费心去满足它,以取悦 2% 的访问者(当我肯定会在第 30 张幻灯片左右入睡时……)。
我同意……80 个幻灯片……啊,这是一部电影吗? 你是一个持久的男子,30 个去睡觉……我一个会在 10 个时分崩离析。
无论如何,Chris,干得好,我一直在使用 AnythingSlider,它太棒了。
仅仅因为你无法想到为什么要有 80 个幻灯片或需要超过这种宽度,并不意味着其他人没有。
像 JavaScript “电影”这样的东西真正需要这种宽度,或者可能是在您在巨大的屏幕上展示某样东西时。 我相信还有其他原因,但 Opera 确实应该修复这个问题。 将其设为负数对任何人都没有帮助……
很高兴知道。 虽然我有点同意 Fabio 的观点。 谁的网站上有 80 个幻灯片?
应该修复。 但即便如此,32766 仍然很多! 你可以在 32766 像素中塞进很多内容。 他们可能和 Fabio 想的一样。
我从未遇到过需要将 CSS 值设置为超过 1500 的情况。
我不确定这是否重要,但 16 位整数中可以存储的最大数字是 32767。 我不明白为什么要从中减去 1。
如果您尝试在 16 位有符号整数中存储 32768,它将表示为 -32768。 在 16 位有符号整数中完全可以表示 32767。 超过这个数字就会变成负数。
减去 1 用于查找最大范围。 对于 16 位整数,1 位用于符号,剩余的 15 位用于值。 在 15 位中,您可以存储高达 2^15 个值。 因此,如果您的计数从零开始(您应该这样做),那么您将一直计数到数字
2^15 – 1
即
32768 – 1
即:32767。
因此,在 16 位有符号整数中,您可以存储从 0 到 32767 的正值。
我知道它很混乱,但我希望它可以理解。
当文章指出 « 32766px … 是最高有符号 16 位数 (32767) – 1. » 时,它表示
– 32767 可以用 16 位整数表示,
– 32767 是最高有符号 16 位数。
所以你在这里说的是一回事 :)
« 我不明白为什么要从中减去 1。 »
我也不知道,因为我没有访问 Opera 源代码的权限。
但我可以想象一些用法。
首先,如果您设置了一个像 32767 这样的限制,那么您不希望需要 “这种值”(文章的重点是解释这种说法是错误的),这意味着您也不希望使用 32767。
当您需要像 “未初始化” 这样的 “特殊值” 时,如果 0 在您的上下文中是有意义的,那么最好使用 “最大值”,因为如果 “最大值” 有意义,那么 “最大值 + 1” 也可能是有意义的,这意味着您的限制太低了。
另一种解释是,这里只是有一个像 “
if (value<MAX_VALUE)
” 这样的测试,而不是 “if (value<=MAX_VALUE)
”。文章似乎还假设他们选择使用有符号值,因为他们认为该值实际上可以为负数。 实际上,在 C/C++ 中,始终使用有符号整数可能更好。 一方面,您会 “损失” 一半的值,但另一方面,说真的,如果可以使用 33000,那么 66000 就永远不会被使用吗? 如果 16 位不够,那就切换到 32 位吧……这不是有符号或无符号整数的问题……
混合使用有符号整数和无符号整数进行运算可能会导致 “不可预测” 的结果,有时(取决于编译器)您需要显式转换事物。 仅使用有符号整数 “可能” 是一种不错且简单的解决方案,这是一种架构选择(您可能喜欢也可能不喜欢)。
哦,你还记得那个曾经说过 “64 KByte 就足够了!” 的人吗? 他仍然因说出这句话而被嘲笑。
切换到 int-32 显然会消耗更多内存,并且总体上会降低浏览器速度。
哦,int-16 数据类型的正范围为 (2^16)/2 – 1 = 32766 (-32767 到 32766)。 除以 2 表示正数和负数。 减去 1 是因为它基于 0。
实际上,简而言之,您应该以正确的方式实施对 AnythingSlider 的更正。 只是说一下……
好吧,我很高兴我没有这样做,因为如果我做了,JavaScript 会计算超过 32766 的宽度,问题仍然会弹出。 因此,现在它被设置为最大预崩溃宽度。
但是,您现在不是在将 IE、Firefox、Chrome 等也设置为最大宽度吗? 尽管它们仍然能够在不出现错误的情况下超过该宽度?
使用 JavaScript 方法,然后对 Opera 浏览器进行限制,以防止它们的宽度超过 32766px,这不是更明智的做法吗?
也许我这里遗漏了什么,但我一直不喜欢这些问题。 希望有一天……
那么,您是将其设置为 32766 还是 9999px?
“只是说一下……”是互联网上的 “我知道我在当混蛋,但我还是说了……” 的等价说法。
哈哈,你说得对。 人们,别再对 Chris 当混蛋了!
很高兴知道。
这是个好消息。 我一直想知道为什么它在 Opera 中无法使用。
现在可能只有很少的人在使用 Opera……但它正在迅速获得市场份额。 而且,在全球范围内,它是领先的移动浏览器。
aaaaand….. Opera Mini 刚刚提交到应用商店,因此它很快就会在 iPhone 上上线(前提是苹果允许一些竞争)
苹果不允许使用 Google Latitude 或 Voice。如果他们批准 Opera Mini,我会非常惊讶。
像这样的错误让我想起了我以前在桌面编程的日子。当我看到 32766 时,我猜到了这篇文章要讲什么。
哦,很有趣。/me 做笔记
我知道这会让一些人感到困扰,但如果你有一个如此大的幻灯片演示文稿,你应该确保你不会为了浏览器的性能和内存使用而一次加载所有图片。
无论如何,我理解一个如此大的滑块是荒谬的,并且在实际滑块之外的范围内加载和删除幻灯片是不必要的,因为在这种情况下不应该使用滑块。
绝对需要修复,如果滑块是浏览器宽度,并且浏览器是全宽,在某些计算机上,你可能只能放进 12 个幻灯片。这可能不够,尤其是在图片库的情况下。
我能理解横向网站为了演示目的需要超过 32,766(7) 像素,例如
ONETWENTYSIX
感谢提醒。
我不确定那个网站是否能帮助你。这太荒谬了。上帝保佑,如果你用的是笔记本电脑......那东西太大了。如果你需要展示 80 个东西,我不确定滑块是不是最佳选择。
顺便说一下,如果这是你的网站,请忽略以上所有内容,我表示歉意。
我不得不同意 Jeremy 的观点,那个网站在 netbook 或手机上不可用,甚至是在小型笔记本电脑上也不可用。这是一个很棒的想法,但就是行不通。
我一般同意这种评论,但拜托。有时为了获得最引人注目的设计,你不得不做一些在小型笔记本电脑屏幕或手机上无法正常工作的东西。
说即使是最精心设计的投资组合也应该在手机上显示有点过分了......
如果他们在滚动滚轮向下/向上时添加了水平滚动,效果会好很多。
但没错,在小屏幕上肯定会让人反感。
我完全不同意。这是一个很棒的设计。如果他们愿意,可以提供移动版本,但这并不是不挑战完整计算机限制的理由。(我目前在使用笔记本电脑,不过分辨率还不错。)
我唯一要改进的是明确表明可以使用方向键(效果非常好)。因为内容的原因,我甚至不介意上下滚动一点。而且,如果我真的有时间,我会尝试根据实际窗口尺寸进行动态调整大小,但正如 Skilldrick 所说,这关乎引人注目的设计,而不是安全的設計。
我不得不说,32,766 看起来应该足够大了,可以容纳你想要的所有内容。如果你的内容比这更宽,你真的应该使用异步调用动态检索你的幻灯片,也许可以预先获取前后各一个或两个幻灯片以确保安全。
在屏幕分辨率达到 15,000 像素宽之前,我不认为需要超过 32,000 像素......
其次,仅仅因为 Opera 将其整数值存储在有符号的 16 位整数中,并不意味着最大宽度是 32,766,这意味着你可以设置的最大值是那个。1em > 1px,所以如果你将宽度设置为 32766em 会怎么样(我知道你实际上不会知道这有多宽,但你只是想要“足够宽”)。
这些只是最初的反应,所以请告诉我我在哪里犯了错误。
32766px 也是(至少一些旧版本的)Safari 的最大高度。
我一直都知道我是一个书呆子,但你真的必须是一个超级书呆子才会为了一个愚蠢的像素而进行长达几页的争论。我可能是错的,因为我没有使用过 Anything Slider,但我假设它有一个调整每个幻灯片显示时间的设置,如果是这样,也许有人将 80 多张图片塞进去了,实际上是在制作一部“粘贴动画”电影。
别费心了,Chris。我个人使用 Opera 作为浏览器,不幸的是,我网站上很多 jQuery 插件无法正常运行。例如,滚动到顶部。这些家伙在所有浏览器中都能完美运行,除了 Opera。请忽略它。
这才是开明的 Opera 用户。
好样的,这篇文章有助于解决 Opera 的 bug。
太棒了..!
谢谢..! العاب