Skip to content

Commit

Permalink
[add] initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
wochap committed May 30, 2016
1 parent 462bc94 commit e21ee30
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
139 changes: 139 additions & 0 deletions src/Scroader.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
<template>
<div class="c-scroader" :class="{ 'is-fixed' : isHeaderFixed }" :style="{ height: headerHeight + 'px' }">
<div class="c-scroader__header"
v-show="isHeaderVisible"
:transition="headerTransition"
v-el:header>
<slot></slot>
</div>
</div>
</template>

<script>
export default {
data () {
return {
headerHeight: 0,
topOffset: 0,
lastTopOffset: 0,
isScrollingTop: false,
isHeaderFixed: false
}
},
props: [
{
name: 'headerOffset', // space between top and header
type: Number,
default: 0
}, {
name: 'scroaderOffset', // space between header and the out offset zone
type: Number,
default: 200
}, {
name: 'headerTransition',
type: String,
default: 'scroader'
}
],
computed: {
isHeaderInOffset () {
if (this.topOffset > (this.headerOffset + this.scroaderOffset)) {
// update isHeaderFixed
this.isHeaderFixed = true
return false
}
return true
},
isHeaderVisible () {
if (!this.isHeaderInOffset && !this.isScrollingTop) {
return false
}
return true
}
},
methods: {
scrollHandler () {
// update topOffset
this.topOffset = document.body.scrollTop
// update isScrollingTop
if (this.topOffset > this.lastTopOffset) {
this.isScrollingTop = false
} else {
this.isScrollingTop = true
}
this.lastTopOffset = this.topOffset
// update isHeaderFixed
if (this.topOffset <= (0 + this.headerOffset)) {
this.isHeaderFixed = false
}
},
windowResizeHandler () {
// update header height
this.headerHeight = this.$els.header.offsetHeight
}
},
ready () {
// listener windows width
window.addEventListener('resize', this.windowResizeHandler)
// listener scroll
window.addEventListener('scroll', this.scrollHandler)
this.scrollHandler()
this.windowResizeHandler()
},
beforeDestroy () {
// remove listener windows width
window.removeEventListener('resize', this.windowResizeHandler)
// remove listener scroll
window.removeEventListener('scroll', this.scrollHandler)
}
}
</script>

<style lang="scss">
@import '~sass-bem-constructor/dist/bem-constructor';
// Component
//  --------------------------------------------------------------------------
@include component('scroader') {
display: block;
width: 100%;
@include element('header') {
display: block;
width: 100%;
}
@include state('fixed') {
@include modifies-element('header') {
left: 0;
position: fixed;
top: 0;
}
}
}
// Transition
//  --------------------------------------------------------------------------
.scroader {
&-transition {
transition: transform .3s, opacity .3s;
}
&-enter,
&-leave {
transform: translate3d(0, -100%, 0);
opacity: 0;
}
&-leave {
transition: none;
}
}
</style>
5 changes: 5 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var Scroader = require('./Scroader')

module.exports = {
WvScroader: Scroader
}

0 comments on commit e21ee30

Please sign in to comment.