pan to #start element on load; reduce css classes
This commit is contained in:
parent
d368d81f17
commit
48e813471f
1 changed files with 45 additions and 19 deletions
|
@ -70,6 +70,39 @@ export default defineComponent({
|
||||||
});
|
});
|
||||||
panzoom.value = pz;
|
panzoom.value = pz;
|
||||||
|
|
||||||
|
function panToElement(element: SVGRectElement, smooth: boolean) {
|
||||||
|
const transform = pz.getTransform();
|
||||||
|
const currentRatio = svg.clientWidth * transform.scale / svg.viewBox.baseVal.width;
|
||||||
|
const ratio = svg.clientWidth / svg.viewBox.baseVal.width;
|
||||||
|
const targetScale = window.innerWidth / (element.width.baseVal.value * ratio);
|
||||||
|
|
||||||
|
const svgTargetX = element.x.baseVal.value + element.width.baseVal.value / 2;
|
||||||
|
const svgTargetY = element.y.baseVal.value + element.height.baseVal.value / 2;
|
||||||
|
|
||||||
|
if (smooth) {
|
||||||
|
pz.smoothMoveTo(
|
||||||
|
svgTargetX * currentRatio * -1 + window.innerWidth / 2,
|
||||||
|
svgTargetY * currentRatio * -1 + window.innerHeight / 2,
|
||||||
|
);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
pz.smoothZoomAbs(window.innerWidth / 2, window.innerHeight / 2, targetScale);
|
||||||
|
}, 400 * 2);
|
||||||
|
} else {
|
||||||
|
pz.moveTo(
|
||||||
|
svgTargetX * currentRatio * -1 + window.innerWidth / 2,
|
||||||
|
svgTargetY * currentRatio * -1 + window.innerHeight / 2,
|
||||||
|
);
|
||||||
|
pz.zoomAbs(window.innerWidth / 2, window.innerHeight / 2, targetScale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pan to start element
|
||||||
|
const start = processStart(svg);
|
||||||
|
if (start) {
|
||||||
|
panToElement(start, false);
|
||||||
|
}
|
||||||
|
|
||||||
pz.on("transform", function (_) {
|
pz.on("transform", function (_) {
|
||||||
const transform = pz.getTransform();
|
const transform = pz.getTransform();
|
||||||
const currentRatio = svg.clientWidth * transform.scale / svg.viewBox.baseVal.width;
|
const currentRatio = svg.clientWidth * transform.scale / svg.viewBox.baseVal.width;
|
||||||
|
@ -123,22 +156,7 @@ export default defineComponent({
|
||||||
// Anchors
|
// Anchors
|
||||||
anchors.value = processAnchors(svg);
|
anchors.value = processAnchors(svg);
|
||||||
panToAnchor.value = (anchor: SVGRectElement) => {
|
panToAnchor.value = (anchor: SVGRectElement) => {
|
||||||
const transform = pz.getTransform();
|
panToElement(anchor, true);
|
||||||
const currentRatio = svg.clientWidth * transform.scale / svg.viewBox.baseVal.width;
|
|
||||||
const ratio = svg.clientWidth / svg.viewBox.baseVal.width;
|
|
||||||
const targetScale = window.innerWidth / (anchor.width.baseVal.value * ratio);
|
|
||||||
|
|
||||||
const svgTargetX = anchor.x.baseVal.value + anchor.width.baseVal.value / 2;
|
|
||||||
const svgTargetY = anchor.y.baseVal.value + anchor.height.baseVal.value / 2;
|
|
||||||
|
|
||||||
pz.smoothMoveTo(
|
|
||||||
svgTargetX * currentRatio * -1 + window.innerWidth / 2,
|
|
||||||
svgTargetY * currentRatio * -1 + window.innerHeight / 2,
|
|
||||||
);
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
pz.smoothZoomAbs(window.innerWidth / 2, window.innerHeight / 2, targetScale);
|
|
||||||
}, 400 * 2);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
|
@ -176,7 +194,7 @@ function processAnchors(document: XMLDocument): SVGRectElement[] {
|
||||||
if (anchor === null) {
|
if (anchor === null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
anchor.classList.add("svgcontent_anchor");
|
anchor.classList.add("hidden");
|
||||||
result.push(anchor);
|
result.push(anchor);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -219,7 +237,7 @@ function processAudio(svg: XMLDocument): AudioAreaDef[] {
|
||||||
return Array.from(svg.getElementsByTagName("circle"))
|
return Array.from(svg.getElementsByTagName("circle"))
|
||||||
.filter((el) => Array.from(el.children).some((el) => el.tagName == "desc"))
|
.filter((el) => Array.from(el.children).some((el) => el.tagName == "desc"))
|
||||||
.map((el) => {
|
.map((el) => {
|
||||||
el.classList.add("svgcontent_audio");
|
el.classList.add("hidden");
|
||||||
|
|
||||||
const descNode = el.children[0]; // to fix
|
const descNode = el.children[0]; // to fix
|
||||||
const audioSrc = descNode.textContent!.trim();
|
const audioSrc = descNode.textContent!.trim();
|
||||||
|
@ -233,11 +251,19 @@ function processAudio(svg: XMLDocument): AudioAreaDef[] {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function processStart(svg: XMLDocument): SVGRectElement | null {
|
||||||
|
const start = svg.getElementById("start");
|
||||||
|
if (start){
|
||||||
|
start.classList.add("hidden")
|
||||||
|
}
|
||||||
|
return start as (SVGRectElement | null);
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||||
<style>
|
<style>
|
||||||
.svgcontent_anchor, .svgcontent_audio {
|
.hidden {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue