How to scale SVG path to fit the window size?

前端 未结 2 1074
半阙折子戏
半阙折子戏 2021-01-25 07:25

I am having troubles to scale the SVG to fit the window size.

In this example, I have a wavy path and a text element, what I want to achieve here is to move the text el

相关标签:
2条回答
  • 2021-01-25 08:02

    Here's what you could do: add a media query defining the desired width and then apply the following styles separately for the text and path elements inside the svg element:

    text {
      font-size: 2em;
    }  
    
    path {
      -webkit-transform: scale(.3);
      -ms-transform: scale(.3);
      transform: scale(.3);
    }
    

    See the snippet below:

    document.getElementById("MyPath").setAttribute("d", document.getElementById("Path").getAttribute("d"));
    var tl = new TimelineMax({
      repeat: 0,
      delay: 1
    });
    tl.to("#Text", 3, {
      attr: {
        startOffset: '50%',
        opacity: 1
      }
    });
    
    
    window.addEventListener('scroll', function() {
      tl.to("#Text", 3, {
        attr: {
          startOffset: '100%',
          opacity: 0
        }
      });
    }, true);
    @import url(https://fonts.googleapis.com/css?family=Oswald);
    body {
      background-color: #222;
    }
    
    svg {
      overflow: visible;
      width: 100%;
      height: 100%;
      background-color: #fff;
      left: 0;
      top: 0;
      position: absolute;
    }
    
    @media only screen and (max-width: 500px) {
    
      text {
        font-size: 2em;
      }  
      
      path {
        -webkit-transform: scale(.3);
        -ms-transform: scale(.3);
        transform: scale(.3);
      }
      
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/TextPlugin.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenMax.min.js"></script>
    <svg xml:space="preserve">
    <defs><path id="MyPath"/></defs>
    <path id="Path" fill="none" stroke="#000" stroke-miterlimit="10" d="M0,188.2c186.2,84,261.8,84.9,440,66.4s295.2-130,535.2-129.4c240,0.6,357,144.3,591.1,144.3
    	s450.1-141.2,651.1-141.2c271.7,0,354.2,141.2,612.1,141.2c240,0,423-141.2,669.1-141.2c119.1,0,202.3,33.8,281,68.7"/>
    <text font-size="7em" >
      <textPath id="Text" fill='#88CE02' font-family=Oswald xlink:href="#MyPath" opacity=0 startOffset="0%" letter-spacing="5px">Love the little things.</textPath>
      </text>
    </svg>

    I hope it helps!

    0 讨论(0)
  • 2021-01-25 08:26

    If you want your SVG to scale to fit the screen (or any parent container), it needs to have a viewBox attribute. This attribute tells the browser the dimensions of the SVG content. Without it, the browser has know way of knowing how much it needs to be scaled.

    Your path is about 3780 width, and the bottom of it is at y=144. So a reasonable value of viewBox would be:

    viewBox="0 0 3780 150"
    

    document.getElementById("MyPath").setAttribute("d", document.getElementById("Path").getAttribute("d"));
    var tl = new TimelineMax({
      repeat: 0,
      delay: 1
    });
    tl.to("#Text", 3, {
      attr: {
        startOffset: '50%',
        opacity: 1
      }
    });
    
    
    window.addEventListener('scroll', function() {
      tl.to("#Text", 3, {
        attr: {
          startOffset: '100%',
          opacity: 0
        }
      });
    }, true);
    @import url(https://fonts.googleapis.com/css?family=Oswald);
    body {
      background-color: #222;
    }
    
    svg {
      overflow: visible;
      width: 100%;
      height: 100%;
      background-color: #fff;
      left: 0;
      top: 0;
      position: absolute;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/TextPlugin.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenMax.min.js"></script>
    <svg viewBox="0 0 3780 150" xml:space="preserve">
    <defs><path id="MyPath"/></defs>
    <path id="Path" fill="none" stroke="#000" stroke-miterlimit="10" d="M0,188.2c186.2,84,261.8,84.9,440,66.4s295.2-130,535.2-129.4c240,0.6,357,144.3,591.1,144.3
    	s450.1-141.2,651.1-141.2c271.7,0,354.2,141.2,612.1,141.2c240,0,423-141.2,669.1-141.2c119.1,0,202.3,33.8,281,68.7"/>
    <text font-size="7em" >
      <textPath id="Text" fill='#88CE02' font-family=Oswald xlink:href="#MyPath" opacity=0 startOffset="0%" letter-spacing="5px">Love the little things.</textPath>
      </text>
    </svg>

    0 讨论(0)
提交回复
热议问题