gsap实现左侧弹出式多级菜单栏效果代码
代码语言:html
所属分类:菜单导航
代码描述:gsap实现左侧弹出式多级菜单栏效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<style>
@import url('https://unpkg.com/normalize.css') layer(normalize);
@layer normalize, base, demo, tree, layout, transitions, mobile, scroller-mask, debug;
@layer {
[data-show="true"] .safety-triangle {
opacity: 1;
}
[data-triangle="false"] .safety-triangle {
pointer-events: none;
background: repeating-linear-gradient(45deg, #0000 0 4px, var(--tree-focus-color) 4px 5px);
opacity: 0.5;
}
[data-show="false"] .safety-triangle {
opacity: 0;
}
}
@layer scroller-mask {
@supports(animation-timeline: scroll()) {
sidebar-tree .tree-group-container + .tree-group-container {
--size: 4;
-webkit-mask-image: linear-gradient(#fff, #0000),
linear-gradient(#fff 0 100%), linear-gradient(#0000, #fff);
mask-image: linear-gradient(#fff, #0000),
linear-gradient(#fff 0 100%), linear-gradient(#0000, #fff);
-webkit-mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-composite: xor;
mask-composite: exclude;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
animation-timeline: scroll(self);
animation-range: 0 calc(var(--size) * 1ch),
calc(100% - (var(--size) * 1ch)) 100%;
-webkit-mask-position: 0 0, 0 0, 0 100%;
mask-position: 0 0, 0 0, 0 100%;
-webkit-mask-size: 100% 0, 100% 100%, 100% calc(var(--size) * 1ch);
mask-size: 100% 0, 100% 100%, 100% calc(var(--size) * 1ch);
-webkit-animation-name: size-up, size-down;
animation-name: size-up, size-down;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
}
@-webkit-keyframes size-up {
to {
-webkit-mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
}
}
@keyframes size-up {
to {
-webkit-mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
mask-size: 100% calc(var(--size) * 1ch), 100% 100%,
100% calc(var(--size) * 1ch);
}
}
@-webkit-keyframes size-down {
to {
-webkit-mask-size: 100% calc(var(--size) * 1ch), 100% 100%, 100% 0;
mask-size: 100% calc(var(--size) * 1ch), 100% 100%, 100% 0;
}
}
@keyframes size-down {
to {
-webkit-mask-size: 100% calc(var(--size) * 1ch), 100% 100%, 100% 0;
mask-size: 100% calc(var(--size) * 1ch), 100% 100%, 100% 0;
}
}
}
@layer mobile {
.mobile-items {
align-items: center;
display: none;
}
.menu-button {
width: 40px;
aspect-ratio: 1;
background: #0000;
border: 0;
display: grid;
place-items: center;
padding: 0;
position: relative;
border-radius: 6px;
cursor: pointer;
&:is(:hover, :focus-visible)::after {
opacity: 1;
}
&::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
opacity: 0;
background: light-dark(hsl(0 0% 30% / 0.1), hsl(0 0% 90% / .15));
}
}
aside footer .user {
display: none;
}
aside header .button-link {
display: none;
position: absolute;
top: 0;
left: 0;
color: canvasText;
svg {
translate: -2px 0;
}
}
.closer {
width: 40px;
aspect-ratio: 1;
position: absolute;
z-index: 2;
top: 0;
right: 0;
background: #0000;
border: 0;
cursor: pointer;
display: grid;
display: none;
place-items: center;
padding: 0;
border-radius: 6px;
&:is(:hover, :focus-visible)::after {
opacity: 1;
}
&::after {
content: '';
position: absolute;
inset: 6px;
border-radius: inherit;
opacity: 0;
background: light-dark(hsl(0 0% 30% / 0.1), hsl(0 0% 90% / .15));
}
svg {
rotate: 45deg;
width: 22px;
border-radius: 6px;
background: #0000;
}
}
@media(max-width: 768px) {
aside footer .user {
display: flex;
}
aside header .button-link,
.closer {
display: grid;
}
aside footer {
padding: .5rem;
}
aside header {
padding: .5rem;
padding-top: 44px;
}
sidebar-tree [role="treeitem"] {
padding-right: .5rem;
}
kbd {
display: none;
}
header .user,
.user-slash {
display: none;
}
.toggle {
display: none;
}
.mobile-items {
display: flex;
}
aside {
position: fixed;
background: light-dark(#fff, #000);
translate: -100% 0;
height: 100vh;
top: 0;
border-radius: 0;
display: none;
transition-property: display, overlay, translate;
transition-duration: var(--speed);
transition-timing-function: var(--timing);
transition-behavior: allow-discrete;
&::after {
inset: -2px;
}
&::before,
&::after {
opacity: 1;
filter: blur(0);
border-radius: 0;
border-top: 0;
border-bottom: 0;
}
&:popover-open {
display: grid;
translate: 0 0;
}
&::-webkit-backdrop {
background: light-dark(hsl(0 0% 0% / 0.6), hsl(0 0% 10% / 0.8));
opacity: 0;
transition-behavior: allow-discrete;
-webkit-transition-property: display, overlay, opacity;
transition-property: display, overlay, opacity;
transition-timing-function: var(--timing);
transition-duration: var(--speed);
}
&::backdrop {
background: light-dark(hsl(0 0% 0% / 0.6), hsl(0 0% 10% / 0.8));
opacity: 0;
transition-behavior: allow-discrete;
transition-property: display, overlay, opacity;
transition-timing-function: var(--timing);
transition-duration: var(--speed);
}
&:popover-open::-webkit-backdrop {
opacity: 1;
}
&:popover-open::backdrop {
opacity: 1;
}
}
@starting-style {
aside:popover-open {
translate: -100% 0;
}
aside:popover-open::-webkit-backdrop {
opacity: 0;
}
aside:popover-open::backdrop {
opacity: 0;
}
}
}
}
@layer transitions {
/* layout transitions */
.layout {
.........完整代码请登录后点击上方下载按钮下载查看
















网友评论0