Skip to content

Commit 4726794

Browse files
Correctly position focus box for charts with an offset parent (#61)
* ts tidying * Add examples using relatively positioned containers * Account for non-body offset parents in position calc --------- Co-authored-by: Julianna Langston <[email protected]>
1 parent f039b65 commit 4726794

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

index.html

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
#app > div:has(canvas) {
1616
max-width: var(--tile-size);
1717
}
18+
#position > div:has(canvas) {
19+
position: relative;
20+
margin: auto;
21+
height: 80vh;
22+
width: 80vw;
23+
}
1824
</style>
1925
</head>
2026
<body>
@@ -25,6 +31,9 @@ <h2>Vanilla chart.js</h2>
2531

2632
<h2>react-chartjs-2</h2>
2733
<div id="react-root"></div>
34+
35+
<h2>Positioning</h2>
36+
<div id="position"></div>
2837
<script type="module" src="/samples/main.tsx"></script>
2938
</body>
3039
</html>

samples/main.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import ReactDOM from "react-dom/client";
33
import Charts from "./react/index";
44
import {generateCharts} from "./makeChart";
55

6-
generateCharts(document.querySelector<HTMLDivElement>('#app')!);
6+
generateCharts(document.querySelector('#app') as HTMLDivElement);
7+
generateCharts(document.querySelector('#position') as HTMLDivElement);
78

8-
const root = ReactDOM.createRoot(document.getElementById("react-root"));
9+
const root = ReactDOM.createRoot(document.getElementById("react-root") as HTMLDivElement);
910
root.render(
1011
<Charts />
1112
);

src/plugin.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,15 @@ class ChartLegendManager {
105105
return;
106106
}
107107

108+
const useOffset = this.canvas.offsetParent !== null && !["BODY", "HTML"].includes(this.canvas.offsetParent.nodeName);
109+
108110
const bbox = this.canvas.getBoundingClientRect();
111+
const adjustment = useOffset ? (this.canvas.offsetParent as HTMLElement).getBoundingClientRect() : {x: 0 - window.scrollX, y: 0 - window.scrollY};
112+
109113
const {left, top, width, height, text} = this.hitBoxes[index];
110114

111-
focusBox.style.left = `${bbox.x + left - this.focusBoxMargin - window.pageXOffset}px`;
112-
focusBox.style.top = `${bbox.y + top - this.focusBoxMargin + window.pageYOffset}px`;
115+
focusBox.style.left = `${bbox.x - adjustment.x + left - this.focusBoxMargin}px`;
116+
focusBox.style.top = `${bbox.y - adjustment.y + top - this.focusBoxMargin}px`;
113117
focusBox.style.width = `${width + (2*this.focusBoxMargin)}px`;
114118
focusBox.style.height = `${height + (2*this.focusBoxMargin)}px`;
115119
focusBox.setAttribute("aria-label", `${text}, ${index+1} of ${this.hitBoxes.length}`);

0 commit comments

Comments
 (0)