我在汉堡菜单下使用SVG,点击菜单后SVG会扩展并填满整个屏幕。我使用scale()实现此功能,因此基本上发生的情况是SVG具有1的比例,当用户单击菜单时,SVG将获得scale(35)的比例。
现在问题来了。该比例(scale(35))在更大的分辨率甚至一些具有更大高度的移动分辨率上都不能填满整个屏幕。如果我设置比例为scale(70),以确保覆盖大多数屏幕,这将使关闭动画变得非常混乱,因为SVG需要从如此大的比例缩小到1。如何扩展此SVG并使其平稳地填充各种屏幕?
以下是一些解释发生情况的图片:
关闭菜单/SVG比例为1
打开菜单/SVG比例为70
菜单关闭/SVG从70的比例缩小到1,并且看起来很凌乱
现在问题来了。该比例(scale(35))在更大的分辨率甚至一些具有更大高度的移动分辨率上都不能填满整个屏幕。如果我设置比例为scale(70),以确保覆盖大多数屏幕,这将使关闭动画变得非常混乱,因为SVG需要从如此大的比例缩小到1。如何扩展此SVG并使其平稳地填充各种屏幕?
以下是一些解释发生情况的图片:
关闭菜单/SVG比例为1
![关闭菜单/SVG比例为1](https://istack.dev59.com/FGvif.webp)
![打开菜单/SVG比例为70](https://istack.dev59.com/uD3O0.webp)
![菜单关闭/SVG从70的比例缩小到1,并且看起来很凌乱](https://istack.dev59.com/gZjzE.webp)
function menuOnClick() {
document.getElementById("menu-bar").classList.toggle("change");
document.getElementById("nav").classList.toggle("change");
document.getElementById('blob').classList.toggle("change-bg");
}
#menu {
z-index: 2;
}
#menu-bar {
width: 45px;
height: 40px;
margin: 30px 0 20px 20px;
cursor: pointer;
float: right;
}
.bar {
height: 5px;
width: 100%;
background-color: #00d1a9;;
display: block;
border-radius: 5px;
transition: 0.3s ease;
}
#bar1 {
transform: translateY(-4px);
}
#bar3 {
transform: translateY(4px);
}
.nav {
transition: 0.3s ease;
display: none;
}
.nav ul {
padding: 0 22px;
}
.nav li {
list-style: none;
padding: 12px 0;
}
.nav li a {
color: white;
font-size: 20px;
text-decoration: none;
}
.nav li a:hover {
font-weight: bold;
}
.menu-bg, #menu {
top: 0;
left: 0;
position: absolute;
}
.change {
display: block;
}
.change .bar {
background-color: white;
}
.change #bar1 {
transform: translateY(4px) rotateZ(-45deg);
}
.change #bar2 {
opacity: 0;
}
.change #bar3 {
transform: translateY(-6px) rotateZ(45deg);
}
.change-bg {
transform: scale(70);
}
.blob {
margin-top:-32px;
top: 0;
z-index: 1;
pointer-events: none;
-webkit-transition: all 0.75s linear;
transition: all 0.75s linear;
display: block;
will-change: auto;
filter: none;
-webkit-filter: blur(0);
-moz-filter: blur(0);
-ms-filter: blur(0);
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='0');
}
<div id="menu">
<div id="menu-bar" onclick="menuOnClick()">
<div id="bar1" class="bar"></div>
<div id="bar2" class="bar"></div>
<div id="bar3" class="bar"></div>
</div>
<nav class="nav" id="nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">Blog</a></li>
</ul>
</nav>
</div>
<svg class="blob" id="blob" xmlns="http://www.w3.org/2000/svg" width="265.42" height="151.973" viewBox="0 0 265.42 151.973">
<title>Menu Blob</title>
<desc>The blob that grows to be the menu background</desc>
<path class="blobPath" id="blobPath" shape-rendering="auto" d="M-1377.154,10877.442c-10.882-7.812-24.262-11.1-36.627-16.251s-24.764-13.355-28.853-26.112c-.135.766,251.322-30.752,251.3-30.855s-9.766,33.5-15.478,42.831c-9.83,16.055-20.015,32.053-32.926,45.756a125.25,125.25,0,0,1-18.85,16.492,89.6,89.6,0,0,1-28.133,13.538,70.507,70.507,0,0,1-29.47,1.6,56.7,56.7,0,0,1-24.487-10C-1354.7,10904.193-1363.044,10887.567-1377.154,10877.442Z" transform="translate(2763.902 -10547.315) rotate(7)" />
</svg>
<div class="menu-bg" id="menu-bg"></div>