Angular2+、动画和 css 控制侧边栏的变换
Angular2+, animation and css controlling transform of sidebar
我有一个侧边栏,它有一个菜单图标,按下该图标会将侧边栏移出视图,并调整主要内容的宽度。但我也希望它在浏览器 window 宽度低于 500px 时自动移出视图,并在高于 500px 时自动再次跳出,同时仍然保持用户仍然可以打开和关闭的能力侧边栏,我该怎么做?我愿意用 css 类、所有 ts-logic 或两者的组合来完成这一切,我只是不知道怎么做,我的代码是:
<div class="sidenav" [@slideInOut]="menuState">
<span (click)="toggleMenu()" class="ham-menu"><b>☰</b></span>
</div>
<div [@contentMargin]="contentWidth" class="content">
content
</div>
有点造型:
.sidenav {
background-color: #262a35;
color: #dbabab;
width: 200px;
height: 100vh;
font-size: 10px;
padding: 10px;
position: fixed;
z-index: 999;
}
.content {
width: 100vw;
position: fixed;
padding-top: 40px;
}
.ham-menu {
position: fixed;
color: #262a35;
font-size: 14px;
margin-left: 210px;
cursor: pointer;
}
随着 component.ts 动画部分:
animations: [
trigger('slideInOut', [
state('out', style({
transform: 'translate3d(0px, 0, 0)'
})),
state('in', style({
transform: 'translate3d(-200px, 0, 0)'
})),
transition('in => out', animate('400ms ease-in-out')),
transition('out => in', animate('400ms ease-in-out'))
]),
trigger('contentMargin', [
state('full', style({
marginLeft: '210px',
width: 'calc(100% - 210px)'
})),
state('reduced', style({
marginLeft: '10px',
width: 'calc(100% - 10px)'
})),
transition('reduced => full', animate('400ms ease-in-out')),
transition('full => reduced', animate('400ms ease-in-out'))
]),
]
和逻辑:
menuState = 'out';
contentWidth = 'full';
toggleMenu() {
this.menuState = this.menuState === 'out' ? 'in' : 'out';
this.contentWidth = this.contentWidth === 'full' ? 'reduced' : 'full';
}
然后我在下面尝试了基于屏幕宽度的自动调整大小,但是没有用...
@media (max-width: 499.9px) {
.sidenav {
transition: 400ms ease-in-out;
transform: translate3d(-200px, 0, 0);
}
}
@media (min-width: 500px) {
.sidenav {
transition: 400ms ease-in-out;
transform: translate3d(0px, 0, 0);
}
}
一个简单的方法是使用 Angular 的 HostListener 装饰器来检测 window 的宽度变化,然后添加想要的逻辑。
您只需将此添加到您的 component.ts :
@HostListener('window:resize', ['$event'])
onResize(event) {
console.log("Width: " + event.target.innerWidth);
this.windowWidth = event.target.innerWidth;
if(this.windowWidth<500) {
this.menuState = 'in';
} else {
this.menuState = 'out';
}
}
我有一个侧边栏,它有一个菜单图标,按下该图标会将侧边栏移出视图,并调整主要内容的宽度。但我也希望它在浏览器 window 宽度低于 500px 时自动移出视图,并在高于 500px 时自动再次跳出,同时仍然保持用户仍然可以打开和关闭的能力侧边栏,我该怎么做?我愿意用 css 类、所有 ts-logic 或两者的组合来完成这一切,我只是不知道怎么做,我的代码是:
<div class="sidenav" [@slideInOut]="menuState">
<span (click)="toggleMenu()" class="ham-menu"><b>☰</b></span>
</div>
<div [@contentMargin]="contentWidth" class="content">
content
</div>
有点造型:
.sidenav {
background-color: #262a35;
color: #dbabab;
width: 200px;
height: 100vh;
font-size: 10px;
padding: 10px;
position: fixed;
z-index: 999;
}
.content {
width: 100vw;
position: fixed;
padding-top: 40px;
}
.ham-menu {
position: fixed;
color: #262a35;
font-size: 14px;
margin-left: 210px;
cursor: pointer;
}
随着 component.ts 动画部分:
animations: [
trigger('slideInOut', [
state('out', style({
transform: 'translate3d(0px, 0, 0)'
})),
state('in', style({
transform: 'translate3d(-200px, 0, 0)'
})),
transition('in => out', animate('400ms ease-in-out')),
transition('out => in', animate('400ms ease-in-out'))
]),
trigger('contentMargin', [
state('full', style({
marginLeft: '210px',
width: 'calc(100% - 210px)'
})),
state('reduced', style({
marginLeft: '10px',
width: 'calc(100% - 10px)'
})),
transition('reduced => full', animate('400ms ease-in-out')),
transition('full => reduced', animate('400ms ease-in-out'))
]),
]
和逻辑:
menuState = 'out';
contentWidth = 'full';
toggleMenu() {
this.menuState = this.menuState === 'out' ? 'in' : 'out';
this.contentWidth = this.contentWidth === 'full' ? 'reduced' : 'full';
}
然后我在下面尝试了基于屏幕宽度的自动调整大小,但是没有用...
@media (max-width: 499.9px) {
.sidenav {
transition: 400ms ease-in-out;
transform: translate3d(-200px, 0, 0);
}
}
@media (min-width: 500px) {
.sidenav {
transition: 400ms ease-in-out;
transform: translate3d(0px, 0, 0);
}
}
一个简单的方法是使用 Angular 的 HostListener 装饰器来检测 window 的宽度变化,然后添加想要的逻辑。
您只需将此添加到您的 component.ts :
@HostListener('window:resize', ['$event'])
onResize(event) {
console.log("Width: " + event.target.innerWidth);
this.windowWidth = event.target.innerWidth;
if(this.windowWidth<500) {
this.menuState = 'in';
} else {
this.menuState = 'out';
}
}