zoukankan      html  css  js  c++  java
  • vue单页应用 h5页面-吸顶效果-锚点定位-滚动到相应的位置激活tab

    <template>
      <div>
        <div class="jiancha-header" id="boxFixed" :class="{'is_fixed' : isFixed}">
          <el-row class="jiancha-header-top">
            <i class="el-icon-arrow-left jiancha-header-i" @click="$router.go(-1);"></i>
            <span class="jiancha-header-span">检查阅读</span>
            <el-input v-model="input" prefix-icon="el-icon-search" placeholder="搜索检查项目"></el-input>
          </el-row>
    
          <div class="jiancha-header-title">
            <div class="jiancha-header-title">
              <div
                v-for="(item,key) in titleArr"
                :key="key"
                class="jiancha-header-title-div"
                @click="goAnchor(key)"
              >
                <a
                  href="javascript:void(0)"
                  :class="key === titleId ? 'jiancha-header-title-div-show' : ''"
                >{{item.name}}</a>
                <div
                  style="20px;height:2px;background: #00A0E9;margin:0 auto;border-radius: 20px;"
                  v-show="key === titleId"
                ></div>
              </div>
            </div>
          </div>
        </div>
    
        <div class="jiancha-content">
          <div class="jiancha-content-div" v-for="(item,key) in contentArr" :key="key" :id="'anchor'+key">
            <div class="jiancha-content-div-top">
              <div class="jiancha-content-div-top-left"></div>
              <div class="jiancha-content-div-top-right">{{item.name}}</div>
            </div>
            <div class="jiancha-content-div-content">
              <div
                class="jiancha-content-div-content-div"
                v-for="(item2,key2) in item.content"
                :key="key2"
                :id="item2.id"
              >
                <div class="jiancha-content-div-content-div-span">{{item2.title}}</div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </template>
    
    <script>
    import "../../assets/css/jiancha/jiancha.css";
    import { getJianChaMsg, getJianChaDetailMsg } from "@/api/jiancha";
    export default {
      data() {
        return {
          input: "",
          titleArr: [],
          contentArr: [],
          titleId: 0,
          isFixed: false,
          offsetTopA: 0
        };
      },
      created() {
        this.initMsg();
      },
      mounted() {
        window.addEventListener("scroll", this.initHeight);
        this.$nextTick(() => {
          this.offsetTopA = document.querySelector("#boxFixed").offsetTop;
        });
      },
      methods: {
        goAnchor(index) {
          this.titleId = index;
          var anchor = this.$el.querySelector("#anchor" + index);
          document.body.scrollTop = anchor.offsetTop - 130;
          document.documentElement.scrollTop = anchor.offsetTop - 130;
        },
        checkTitle(val) {
          console.log(val);
          this.titleId = val;
        },
        initHeight(e) {
          var scrollTop =
            window.pageYOffset ||
            document.documentElement.scrollTop ||
            document.body.scrollTop;
          this.isFixed = scrollTop > this.offsetTopA ? true : false;
          let scrollItems = document.querySelectorAll('.jiancha-content-div')
          for (let i = scrollItems.length - 1; i >= 0; i--) {
            // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
            let judge = scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop - 130;
            if (judge) {
              this.titleId = i
              break
            }
          }
    //       var anchorOffset0 = this.$el.querySelector('#anchor0').offsetTop-100
    //     var anchorOffset1 = this.$el.querySelector('#anchor1').offsetTop-100
    //      var anchorOffset2 = this.$el.querySelector('#anchor2').offsetTop-100
    //     if(scrollTop>anchorOffset0&&scrollTop<anchorOffset1){
    //     this.seeThis = 0
    //     }
    //     if(scrollTop>anchorOffset1&&scrollTop<anchorOffset2){
    //     this.seeThis = 1
    //     }
    //     if(scrollTop>anchorOffset2){
    //     this.seeThis = 2
    //     }
        },
        initMsg() {
          getJianChaMsg()
            .then(res => {
              console.log(res);
              this.titleArr = res.data.data.info.map(item => {
                return {
                  id: item.id,
                  name: item.name
                };
              });
              this.contentArr = res.data.data.info;
              console.log(this.contentArr);
            })
            .catch(err => {
              console.log(err);
            });
        }
      },
      destroyed() {
        window.removeEventListener("scroll", this.handleScroll);
      }
    };
    </script>
    
    <style>
    </style>
    vue代码
    .jiancha-header {
       100%;
      background: #fff;
      //   padding-bottom: 20px;
      border-bottom: 1px solid #F0F0F0;
    
      .jiancha-header-top {
        padding-top: 30px;
        overflow: hidden;
    
        .jiancha-header-i {
          color: #000000;
          font-size: 22px;
          margin-left: 5px;
          font-weight: bold;
        }
    
        .jiancha-header-span {
          margin-left: 1%;
          font-size: 18px;
          font-weight: bold;
          color: #000;
        }
    
        .el-input {
           60%;
          margin-left: 5%;
        }
    
        .el-input__inner {
          border-radius: 21px;
          background: #F9F9F9;
        }
    
      }
    
      .jiancha-header-title {
        margin-top: 5px;
        display: flex;
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
    
        .jiancha-header-title-div {
          margin-left: 20px;
          line-height: 40px;
          text-align: center;
          white-space: nowrap;
          font-size: 16px;
    
          a {
            text-decoration: none;
            color: #A8A8A8;
          }
    
          a:active {
            color: #00A0E9;
          }
        }
    
        .jiancha-header-title-div:last-child {
          margin-right: 20px;
        }
    
        .jiancha-header-title-div-show {
          color: #00A0E9 !important;
        }
      }
    }
    
    .jiancha-content {
      background: #F9F9F9;
      padding: 10px 0 0 0;
      overflow: scroll;
      height: 100%;
    
      .jiancha-content-div {
         90%;
        margin: 10px auto;
        // padding: 10px 0;
        background: #fff;
    
        .jiancha-content-div-top {
          display: flex;
          padding: 10px;
          height: 20px;
           auto;
    
          .jiancha-content-div-top-left {
            height: 80%;
             3px;
            margin-top: 2px;
            border-radius: 10px;
            background: #00A0E9;
          }
    
          .jiancha-content-div-top-right {
            font-weight: bold;
            line-height: 20px;
            color: #000000;
            margin-left: 5px;
          }
        }
    
        .jiancha-content-div-content {
          display: flex;
          flex-wrap: wrap;
    
          .jiancha-content-div-content-div {
             30%;
            background: #F9F9F9;
            word-wrap: break-word;
            word-break: normal;
            text-align: center;
            margin: 10px 5px;
    
            .jiancha-content-div-content-div-span {
              margin: 5px 5px;
              font-size: 14px;
              font-weight: 400;
            }
          }
    
          .jiancha-content-div-content-div:nth-child(n+4) {
            margin: 0 5px 10px 5px;
          }
        }
      }
    }
    
    .jiancha-content:last-child {
      padding-bottom: 30px;
    }
    
    .is_fixed {
      position: fixed;
      top: 0;
      left: 0;
      z-index: 999;
    }
    css代码

    参考网站实现功能:https://www.yisu.com/zixun/603790.html

    参考网站实现功能:https://blog.csdn.net/qq493820798/article/details/106234801

    动画效果:

    <template>
      <div>
        <div class="jiancha-header" id="boxFixed" :class="{'is_fixed' : isFixed}">
          <el-row class="jiancha-header-top">
            <i class="el-icon-arrow-left jiancha-header-i" @click="$router.go(-1);"></i>
            <span class="jiancha-header-span">检查阅读</span>
            <el-input v-model="inputprefix-icon="el-icon-search" placeholder="搜索检查项目"></el-input>
          </el-row>

          <div class="jiancha-header-title">
            <div class="jiancha-header-title">
              <div
                v-for="(item,keyin titleArr"
                :key="key"
                class="jiancha-header-title-div"
                @click="goAnchor(key)"
              >
                <a
                  href="javascript:void(0)"
                  :class="key === titleId ? 'jiancha-header-title-div-show' : ''"
                >{{item.name}}</a>
                <div
                  style="20px;height:2px;background: #00A0E9;margin:0 auto;border-radius: 20px;"
                  v-show="key === titleId"
                ></div>
              </div>
            </div>
          </div>
        </div>

        <div class="jiancha-content">
          <div class="jiancha-content-div" v-for="(item,keyin contentArr" :key="key" :id="'anchor'+key">
            <div class="jiancha-content-div-top">
              <div class="jiancha-content-div-top-left"></div>
              <div class="jiancha-content-div-top-right">{{item.name}}</div>
            </div>
            <div class="jiancha-content-div-content">
              <div
                class="jiancha-content-div-content-div"
                v-for="(item2,key2in item.content"
                :key="key2"
                :id="item2.id"
              >
                <div class="jiancha-content-div-content-div-span">{{item2.title}}</div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </template>

    <script>
    import "../../assets/css/jiancha/jiancha.css";
    import { getJianChaMsggetJianChaDetailMsg } from "@/api/jiancha";
    export default {
      data() {
        return {
          input: "",
          titleArr: [],
          contentArr: [],
          titleId: 0,
          isFixed: false,
          offsetTopA: 0
        };
      },
      created() {
        this.initMsg();
      },
      mounted() {
        window.addEventListener("scroll"this.initHeight);
        this.$nextTick(() => {
          this.offsetTopA = document.querySelector("#boxFixed").offsetTop;
        });
      },
      methods: {
        goAnchor(index) {
          this.titleId = index;
          var anchor = this.$el.querySelector("#anchor" + index);
          document.body.scrollTop = anchor.offsetTop - 130;
          document.documentElement.scrollTop = anchor.offsetTop - 130;
        },
        checkTitle(val) {
          console.log(val);
          this.titleId = val;
        },
        initHeight(e) {
          var scrollTop =
            window.pageYOffset ||
            document.documentElement.scrollTop ||
            document.body.scrollTop;
          this.isFixed = scrollTop > this.offsetTopA ? true : false;
          let scrollItems = document.querySelectorAll('.jiancha-content-div')
          for (let i = scrollItems.length - 1i >= 0i--) {
            // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
            let judge = scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop - 130;
            if (judge) {
              this.titleId = i
              break
            }
          }
    //       var anchorOffset0 = this.$el.querySelector('#anchor0').offsetTop-100
    //     var anchorOffset1 = this.$el.querySelector('#anchor1').offsetTop-100
    //      var anchorOffset2 = this.$el.querySelector('#anchor2').offsetTop-100
    //     if(scrollTop>anchorOffset0&&scrollTop<anchorOffset1){
    //     this.seeThis = 0
    //     }
    //     if(scrollTop>anchorOffset1&&scrollTop<anchorOffset2){
    //     this.seeThis = 1
    //     }
    //     if(scrollTop>anchorOffset2){
    //     this.seeThis = 2
    //     }
        },
        initMsg() {
          getJianChaMsg()
            .then(res => {
              console.log(res);
              this.titleArr = res.data.data.info.map(item => {
                return {
                  id: item.id,
                  name: item.name
                };
              });
              this.contentArr = res.data.data.info;
              console.log(this.contentArr);
            })
            .catch(err => {
              console.log(err);
            });
        }
      },
      destroyed() {
        window.removeEventListener("scroll"this.handleScroll);
      }
    };
    </script>

    <style>
    </style>

    本文仅提供参考,是本人闲时所写笔记,如有错误,还请赐教,作者:阿蒙不萌,大家可以随意转载

  • 相关阅读:
    框架:Java-Spring Cloud
    DB-数据库:百科
    公司-风险投资公司-软银银行集团:百科
    百科-Java-API:POI
    组织:基金会
    un-解决方案-MSP(管理服务提供商):百科
    汉语-词语:金融
    DBS-MySQL:MYSQL获取自增ID的四种方法
    linux框架之ibus
    jQuery+CSS 简单代码实现遮罩层( 兼容主流浏览器 )
  • 原文地址:https://www.cnblogs.com/huchong-bk/p/15188113.html
Copyright © 2011-2022 走看看