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

この問題を回避するには、常に 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 に答える
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">

strictこれをDTDに変更するか、HTML 5 スタイルの DTD を使用する必要があります。これにより、ほとんどのブラウザーが適切に動作するようになります。

したがって、DTD を変更し、CSS のリセットを使用してから、不適切な動作をする要素を厳選して、いくつかのマナーを教えてくださいcss

于 2014-05-20T23:39:21.033 に答える
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 に答える