首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应型SVG viewBox

响应型SVG viewBox
EN

Stack Overflow用户
提问于 2018-12-10 03:26:30
回答 2查看 12.1K关注 0票数 3

我在SVG中做了一个“汉堡包按钮”,如下所示。

代码语言:javascript
复制
body {
  margin: 0;
  text-align: center;
}

svg#ham-btn {
  margin: 2rem;
  border: 1px solid black;
  fill: #383838;
}
代码语言:javascript
复制
<svg id="ham-btn" width="107.5px" height="80px" viewBox="0 0 80 80" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg">
  <style>
    #ham-btn {
      cursor: pointer;
    }
    #ham-btn:hover #r1 {
      outline: 1px solid transparent;
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(37deg) translate(0%, 28.75%) scaleX(1.1);
    }
    #ham-btn:hover #r2 {
      transition: transform 0.2s;
      transform: translate(120%, 0);
    }
    #ham-btn:hover #r3 {
      outline: 1px solid transparent;
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(-37deg) translate(0%, -28.75%) scaleX(1.1);
    }
    
  </style>
  <rect id="r3" x="0" y="71.25%" width="100%" height="15%" rx="5%" />
  <rect id="r2" x="0" y="42.5%" width="100%" height="15%" rx="5%"/>
  <rect id="r1" x="0" y="13.75%" width="100%" height="15%" rx="5%" />
</svg>

问题

现在,如果我想使按钮更小,我必须手动使视口和viewBox的尺寸以相同数量的px减小。

有什么办法能让这种反应更迅速吗?例如,通过使viewBox成为视口的一个百分比?

根据规格,似乎viewBox必须是一个<number>,因此不能是一个百分比。

有什么想法吗?

谢谢。

Note 1

我没有添加任何可访问性或其他功能到按钮。这个问题是关于它的反应。

Note 2

我知道我可以使SVG视图端口占其容器/浏览器视图的百分比。

这并不能解决我的问题,不幸的是,要使这个按钮正常工作,我的视图盒与视口的比率必须保持不变(否则按钮就会失去形状)。

因此,我想让viewBox成为视口的一个百分比。

如果感兴趣,我的解决方案将利用以下优点:

  • viewBox比视口宽,但高度相同
  • 因此,preserveAspectRatio用于水平地对rect
  • rect维数占viewBox的百分比

outline将在转换后修复带有锯齿状线条的火狐问题。

编辑:

为了帮助未来的访问者,可以在这里找到最后一个按钮,包括完全可访问性:https://codepen.io/magnusriga/pen/KrrJKa

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-10 03:32:41

向svg添加宽度和高度属性。有宽度设置和高度自动。

代码语言:javascript
复制
body {
  margin: 0;
  text-align: center;
}

svg#ham-btn {
  margin: 2rem;
  border: 1px solid black;
  fill: #383838;
  /* percentage of viewport - height will autocalculate */
  width: 7vw;
  height: auto;
}
代码语言:javascript
复制
<svg id="ham-btn" width="107.5px" height="80px" viewBox="0 0 80 80" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg">
  <style>
    #ham-btn {
      cursor: pointer;
    }
    #ham-btn:hover #r1 {
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(37deg) translate(0%, 28.75%) scaleX(1.1);
    }
    #ham-btn:hover #r2 {
      transition: x 0.2s;
      x: 120%;
    }
    #ham-btn:hover #r3 {
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(-37deg) translate(0%, -28.75%) scaleX(1.1);
    }
    
  </style>
  <rect id="r3" x="0" y="71.25%" width="100%" height="15%" rx="5%" />
  <rect id="r2" x="0" y="42.5%" width="100%" height="15%" rx="5%"/>
  <rect id="r1" x="0" y="13.75%" width="100%" height="15%" rx="5%" />
</svg>

票数 3
EN

Stack Overflow用户

发布于 2018-12-10 14:45:35

正如我在评论中告诉您的:我将删除svg元素的宽度和高度。然后在CSS中,我会制作SVG的宽度:20%。我把SVG的宽度定为窗口宽度的50%。

为了保持这个比例,我把“汉堡包”放进了<symbol viewBox="0 0 80 80">里。在这种情况下,您不再需要preserveAspectRatio="xMidYMid meet"了。

代码语言:javascript
复制
body {
  margin: 0;
  text-align: center;
}

svg#ham-btn {
  width: 20%;
  margin:auto;
  top:0;bottom:0;left:0;right:0;
  border: 1px solid black;
  fill: #383838;
  position:absolute; 
}
代码语言:javascript
复制
<svg id="ham-btn" viewBox="0 0 107.5 80" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg">
  <style>
    #ham-btn {
      cursor: pointer;
    }
    #ham-btn:hover #r1 {
      outline: 1px solid transparent;
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(37deg) translate(0%, 28.75%) scaleX(1.1);
    }
    #ham-btn:hover #r2 {
      transition: transform 0.2s;
      transform: translate(120%, 0);
    }
    #ham-btn:hover #r3 {
      outline: 1px solid transparent;
      transition: transform 0.2s;
      transform-origin: 50% 50%;
      transform: rotate(-37deg) translate(0%, -28.75%) scaleX(1.1);
    }
    
  </style>
  <symbol id="s" viewBox="0 0 80 80"> 
  <rect id="r3" x="0" y="71.25%" width="100%" height="15%" rx="5%" />
  <rect id="r2" x="0" y="42.5%" width="100%" height="15%" rx="5%"/>
  <rect id="r1" x="0" y="13.75%" width="100%" height="15%" rx="5%" />
  </symbol>  
  
  <use xlink:href="#s"  width="80" x="13.75"/>
</svg>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53699098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档