Javascript定位在Chrome或Safari中不起作用
Javascript positioning not working in Chrome or Safari
我有一个用Javascript编写的脚本,其目的是当窗口小于图像时,使图像保持在窗口的中心。它只是将图像向左移动图像宽度和窗口宽度之差的一半,以便图像的中心始终是屏幕的中心。当窗口不小于图像时,此左偏移设置为零。如果我在IE或Firefox中,它也能很好地工作。在webkit浏览器上,它永远不会变为零,当窗口比图像宽时,会产生类似于float:right
的效果。这是代码:
setTimeout(slideImageWidth, 1);
function slideImageWidth() {
var slideWidth = window.getComputedStyle(document.getElementById("slide-image")).width,
windowWidth = window.innerWidth,
slide = document.getElementById("slide-image"),
slideWidth = window.getComputedStyle(slide).width;
if (windowWidth < (slideWidth.replace("px", "") + 1) && slide.style.display !== "none") {
slide.style.left = ((((-slideWidth.replace("px", "") + windowWidth)) / 2) + "px");
}
else {
slide.style.left = 0;
setTimeout(slideImageWidth, 1);
};
我试着把slide.style.left = 0
放在if之前,然后让循环在下一毫秒处理它,但这也不起作用。我也尝试过两种布局:
slide.style.left = "0px";
slide.style.left = 0 + "px";
slide.style.left = "0" + "px";
slide.style.left = 0px;
没有一个在Chrome或Safari中工作,但除了最后一个在Firefox和IE中工作外,其他都工作。
当我在窗口比图像宽的情况下使用alert(slide.style.left)
时,Chrome和Safari中会返回一个正值,而不是Firefox和IE中的0,这告诉我0值永远不会写入slide.style.left
。然而,我知道我可以修改slide.style.left
,因为它仍然基于等式来定位自己。
为什么这个代码不适用于webkit浏览器,我该如何修复它?
首先,我认为是意外拼写错误的东西:
1) 您的代码引用了一个名为"slide1Width"的东西,它在任何地方都没有定义。2) 您的代码引用了一个名为"slide1"的东西,它在任何地方都没有定义。3) 你没有正确的右括号数量,最后一个括号后面莫名其妙地有一个分号
第二,最明显的错误不会导致你的特定问题:
(slideWidth.replace("px", "") + 1)
这个表达式不是你想要的。如果slideWidth是"440px",那么replace()调用会给出"440",("440"+1)是字符串"4441"。我不认为这是你在这里的意思。
第三,也是最后一点,我认为是你所问的实际错误的原因:时间。如果你打开开发工具,在加载slideImageWidth()后在一个宽窗口上手动运行它,但它无法居中,那么图像实际上会跳到中心,即使在Chrome上也是如此。为什么它不在页面加载时执行此操作?此处:
window.getComputedStyle(slide).width
该表达式在首次加载页面时立即返回"0px"。如果你等到图像加载完成,你就可以得到它的实际宽度,在这种情况下,你可以进行你想要的计算。(或者,大概你可以通过样式设置自己的宽度。)看起来IE在运行脚本之前加载并流动了图像,而Chrome则没有。
是否有理由使用setTimeout而不是调整大小事件?像这样的东西怎么样:
window.onresize = function(event) {
setSlidePosition();
};
function setSlidePosition() {
var slideLeft = (document.getElementById("slide-image").style.left.indexOf('px') != -1 ) ? document.getElementById("slide-image").style.left : '0px';
var numLeft = slideLeft.replace('px','');
console.log(numLeft);
var element = document.getElementById("slide-image")
if(element.width > window.innerWidth) {
var newLeft = (element.width - window.innerWidth) / 2 * -1 + "px";
document.getElementById("slide-image").style.left = newLeft;
} else {
document.getElementById("slide-image").style.left = "0px";
}
};
setSlidePosition();
http://jsfiddle.net/4qomq7tb/45/
至少在chrome和FF上的表现是一样的。不过,这并没有具体回答与代码相关的问题:/
- window.open(url).print()在Safari中不起作用
- 复制到剪贴板在safari-angularjs中不起作用
- Javascript Cookies在Safari中不起作用
- 带有Safari的Javascript;不起作用——所有其他浏览器都起作用
- 导航到新url时,Javascript在Safari中不起作用
- JS代码使IE9和Safari冻结,在Opera中不起作用
- html视频javascript播放方法在移动Safari中不起作用
- 为什么这个排序功能在 Safari 中不起作用
- $.getJSON 在 Chrome 和 Safari 中不起作用
- window.dispatchEvent 在 Firefox、Safari 或 IE 中不起作用
- 滚动到顶部按钮在 chrome 或 safari 中不起作用
- jQuery .play() 在移动 Safari 上不起作用
- jQuery .focus() 在 Safari(桌面)的搜索字段中不起作用
- HTML5<视频>元素在Firefox、Opera和Safari中不起作用
- 为什么find('input:focus')在safari中不起作用
- OfflineAudioContext.startRendering()基于承诺的函数在safari中不起作用
- ng模式验证在safari中不起作用
- 图像预览在Safari中不起作用
- 脚本在safari中不起作用
- CreateContextualFragment在safari中不起作用