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;
 | 
			
		||||
 | 
			
		||||
      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 (_) {
 | 
			
		||||
        const transform = pz.getTransform();
 | 
			
		||||
        const currentRatio = svg.clientWidth * transform.scale / svg.viewBox.baseVal.width;
 | 
			
		||||
| 
						 | 
				
			
			@ -123,22 +156,7 @@ export default defineComponent({
 | 
			
		|||
      // Anchors
 | 
			
		||||
      anchors.value = processAnchors(svg);
 | 
			
		||||
      panToAnchor.value = (anchor: SVGRectElement) => {
 | 
			
		||||
        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 / (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);
 | 
			
		||||
        panToElement(anchor, true);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      // DEBUG
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +194,7 @@ function processAnchors(document: XMLDocument): SVGRectElement[] {
 | 
			
		|||
    if (anchor === null) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    anchor.classList.add("svgcontent_anchor");
 | 
			
		||||
    anchor.classList.add("hidden");
 | 
			
		||||
    result.push(anchor);
 | 
			
		||||
    i++;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +237,7 @@ function processAudio(svg: XMLDocument): AudioAreaDef[] {
 | 
			
		|||
  return Array.from(svg.getElementsByTagName("circle"))
 | 
			
		||||
      .filter((el) => Array.from(el.children).some((el) => el.tagName == "desc"))
 | 
			
		||||
      .map((el) => {
 | 
			
		||||
        el.classList.add("svgcontent_audio");
 | 
			
		||||
        el.classList.add("hidden");
 | 
			
		||||
 | 
			
		||||
        const descNode = el.children[0]; // to fix
 | 
			
		||||
        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>
 | 
			
		||||
 | 
			
		||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
 | 
			
		||||
<style>
 | 
			
		||||
.svgcontent_anchor, .svgcontent_audio {
 | 
			
		||||
.hidden {
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue