admin管理员组文章数量:1395451
I am displaying a sidebar which is open by default using the following:
<div class="content" :class="{'sidebar-close': !sidebarOpened}">
Though, I want to have the opposite behaviour on mobile. Just not sure how to do this using Vue/Typescript.
<template>
<div id="app">
<div v-if="getroute == false">
<navbar />
</div>
<div class="content" :class="{'sidebar-close': !sidebarOpened}">
<div class="main-container">
<app-main />
</div>
<div class="menus" @click="toogleSidebar">
</div>
<div v-if="getroute">
<div class="vsidebar">
<sidebar />
</div>
</div>
<div v-else>
<div class="sidebar">
<sidebar />
</div>
</div>
</div>
<div v-if="getroute == false">
<Footer/>
</div>
<script lang="ts">
import { Component, Vue, Provide } from 'vue-property-decorator'
import { AppMain, Navbar, Sidebar, Footer} from './ponents'
import { Getter, Action } from 'vuex-class';
import { IViewState } from '@/store/view';
@Component({
name: 'Layout',
ponents: {
AppMain,
Navbar,
Sidebar,
Footer,
}
})
export default class extends Vue {
private isActive: Boolean = false
@Getter('viewStore/sidebarOpened') private sidebarOpened!: IViewState;
@Action('viewStore/toogleSidebar') private toogleSidebar!: () => void;
@Action('viewStore/setProductArticles') private setProductArticles!: () => void;
@Action('viewStore/setProducts') private setProducts!: () => void;
mounted() {
}
}
</script>
I am displaying a sidebar which is open by default using the following:
<div class="content" :class="{'sidebar-close': !sidebarOpened}">
Though, I want to have the opposite behaviour on mobile. Just not sure how to do this using Vue/Typescript.
<template>
<div id="app">
<div v-if="getroute == false">
<navbar />
</div>
<div class="content" :class="{'sidebar-close': !sidebarOpened}">
<div class="main-container">
<app-main />
</div>
<div class="menus" @click="toogleSidebar">
</div>
<div v-if="getroute">
<div class="vsidebar">
<sidebar />
</div>
</div>
<div v-else>
<div class="sidebar">
<sidebar />
</div>
</div>
</div>
<div v-if="getroute == false">
<Footer/>
</div>
<script lang="ts">
import { Component, Vue, Provide } from 'vue-property-decorator'
import { AppMain, Navbar, Sidebar, Footer} from './ponents'
import { Getter, Action } from 'vuex-class';
import { IViewState } from '@/store/view';
@Component({
name: 'Layout',
ponents: {
AppMain,
Navbar,
Sidebar,
Footer,
}
})
export default class extends Vue {
private isActive: Boolean = false
@Getter('viewStore/sidebarOpened') private sidebarOpened!: IViewState;
@Action('viewStore/toogleSidebar') private toogleSidebar!: () => void;
@Action('viewStore/setProductArticles') private setProductArticles!: () => void;
@Action('viewStore/setProducts') private setProducts!: () => void;
mounted() {
}
}
</script>
Share
Improve this question
asked Aug 4, 2020 at 3:42
interactivejaminteractivejam
671 silver badge4 bronze badges
2 Answers
Reset to default 6You can listen on window resize
event then use matchMedia to pute the class.
<div :class='[sideBarClass]'>Sidebar</div>
...
mounted() {
this.handleResize()
window.addEventListener('resize', this.handleResize)
},
destroyed() {
window.removeEventListener('resize', this.handleResize)
},
methods: {
handleResize() {
this.sideBarClass = window.matchMedia('(max-width: 600px)').matches
? 'mobile-sidebar' : 'desktop-sidebar'
}
}
...
Example
You need to detect screen size and mix that with your nav toggle button.
The variable that controls if the nav is visible should then be: isMobile ? !showNav : showNav
. This way it will automatically close when in mobile and still will allow a button to open/close it.
In your mounted method you need to create an event listener for the screen resize:
mounted () {
this.onResize()
window.addEventListener('resize', this.onResize, { passive: true })
},
Demo: https://codepen.io/adelriosantiago/pen/mdPbGQv?editors=1010
本文标签: javascriptVuejs change switch class depending on viewport sizeStack Overflow
版权声明:本文标题:javascript - Vue.js change switch class depending on viewport size - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744609445a2615560.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论