|  | @@ -268,6 +268,18 @@ export const limitSingleSvgPageHeight = () => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const isElementInViewport = (el: any) => {
 | 
	
		
			
				|  |  | +    const rect = el.getBoundingClientRect();
 | 
	
		
			
				|  |  | +    return (
 | 
	
		
			
				|  |  | +        rect.top >= 0 &&
 | 
	
		
			
				|  |  | +        rect.left >= 0 &&
 | 
	
		
			
				|  |  | +        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
 | 
	
		
			
				|  |  | +        rect.right <= (window.innerWidth || document.documentElement.clientWidth)
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const isNumeric = (str: any) => {
 | 
	
		
			
				|  |  | +	return /^\d+$/.test(str);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  // 谱面优化
 | 
	
		
			
				|  |  |  export const resetFormate = () => {
 | 
	
		
			
				|  |  |  	container.value = document.getElementById('scrollContainer')
 | 
	
	
		
			
				|  | @@ -296,14 +308,23 @@ export const resetFormate = () => {
 | 
	
		
			
				|  |  |  		const paths: SVGAElement[] = Array.from(staffline.querySelectorAll(".vf-measure > .vf-stave path"));
 | 
	
		
			
				|  |  |  		const dotModifiers: SVGAElement[] = Array.from(staffline.querySelectorAll(".vf-measure .vf-stopDot"));
 | 
	
		
			
				|  |  |  		const staves: SVGAElement[] = Array.from(staffline.querySelectorAll(".vf-measure > .vf-stave"));
 | 
	
		
			
				|  |  | +		const numberVfTexts = Array.from((container.value as HTMLElement).querySelectorAll(".vf-text > text")); 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// 获取第一个线谱的y轴坐标
 | 
	
		
			
				|  |  |  		const firstLinePathY = paths[0]?.getBBox().y || 0
 | 
	
		
			
				|  |  | +		// D.C循环标记没有显示完全修复
 | 
	
		
			
				|  |  |  		// 反复标记 和 小节碰撞
 | 
	
		
			
				|  |  | -		const repetWord = ["To Coda", "D.S. al Coda", "Coda"];
 | 
	
		
			
				|  |  | +		const repetWord = ["To Coda", "D.S. al Coda", "Coda", "D.C."];
 | 
	
		
			
				|  |  |  		texts
 | 
	
		
			
				|  |  |  			.filter((n) => repetWord.includes(n.textContent || ""))
 | 
	
		
			
				|  |  |  			.forEach((t) => {
 | 
	
		
			
				|  |  | +				// console.log('文本123',t.textContent,'是否在可视区域内',isElementInViewport(t))
 | 
	
		
			
				|  |  | +				// D.C循环标记不在可视区域内,需要修复移动其位置信息
 | 
	
		
			
				|  |  | +				if (t.textContent?.includes('D.C')) {
 | 
	
		
			
				|  |  | +					if (!isElementInViewport(t)) {
 | 
	
		
			
				|  |  | +						t.style.transform = `translateX(-40px)`;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  |  				vfbeams.forEach((curve) => {
 | 
	
		
			
				|  |  |  					const result = collisionDetection(t, curve);
 | 
	
		
			
				|  |  |  					const prePath: SVGAElement = t?.previousSibling as unknown as SVGAElement;
 | 
	
	
		
			
				|  | @@ -430,6 +451,14 @@ export const resetFormate = () => {
 | 
	
		
			
				|  |  |  				label.textContent = labelText.replace('#','♯')
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  | +		// numberVfTexts.forEach((label: any) => {
 | 
	
		
			
				|  |  | +		// 	const labelText = label.textContent as string
 | 
	
		
			
				|  |  | +		// 	if (isNumeric(labelText)) {
 | 
	
		
			
				|  |  | +		// 		const _y = Number(label.getAttribute("y"))
 | 
	
		
			
				|  |  | +		// 		const endY = firstLinePathY ? firstLinePathY - musicalDistance : _y
 | 
	
		
			
				|  |  | +		// 		label.setAttribute("y", endY)
 | 
	
		
			
				|  |  | +		// 	}
 | 
	
		
			
				|  |  | +		// })
 | 
	
		
			
				|  |  |  		dotModifiers.forEach((group: any) => {
 | 
	
		
			
				|  |  |  			if (state.musicRenderType === 'fixedTone') {
 | 
	
		
			
				|  |  |  				group.setAttribute('transform', 'translate(3,-12)')
 |