以下のような構造になっています、実際はもう少し複雑になります。子要素の数も不確定。
id=divbox上でクリックしたらid=divboxの左端からの位置を取得したいのですが
子要素上でクリックするとその子要素の左端からの位置になってしまいます
右のほうの白い(=子要素のない)部分だとちゃんと取得できます。
id=divboxの半分の位置でクリックしたとき子要素に影響されずに300前後を取得できるようにするにはどういう風に書けばいいのでしょうか。
<html>
<head>
<title>Test</title>
<style>
#divbox {border:solid 1px blue;width:600px;height:20px;}
#divbox div{display:inline-block;height:100%;}
</style>
</head>
<body>
<div onclick="alert(event.offsetX)" id="divbox">
<div style="width:200px;background-color:orange;">a</div><div style="width:200px;background-color:gray;">b</div>
</div>
</body>
</html>
※webkit系で動けば他はどうでもいいです
No.2ベストアンサー
- 回答日時:
event.offsetX の定義はイベントターゲットのパディング辺からの距離です。
WebKit 系に限定するなら、布置要素のボーダー辺からの距離(感知範囲はボーダーボックス)を返す event.layer(X|Y) があります。ただし、これは NN4 由来で Firefox もサポートしてはいますが、現状で標準化案すらありません。いつ廃止されてもおかしくないことを念頭に置いて下さい。
<div id="DIVBOX"
onclick="alert ([ event.layerX, event.layerY ]); "
style="position: relative">
...
</div>
もし #divbox 内に別の布置要素(例えば絶対配置された要素)がありうるなら No.1 の考え方で良いのですが、若干面倒な問題があります。現行の WebKit 系なら getBoundingClientRect() があるので以下の方が無難と考えます。これは event.client(X|Y) と同じく表示域から、ボーダー辺までの距離を得られます。
<div id="DIVBOX"
onclick="
var b = event.currentTarget.getBoundingClientRect ();
alert ([event.clientX - b.left, event.clientY - b.top ]); ">
...
</div>
---
なお、IE を考慮してスクロール量を得るときは面倒でも document.compatMode で標準・互換モードを確認して下さい。No.1 の方法では、CSS の書き方によっては不具合が生じます。IE を考慮しないなら window.scroll(X|Y) または page(X|Y)Offset で十分です。
関連して、No.0 の HTML の書き方は間違っているので必ずチェックして下さい。そのままでは互換モードになります。
No.1
- 回答日時:
//for Prototype: cumulativeOffset
function cumulativeOffset(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
} while (element);
return { x: valueL, y: valueT };
}
//クライアント領域における要素位置
function clientOffset(element) {
var de = document.documentElement, db = document.body;
var top = de.scrollTop || (db ? db.scrollTop : 0);
var left = de.scrollLeft || (db ? db.scrollLeft : 0);
var obj = cumulativeOffset(element);
return { x: obj.x - left, y: obj.y - top };
}
onclick="
var obj = clientOffset(this);
alert('左端から' + (event.clientX - obj.x) + '上端から' + (event.clientY - obj.y));
"
回答ありがとうございます。
2つ下の質問
『重なった要素上でのイベントで下層要素を特定したい』
http://okwave.jp/qa/q6316242.html
を見たところ
/* p 要素をスルーして背面の要素にマウスイベントを通知する */
p { pointer-events: none }
このようなものがありました!
cssでdivboxの子要素にpointer-events: noneを指定してみたところ
説明どおり子要素をスルーしてdivboxのevent.offsetXが取得できました。
ここを訪れた人の参考になると幸いです。
※pointer-events: none;の対応ブラウザには注意してください
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS (Javascript)印刷するファイルに応じて印刷プレビュー画面で用紙を自動的に切り替えたい!! 2 2022/04/11 12:04
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- HTML・CSS flex の各子要素を横幅 100% にしたい 1 2022/09/22 21:25
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ActiveXobjectが作成できない
-
onchangeイベントを使ってspan...
-
javascript の 命令文の記述で...
-
モーダルダイアログウィンドウ...
-
javascript/他ページ内リンク...
-
javascriptで編集可能不可能の...
-
JavaScriptでオブジェクトを取...
-
javascriptで自動計算フォーム...
-
TABLEタグ内に入った項目の座標...
-
指定要素のクリック位置を取得...
-
Enterで次の入力項目へ進むには?
-
<a>タグのテキストを取得
-
functionから別のfunctionを実...
-
ASP+アクセスでのSQLコメントに...
-
window.openでタイトル名の指定
-
JavaScriptを使って毎日決まっ...
-
同じIDで定義した要素の配列を...
-
idを使わずにonclickで自身の要...
-
HTTPSのとき":"が"%3A"ではなく...
-
C#テキストボックスの文字を配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<a>タグのテキストを取得
-
ActiveXobjectが作成できない
-
onchangeイベントを使ってspan...
-
任意の座標をクリックさせるには
-
JavaScript を使ってpkゲームを...
-
配列の大括弧と丸括弧はどう違う?
-
javascript 特定のタグのidの存...
-
問題はbind の付いたリスナーを...
-
innerHTML実行後のイベント
-
javascriptであるボタンを押す...
-
RadioButtonListの表示制御
-
HTML:Tableタグに対し、JavaScr...
-
画像の一部を表示
-
appendChildがieだとできない??
-
div要素内の全input要素をdisable
-
クッキーを食べさせた会員には...
-
JavaScriptでオブジェクトを取...
-
javascriptでCSVを呼出しvlookup
-
javascriptで自動計算フォーム...
-
画像上のクリックした場所が分...
おすすめ情報