13. Vue Project-Realize the fade effect of Header

New header.vue component

Introduced into the parent component Detail.vue

Insert picture description here
header.vue

By router-linklabel set to属性for the address, click the Home realization
tag div tag set, there will be a property of the div

Insert picture description here

<template>
  <div class="header">
    <router-link tag="div" to="/" class="header-abs">
      <div class="iconfont header-abs-back">&#xe685;</div>
    </router-link>
    <div class="header-fixed">
      <div class="header">
        景点详情
        <router-link to="/">
          <div class="iconfont header-fixed-back">&#xe685;</div>
        </router-link>
      </div>
    </div>
  </div>
</template>

<script>
export default {
     
     
  name: 'DetailHeader'
}
</script>

<style lang="scss" scoped>
@import '~styles/varibles.scss';
.header-abs {
     
     
  position: absolute;
  left: 0.2rem;
  top: 0.2rem;
  width: 0.8rem;
  height: 0.8rem;
  line-height: 0.8rem;
  text-align: center;
  border-radius: 0.4rem;
  background: rgba(0, 0, 0, 0.8);
  .header-abs-back {
     
     
    color: #fff;
    font-size: 0.4rem;
  }
}
.header-fixed {
     
     
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: $HeaderHeight;
  line-height: $HeaderHeight;
  text-align: center;
  color: #fff;
  background: $bgColor;
  .header-fixed-back {
     
     
    position: absolute;
    top: 0;
    left: 0;
    color: #fff;
    width: 0.64rem;
    text-align: center;
    font-size: 0.4rem;
  }
}
</style>

Logical part

Call the activated hook function , because we use keepalive , so the page will be executed as soon as the activated hook is displayed
. The following figure means to bind a "scroll" event, once it is executed, the corresponding this.handleScroll method will be executed

Insert picture description here

addEventListener() method, event listener
You can use the removeEventListener() method to remove event listener.

grammar:

element.addEventListener(event, function, useCapture);

The first parameter is the type of event (such as "click" or "scroll").

The second parameter is the function to be called after the event is triggered.

The third parameter is a Boolean value used to describe whether the event is bubbling or captured. This parameter is optional.

Note: Do not use the "on" prefix. For example, use "click" instead of "onclick".

Fading effect

Insert picture description here
A ternary expression is used here, so that the maximum opacity can only be 1
Insert picture description here
F12 review element can see that style is added to the div

Insert picture description here

<template>
  <div class="header">
    <router-link tag="div" to="/" class="header-abs" v-show="showAbs">
      <div class="iconfont header-abs-back">&#xe685;</div>
    </router-link>
    <div class="header-fixed" v-show="!showAbs" :style="opacityStyle">
      <div class="header">
        景点详情
        <router-link to="/">
          <div class="iconfont header-fixed-back">&#xe685;</div>
        </router-link>
      </div>
    </div>
  </div>
</template>

<script>
export default {
     
     
  name: 'DetailHeader',
  data() {
     
     
    return {
     
     
      showAbs: true,
      opacityStyle: {
     
     
        opacity: 0
      }
    }
  },
  methods: {
     
     
    handleScroll() {
     
     
      console.log('scroll')
      // console.log(document.documentElement.scrollTop)
      const top = document.documentElement.scrollTop
      if (top > 60) {
     
     
        let opacity = top / 140
        // 让 opacity 最大值只能是 1
        opacity = opacity > 1 ? 1 : opacity
        this.opacityStyle = {
     
      opacity }
        this.showAbs = false
      } else {
     
     
        this.showAbs = true
      }
    }
  },
  activated() {
     
     
    window.addEventListener('scroll', this.handleScroll)
  },
  deactivated() {
     
     
    window.removeEventListener('scroll', this.handleScroll)
  }
}
</script>

<style lang="scss" scoped>
@import '~styles/varibles.scss';
.header-abs {
     
     
  position: absolute;
  left: 0.2rem;
  top: 0.2rem;
  width: 0.8rem;
  height: 0.8rem;
  line-height: 0.8rem;
  text-align: center;
  border-radius: 0.4rem;
  background: rgba(0, 0, 0, 0.8);
  .header-abs-back {
     
     
    color: #fff;
    font-size: 0.4rem;
  }
}
.header-fixed {
     
     
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: $HeaderHeight;
  line-height: $HeaderHeight;
  text-align: center;
  color: #fff;
  background: $bgColor;
  .header-fixed-back {
     
     
    position: absolute;
    top: 0;
    left: 0;
    color: #fff;
    width: 0.64rem;
    text-align: center;
    font-size: 0.4rem;
  }
}
</style>

Guess you like

Origin blog.csdn.net/weixin_45811256/article/details/109456800