我在SVG中制作了一个“汉堡按钮”,如下所示 .
body {
margin: 0;
text-align: center;
}
svg#ham-btn {
margin: 2rem;
border: 1px solid black;
fill: #383838;
}
<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>
Question
现在,如果我想让按钮变小,我必须手动使视口的尺寸和 viewBox
减小相同的px量 .
有没有办法让它更具响应性?例如,通过使 viewBox
成为视口的百分比?
According to the spec,似乎 viewBox
必须是 <number>
,因此不能是一个百分比 .
有什么想法吗?
谢谢 .
Note 1
我没有在按钮上添加任何辅助功能或其他功能 . 这个问题是关于它的响应性 .
Note 2
我知道我可以使SVG视口占其容器/浏览器视口的百分比 .
遗憾的是,这并没有解决我的问题,因为要使这个按钮工作,我的viewBox到视口比率必须保持固定(否则按钮会失去其形状) .
因此,我想让 viewBox
成为视口的百分比 .
如果感兴趣,我的解决方案利用以下优势:
-
viewBox
比视口宽,但具有相同的高度 -
因此,
preserveAspectRatio
用于水平居中rect
-
rect
尺寸以viewBox
的百分比表示
outline
是在变换后用锯齿线修复Firefox问题 .
Edit:
如果对未来访问者有帮助,可以在此处找到最终按钮,包括完全可访问性:https://codepen.io/magnusriga/pen/KrrJKa
2 回答
正如我在评论中告诉你的那样:我会删除svg元素的宽度和高度 . 然后在CSS中我会使SVG的宽度:20% . 我将SVG的宽度设置为窗口宽度的50% .
为了保持比例,我把"hamburger"放在
<symbol viewBox="0 0 80 80">
里面 . 在这种情况下粗略的你不再需要preserveAspectRatio="xMidYMid meet"
.为svg css添加宽度和高度属性 . 宽度设置和高度自动 .