我在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>
问题
现在,如果我想使按钮更小,我必须手动使视口和viewBox的尺寸以相同数量的px减小。
有什么办法能让这种反应更迅速吗?例如,通过使viewBox成为视口的一个百分比?
根据规格,似乎viewBox必须是一个<number>,因此不能是一个百分比。
有什么想法吗?
谢谢。
Note 1
我没有添加任何可访问性或其他功能到按钮。这个问题是关于它的反应。
Note 2
我知道我可以使SVG视图端口占其容器/浏览器视图的百分比。
这并不能解决我的问题,不幸的是,要使这个按钮正常工作,我的视图盒与视口的比率必须保持不变(否则按钮就会失去形状)。
因此,我想让viewBox成为视口的一个百分比。
如果感兴趣,我的解决方案将利用以下优点:
viewBox比视口宽,但高度相同preserveAspectRatio用于水平地对rect的rect维数占viewBox的百分比outline将在转换后修复带有锯齿状线条的火狐问题。
编辑:
为了帮助未来的访问者,可以在这里找到最后一个按钮,包括完全可访问性:https://codepen.io/magnusriga/pen/KrrJKa。
发布于 2018-12-10 03:32:41
向svg添加宽度和高度属性。有宽度设置和高度自动。
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;
}<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>
发布于 2018-12-10 14:45:35
正如我在评论中告诉您的:我将删除svg元素的宽度和高度。然后在CSS中,我会制作SVG的宽度:20%。我把SVG的宽度定为窗口宽度的50%。
为了保持这个比例,我把“汉堡包”放进了<symbol viewBox="0 0 80 80">里。在这种情况下,您不再需要preserveAspectRatio="xMidYMid meet"了。
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;
}<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>
https://stackoverflow.com/questions/53699098
复制相似问题