3

我在我的 Web 应用程序的页面中看到一个奇怪的鼠标位置问题。我认为页面上特定元素的位置将是相同的,而与呈现它的浏览器无关。我希望使用来自客户端的位置值以及在服务器上执行的一些屏幕捕获功能。

但是我看到的是,每次当我选择页面的一部分时,顶部和左侧的位置都会相对于浏览器发生变化。我已经使用几个 JavaScript 属性测试了浏览器的顶部和左侧,但是对于不同的浏览器,固定位置的左侧和顶部似乎不同(几个像素的差异)。

// Detect if the browser is IE or not.
// If it is not IE, we assume that the browser is NS.
var IE = document.all ? true : false;

// If NS -- that is, !IE -- then set up for mouse capture
if (!IE) document.captureEvents(Event.MOUSEMOVE);

// Set-up to use getMouseXY function onMouseMove
document.onmousemove = getMouseXY;

// Temporary variables to hold mouse x-y pos.s
var tempX = 0;
var tempY = 0;

// Main function to retrieve mouse x-y pos.s

function getMouseXY(e) {
    if (!e) e = window.event;
    if (e.pageX || e.pageY) {
        tempX = e.pageX;
        tempY = e.pageY;
    } else if (e.clientX || e.clientY) {
        tempX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        tempY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }
    // catch possible negative values in NS4
    if (tempX < 0) {
        tempX = 0;
    }
    if (tempY < 0) {
        tempY = 0;
    }
    // show the position values in the form named Show
    // in the text fields named MouseX and MouseY

    document.Show.clientX.value = e.clientX;
    document.Show.clientY.value = e.clientY;
    document.Show.pageX.value = e.pageX;
    document.Show.pageY.value = e.pageY;
    document.Show.scrollLeft.value = document.body.scrollLeft;
    document.Show.scrollTop.value = document.body.scrollTop;

    document.Show.MouseX.value = tempX;
    document.Show.MouseY.value = tempY;
    return true;
}
html {
    font-family:arial;
    font-size:12px;
    margin:0px;
    padding:0px;
}
<body>
    <br/>
    <br/>
    <br/>
    <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="cursor:pointer;background:red;">.</span>

    <div style="position:absolute;top:200px;left:200px;width:800px;height:800px;">
        <form name="Show">
            <input type="text" name="clientX" value="0" size="8">e.clientX
            <br>
            <input type="text" name="clientY" value="0" size="8">e.clientY
            <br>
            <input type="text" name="pageX" value="0" size="8">e.pageX
            <br>
            <input type="text" name="pageY" value="0" size="8">e.pageY
            <br>
            <input type="text" name="scrollLeft" value="0" size="8">scrollLeft
            <br>
            <input type="text" name="scrollTop" value="0" size="8">scrollTop
            <br>
            <input type="text" name="MouseX" value="0" size="8">Left
            <br>
            <input type="text" name="MouseY" value="0" size="8">Top
            <br>
        </form>
    </div>
</body>

当您在各种浏览器中将鼠标悬停在红色框上时,请查看鼠标顶部和左侧返回。

为什么不同的浏览器返回不同的顶部/左侧值?我需要它为所有浏览器返回相同的值。如果有人可以提供对此行为的洞察并提出我可以规避此问题的方法,那就太好了。提前致谢。

4

3 回答 3

1

我认为页面上特定元素的位置将是相同的,无论它在哪个浏览器中呈现

你错了,它可能取决于它所呈现的浏览器。不同的浏览器使用不同的渲染引擎,遵循相同的渲染规范。因此,尽管它们应该看起来相同,但规范并没有使所有实现看起来完全一样。除此之外,还有实现上的差异。

规范中也有一些松散的结局,留给浏览器开发人员或渲染引擎开发人员的决定,例如应该是input字段的默认大小,可能没有在任何规范中指定,主要是因为它们通常超出范围。因此,如果您input在页面的开头有一个字段,如果您考虑位置,它的大小将影响static布局中随后出现的所有内容。

如果您对页面有完美的控制,那么您可以控制它以css在所有浏览器中看起来完全相同。这就是css开发人员所说的跨浏览器像素完美的意思,css而且非常简单。但是,如果您通常不能在任何页面上期待这一点。

话虽如此,我不清楚您要做什么,如果您能解释您的确切要求,可能有人可以帮助您。或者,如果您可以控制css页面,您可以控制页面css以使其在任何地方看起来都一样。

还请确保在报告问题时提及浏览器的确切差异和名称+版本,确保其他人可以在问题之后复制问题。

更新

我刚刚看了你的页面。我假设您自己正在使用表格对页面进行编码。

在您创建的示例页面中,您在顶部有一个按钮,按钮的大小和它占用的空间取决于其中的文本、默认边框、填充、应用于它的边距等。所以您可以设置所有这些值在您的 css 中明确显示或使用一般重置css。尽管如此,使用的字体渲染可能会产生非常细微的差异。但是一个简单的规避方法是为元素设置一个明确的高度。

没有单一的解决方案,由您决定。另一种简单的方法是为这个按钮的父级 div 设置一个固定的高度,比如 70px 左右。

简而言之,您必须找出在浏览器中表现不同的元素,并使用显式对其进行处理css

另请注意,渲染引擎也会查看您DTD指定的内容。现在你正在使用过渡DTD

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

您应该将其更改为strictDTD 或使用 HTML 5 样式的 DTD,这将告诉大多数浏览器表现良好。

因此,更改您的 DTD,使用重置 css,然后挑选行为不端的元素来教他们一些礼仪css

于 2014-05-20T23:39:21.033 回答
1

您需要始终重置您的 css 以避免此问题,众所周知,每个浏览器都有自己的边距填充默认值,您必须重置它们并为所有浏览器定义您自己的和相同的默认值,在您的情况下,您至少需要这个:

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}

我通过包含来自http://meyerweb.com的reset.css文件修改了您的示例http://jsfiddle.net/QAc5L/,它在firefoxchrome中完美运行。

于 2014-05-17T16:26:21.540 回答
0

由于每个浏览器都有自己独特的设置,它会影响页面,如填充,边距会影响页面设计,如果你想在每个浏览器上使用相同的因素,你需要在你的页面中覆盖它,这样每个浏览器看起来都一样浏览器。您可以尝试按照 css 覆盖您的浏览器样式。以下 css 也将支持 html5 标签

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}
于 2014-05-21T07:27:35.907 回答