SVG oval path scaling proportionally with window a

2019-08-03 02:49发布

I'm trying to create an oval SVG path that I want to use as an animated text path similar to https://stackoverflow.com/a/48354097/10727821 in order to create a sort of circular "marquee" that always takes full width and height of the browser window, ignoring the aspect ratio.

I guess the issue is that my <ellipse> is describing a perfect circle, whereas I'd want it to be more flexible than that – but I don't really know how I'd do that…

.ellipse {
  display: inline-block;
  position: relative;
  width: 100%;
  height: 100%;
  vertical-align: middle;
  svg {
    display: inline-block;
    position: absolute;
    top: 0;
    left: 0;
  }
  ellipse {
    fill: #333;
  }
}
<div class="ellipse">
<svg version="1.1" viewBox="0 0 1000 1000" preserveAspectRatio="none">
<ellipse cx="500" cy="500" rx="500" ry="500"/>
</svg>
</div>

expected output would be something like this: sketch of responsive ellipse text

标签: css svg
1条回答
兄弟一词,经得起流年.
2楼-- · 2019-08-03 03:43

I hope this is what you need. I'm recalculating the viewBox of the svg element and the d path proportional to the wrap.clientWidth and the wrap.clientHeight where wrap is the wrapping div <div id="wrap">.

function Init(){
  let w = wrap.clientWidth;
  let h = wrap.clientHeight;
  ellipse.setAttributeNS(null,"viewBox",`0 0 ${w}  ${h}`);
  let d = `M${w/10},${h/2}A${4*w/10},${4*h/10} 0 0 0 ${9*w/10} ${5*h/10} A${4*w/10},${4*h/10} 0 0 0 ${w/10} ${5*h/10}`

thePath.setAttributeNS(null,"d", d)
}


window.setTimeout(function() {
  Init();
  window.addEventListener('resize', Init, false);
}, 15);
#wrap{width:100vw; height:100vh}
  svg {
    background:#eee;
  }
<div id="wrap">
<svg id="ellipse" version="1.1" viewBox="0 0 1000 1000" preserveAspectRatio="none">  
<path id="thePath" fill="gold" d="M100,500A400,400 0 0 0 900 500 A400,400 0 0 0 100 500"  />
  
  
   <text stroke="#000000" font-size="20">
      <textPath xlink:href="#thePath" dy="5">
            svg oval path scaling proportionally with window along both axes for circular svg oval path scaling proportionally with window along both axes for circular svg oval path scaling proportionally with window along both axes for circular
      </textPath>
    </text>
</svg>
</div>

查看更多
登录 后发表回答