質問編集履歴

4

コード3追加

2025/05/16 09:55

投稿

kasuta
kasuta

スコア1

test CHANGED
File without changes
test CHANGED
@@ -118,3 +118,19 @@
118
118
  ```
119
119
  とすることでshowPopover()でも任意に指定したボタンの傍に表示させることができるようになりました。
120
120
 
121
+ ### 得られた回答を参考に実現できたコード 3
122
+ [5/16 18:55 追記]
123
+ showPopoverの引数で指定できる!!!
124
+
125
+ ```javascript
126
+ document.querySelector("#btnFail").addEventListener("click", async (ev) => {
127
+
128
+ const btn = ev.currentTarget;
129
+ btn.innerText = "処理中";
130
+
131
+ const result = await new Promise((r) => setTimeout(r, 1000, (Math.random() < 0.5)));
132
+ const pop = document.querySelector(result ? "#pop1" : "#pop2");
133
+ pop.showPopover({ source: btn });
134
+ });
135
+ ```
136
+

3

実現できたコード2を追記

2025/05/16 09:28

投稿

kasuta
kasuta

スコア1

test CHANGED
File without changes
test CHANGED
@@ -84,5 +84,37 @@
84
84
  btn.removeAttribute("popovertarget");
85
85
  });
86
86
  ```
87
+ ### 得られた回答を参考に実現できたコード 2
88
+ [5/16 18:20 追記]
89
+ HTMLとCSSでの関連は、styleに`position-anchor`と`position-name`の値が一致する組み合わせをつければ良さそうなので、HTMLで書くと以下のように。
87
90
 
91
+ ```html
92
+ <div id="pop1"
93
+ style="position-anchor: --testAnchor; margin:0; inset:0; position-area:top; background-color: green; color: white;"
94
+ popover>
95
+ <div>合格</div>
96
+ </div>
97
+ <button id="btnFail" style="anchor-name:--testAnchor; margin:100px;">
98
+ <span>2</span>
99
+ </button>
100
+ ```
88
101
 
102
+ これをjavascriptで実現すると
103
+
104
+ ```javascript
105
+ document.querySelector("#btnFail").addEventListener("click", async (ev) => {
106
+
107
+ const btn = ev.currentTarget;
108
+ btn.innerText = "処理中";
109
+
110
+ const result = await new Promise((r) => setTimeout(r, 1000, (Math.random() < 0.5)));
111
+ const pop = document.querySelector(result ? "#pop1" : "#pop2");
112
+
113
+ const anchorName = "--testAnchor" + Date.now().toString();
114
+ btn.style.anchorName = anchorName;
115
+ pop.style.positionAnchor = anchorName;
116
+ pop.showPopover();
117
+ });
118
+ ```
119
+ とすることでshowPopover()でも任意に指定したボタンの傍に表示させることができるようになりました。
120
+

2

実現できたコードを追記

2025/05/16 08:55

投稿

kasuta
kasuta

スコア1

test CHANGED
File without changes
test CHANGED
@@ -56,3 +56,33 @@
56
56
  edge 136
57
57
  (firefoxではまったく位置が合わない、safariでは試せていないが、今回の質問ではchromium系のみでよい)
58
58
 
59
+
60
+ ### 得られた回答を参考に実現できたコード
61
+ [5/16 17:53 追記]
62
+ クリックされた(スクリプト処理後の)時点での対象の`popovertarget`属性で判定されるようなので、非同期のawaitしてしまうと成功しませんでしたが、属性を書き換えてからclick()を呼び出すことで遅延させることができました。
63
+
64
+ ```html
65
+ document.querySelector("#btnFail").addEventListener("click", async (ev) => {
66
+
67
+ const btn = ev.currentTarget;
68
+
69
+ if (btn.hasAttribute("popovertarget")) {
70
+ return;
71
+ }
72
+
73
+ btn.innerText = "処理中";
74
+ const result = await new Promise((r) => setTimeout(r, 1000, (Math.random() < 0.5)));
75
+ btn.innerText = result ? "合格" : "不合格";
76
+ if (result) {
77
+ btn.setAttribute("popovertarget", "pop1");
78
+ }
79
+ else {
80
+ btn.setAttribute("popovertarget", "pop2");
81
+ }
82
+
83
+ btn.click();
84
+ btn.removeAttribute("popovertarget");
85
+ });
86
+ ```
87
+
88
+

1

実現したいことの理由を追記。codeブロックの言語指定を大文字"HTML"から小文字"html"に。微妙なtypo修正

2025/05/16 08:34

投稿

kasuta
kasuta

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,9 @@
1
1
  ### 実現したいこと
2
2
  HTMLのbuttonをクリックしたときに、そのbuttonの傍にpopover属性を指定した要素を表示させたい。
3
3
  表示/非表示はjavascriptで制御する。
4
+
5
+ [5/16 17:33 追記]
6
+ javascriptで制御したい理由は、buttonをクリックされたら実行されるjavascriptの処理結果に応じてpopoverを表示するかしないかを変えたい、あるいは表示内容を変更したいからです。
4
7
 
5
8
  ### 発生している問題・分からないこと
6
9
  Javascriptを使用せずに自動的に表示させる場合には、buttonの傍に表示されます。
@@ -13,7 +16,7 @@
13
16
 
14
17
  ### 該当のソースコード
15
18
 
16
- ```HTML
19
+ ```html
17
20
  <div style="position: relative;">
18
21
 
19
22
  <div id="pop1" style="margin:0; inset:0; position-area:top;" popover >
@@ -24,7 +27,7 @@
24
27
  <span>意図した通りの要素の上になる</span>
25
28
  </button>
26
29
 
27
- <button id="btnFail" tyle="margin:100px;">
30
+ <button id="btnFail" style="margin:100px;">
28
31
  <span>画面下になってしまう</span>
29
32
  </button>
30
33