zoukankan      html  css  js  c++  java
  • 【生活美好】Mobile-H5-web-for-vue

    各位亲爱的程序员们好,本宝宝又开始上github啦
    和各位程序员宝宝们一起努力呢
    话不多说,先上这个项目的效果

    这个项目应该就是那种H5项目,不过是用vue写的
    放上github地址:https://github.com/ihopefulChina/Mobile-H5-web-for-vue
    我们一起看代码啦
    看了下package.json里面用到的插件不多

    {
      "name": "test1",
      "version": "0.1.0",
      "private": true,
      "scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build"
      },
      "dependencies": {
        "core-js": "^3.6.4",
        "jquery": "^3.5.1",
        "swiper": "^5.3.8",
        "vue": "^2.6.11",
        "vue-awesome-swiper": "^4.1.1",
        "vue-directive-touch": "^1.0.28",
        "vue-router": "^3.1.6",
        "vuex": "^3.1.3"
      },
      "devDependencies": {
        "@vue/cli-plugin-babel": "~4.3.0",
        "@vue/cli-plugin-router": "~4.3.0",
        "@vue/cli-plugin-vuex": "~4.3.0",
        "@vue/cli-service": "~4.3.0",
        "less": "^3.0.4",
        "less-loader": "^5.0.0",
        "vue-template-compiler": "^2.6.11"
      },
      "browserslist": [
        "> 1%",
        "last 2 versions",
        "not dead"
      ]
    }
    
    
    //main.js
    import Vue from "vue";
    import App from "./App.vue";
    import router from "./router";
    import store from "./store";
    
    import touch from 'vue-directive-touch';
    Vue.use(touch);
    
    // import Loading from '@/components/Loading'
    // Vue.component('Loading', Loading);
    
    Vue.config.productionTip = false
    
    new Vue({
      router,
      store,
      render: (h) => h(App),
    }).$mount("#app");
    

    main.js中就是入口引用了相关的组件

    //app.vue
    <template>
      <div id="app">
        <router-view />
      </div>
    </template>
    
    <style lang="less">
    #app {
      height: 100%;
      position: absolute;
      left: 0;
      right: 0;
      margin: auto;
    }
    </style>
    

    接下来看router.js
    默认是进入Home页面,Home页面里面有两个入口

    import Vue from "vue";
    import VueRouter from "vue-router";
    import Home from "../views/Home";
    Vue.use(VueRouter);
    
    const routes = [{
        path: "/",
        name: "Home",
        component: Home,
      },
      {
        path: "/page1/",
        name: "Page1",
        component: () => import("@/views/Page1"),
        children: [{
            path: "pth",
            component: () => import("@/components/Page/Pth/"),
          },
          {
            path: "njh",
            component: () => import("@/components/Page/Njh/"),
          },
        ],
      },
      {
        path: "/page2/",
        name: "Page2",
        component: () => import("@/views/Page2"),
      },
      {
        path: "/page3/",
        name: "Page3",
        component: () => import("@/views/Page3"),
      },
    ];
    
    const router = new VueRouter({
      mode: "history",
      base: process.env.BASE_URL,
      routes,
    });
    
    export default router;
    

    接下来我们看home.vue页面
    home.vue中包含了三个入口

    //home.vue
    <template>
      <div id="main">
        <Loading />
        <div class="home-page-box" v-touch:up="onSwipeUp">
          <transition>
            <router-view></router-view>
          </transition>
          <Bgm />
          <div class="page-warp home-page"></div>
          <div class="home-img home-logo">
            <img src="@/assets/img/p101.png" alt="p101" />
          </div>
          <div class="home-btn">
            <div class="home-group-box">
              <router-link tag="div" to="/page1/njh" class="home-img">
                <img src="@/assets/img/img01.png" alt="img01" />
                <div class="home-handle">
                  <img src="@/assets/img/shou.png" alt="shou" />
                </div>
              </router-link>
              <router-link tag="div" to="/page1/pth" class="home-img">
                <img src="@/assets/img/img02.png" alt="img02" />
                <div class="home-handle">
                  <img src="@/assets/img/shou.png" alt="shou 2" />
                </div>
              </router-link>
            </div>
          </div>
          <div class="home-content">
            <div class="home-group-box">
              <div class="home-img">
                <img src="@/assets/img/img03.png" alt="img03" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img04.png" alt="img04" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img05.png" alt="img05" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img06.png" alt="img06" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img07.png" alt="img07" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img08.png" alt="img08" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img09.png" alt="img09" />
              </div>
              <div class="home-img">
                <img src="@/assets/img/img0a.png" alt="img0a" />
              </div>
            </div>
          </div>
        </div>
      </div>
    </template>
    <script>
    import Bgm from "@/components/Bgm";
    import Loading from "@/components/Loading";
    export default {
      name: "Home",
      data() {
        return {
          isloading: false,
        };
      },
      components: {
        Bgm,
        Loading,
      },
      methods: {
        onSwipeUp() {
          this.$router.go(-1);
        },
      },
    };
    </script>
    
    <style scoped lang="less">
    #main {
       100%;
      height: 100%;
      .page-warp {
        position: absolute;
         100%;
        height: 100%;
        overflow: hidden;
        -webkit-box-sizing: border-box;
        box-sizing: border-box;
        -webkit-backface-visibility: visible;
        backface-visibility: visible;
        background-repeat: no-repeat;
        background-size: cover;
        touch-action: none;
        user-select: none;
        -webkit-user-drag: none;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
        .page-warp {
           100%;
          min-height: 100%;
          position: relative;
        }
      }
      .home-page {
        background-image: url("~@/assets/img/bg.png");
      }
      .home-page-box {
         100%;
        min-height: 100%;
        position: relative;
        .home-img {
          background-size: cover;
          background-position: 50%;
          animation: puffIn 1000ms 2100ms both;
          position: absolute;
          left: 0;
          right: 0;
          img {
             100%;
            height: auto;
            pointer-events: none;
            display: none;
          }
        }
        .home-logo {
          bottom: 0.44rem;
          height: auto;
           6.688rem;
          margin: auto;
          img {
            display: block;
          }
        }
        .home-btn {
          background-size: cover;
          height: 1.792rem;
          left: 4.928rem;
          top: 31.768rem;
           14.144rem;
          position: absolute;
          .home-group-box {
             100%;
            min-height: 100%;
            position: relative;
            .home-img {
              background-size: cover;
              background-position: 50%;
              img {
                 100%;
                pointer-events: none;
                display: block;
              }
              .home-handle {
                position: absolute;
                right: 0;
                left: 0;
                top: 1rem;
                margin: 0 auto;
                 2rem;
                animation: fadeIn 1000ms 1800ms both;
                img {
                  -webkit-animation: twinkling 0.6s infinite ease-in-out;
                  animation: twinkling 0.6s infinite ease-in-out;
                }
              }
            }
            .home-img:nth-child(1) {
              animation: fadeInUp 1000ms 1800ms both;
              height: 1.792rem;
              left: 8rem;
              position: absolute;
              top: 0;
               6.144rem;
            }
            .home-img:nth-child(2) {
              animation: fadeInUp 1000ms 1600ms both;
              height: 1.792rem;
              left: 0;
              position: absolute;
              top: 0;
               6.176rem;
            }
          }
        }
        .home-content {
          height: 29.92rem;
          left: 1.728rem;
          position: absolute;
          top: 1.696rem;
           17.28rem;
          .home-group-box {
             100%;
            min-height: 100%;
            position: relative;
            .home-img {
              background-size: cover;
              background-position: 50%;
              img {
                 100%;
                pointer-events: none;
                display: block;
              }
            }
            .home-img:nth-child(1) {
              animation: fadeInLeft 1000ms 100ms both;
              height: 7.904rem;
              left: 3.264rem;
              position: absolute;
              top: 18.208rem;
               14.016rem;
            }
            .home-img:nth-child(2) {
              animation: fadeInRight 1000ms 100ms both;
              height: 16rem;
              left: 3.264rem;
              position: absolute;
              top: 1.952rem;
               14.016rem;
            }
            .home-img:nth-child(3) {
              animation: puffIn 1000ms 1000ms both;
              height: 6.24rem;
              left: 4.352rem;
              position: absolute;
              top: 22.016rem;
               11.52rem;
            }
            .home-img:nth-child(4) {
              animation: fadeIn 1000ms 300ms both;
              height: 1.376rem;
              left: 1.152rem;
              position: absolute;
              top: 0;
               2.688rem;
            }
            .home-img:nth-child(5) {
              animation: fadeIn 1000ms 700ms both;
              height: 3.072rem;
              left: 0;
              position: absolute;
              top: 18.208rem;
               3.296rem;
            }
            .home-img:nth-child(6) {
              animation: fadeIn 1000ms 600ms both;
              height: 8.16rem;
              left: 1.216rem;
              position: absolute;
              top: 8.672rem;
               1.056rem;
            }
            .home-img:nth-child(7) {
              animation: fadeInLeft 1000ms 1300ms both;
              height: 1.984rem;
              left: 10.944rem;
              position: absolute;
              top: 27.904rem;
               4.896rem;
            }
            .home-img:nth-child(8) {
              animation: fadeInRight 1000ms 1300ms both;
              height: 2.112rem;
              left: 4.672rem;
              position: absolute;
              top: 27.808rem;
               5.472rem;
            }
          }
        }
      }
    }
    .animated {
      -webkit-animation-duration: 1s;
      animation-duration: 1s;
      -webkit-animation-fill-mode: both;
      animation-fill-mode: both;
    }
    @-webkit-keyframes twinkling {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }
    @keyframes twinkling {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }
    </style>
    
    

    home.vue中还引用了Bgm组件和loading组件
    接下来看Loading组件
    这个loading组件是作者自己封装的呢

    //loading.vue
    <template>
      <div class="loader">
        <img src="@/assets/img/p101.png" alt="laoding-logo" />
        <div class="loading">
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
        </div>
      </div>
    </template>
    <script>
    export default {
      name: "Loading",
    };
    </script>
    
    <style lang="less" scoped>
    html,
    body {
      height: 100%;
    }
    
    .loader {
      position: absolute;
       100%;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      text-align: center;
      margin: 0 auto;
      img {
         8rem;
        height: auto;
      }
    
      .loading {
        margin-top: 2rem;
        i {
          display: inline-block;
           4px;
          height: 2rem;
          border-radius: 2px;
          margin: 0 2px;
          background-color: #333;
        }
        i:nth-child(1) {
          animation: loading 0.5s ease-in 0.1s infinite;
        }
        i:nth-child(2) {
          animation: loading 0.5s ease-in 0.2s infinite;
        }
        i:nth-child(3) {
          animation: loading 0.5s ease-in 0.3s infinite;
        }
        i:nth-child(4) {
          animation: loading 0.5s ease-in 0.4s infinite;
        }
        i:nth-child(5) {
          animation: loading 0.5s ease-in 0.5s infinite;
        }
      }
      @keyframes loading {
        0% {
          transform: scaleY(1);
        }
        50% {
          transform: scaleY(0.4);
        }
        100% {
          transform: scaleY(1);
        }
      }
    }
    </style>
    

    接下来是背景音乐组件,也是作者自己封装的
    有意思极了,这个地方为啥是用的dom不是用的vue语法,神奇,不过代码很有意思

    <template>
      <div id="bg_music">
        <div id="audio-btn" @click="changeOn" :class="isOff ? 'off' : 'on'">
          <audio src="@/assets/music.mp3" id="media" autoplay></audio>
        </div>
      </div>
    </template>
    <script>
    export default {
      name: "hello",
      data() {
        return {
          isOff: false,
        };
      },
      mounted() {
        // 自动播放音乐效果,解决微信自动播放问题
        document.addEventListener("touchstart", this.audioAutoPlay, false);
        document.addEventListener("WeixinJSBridgeReady", this.audioAutoPlay, false);
        let oAudio = document.querySelector("#media");
        oAudio.onended = function() {
          //播放完毕,重新循环播放
          oAudio.load();
          oAudio.play();
        };
      },
      methods: {
        changeOn() {
          let oAudio = document.querySelector("#media");
          oAudio.pause();
          if (this.isOff) {
            oAudio.play(); //让音频文件开始播放
          } else {
            oAudio.pause(); //让音频文件暂停播放
          }
          this.isOff = !this.isOff;
        },
        audioAutoPlay() {
          let audio = document.getElementById("media");
          this.isOff = false;
          audio.play();
          document.removeEventListener("touchstart", this.audioAutoPlay);
        },
      },
    };
    </script>
    
    <style lang="less" scoped>
    #bg_music {
      position: absolute;
      z-index: 1992;
      display: block;
       28px;
      height: 28px;
      top: 10px;
      right: 10px;
      #audio-btn {
         100%;
        height: 100%;
        background-size: 100% 100%;
      }
      .on {
        background: url("~@/assets/img/playing_1.svg") no-repeat 0 0;
        -webkit-animation: rotating 1.2s linear infinite;
        animation: rotating 1.2s linear infinite;
      }
      .off {
        background: url("~@/assets/img/paused_18.svg") no-repeat 0 0;
      }
    }
    @-webkit-keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    @keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    </style>
    

    接下来是南京话里面的模块

    //Njh.vue
    <template>
      <div
        id="main"
        v-touch:up="onSwipeUp"
        v-touch:down="onSwipeDowm"
        v-touch:left="onSwipeUp"
        v-touch:right="onSwipeDowm"
      >
        <transition>
          <router-view></router-view>
        </transition>
        <div id="bg_music">
          <div id="audio-btn" @click="changeOn" :class="isOff ? 'off' : 'on'">
            <audio src="@/assets/music.mp3" id="media" autoplay></audio>
          </div>
        </div>
        <div class="page-warp page1-bg"></div>
        <div class="page1-page-box">
          <div class="page1-group page1-content">
            <div class="page1-group-box">
              <router-link tag="div" to="/page1/pth" class="page1-group page1-btn">
                <div class="page1-group-box">
                  <div class="page1-img">
                    <img src="@/assets/img/img02.png" alt="img01" />
                  </div>
                </div>
              </router-link>
              <div class="page1-img page1-fz-content">
                <img src="@/assets/img/img0b.png" alt="img0b" />
              </div>
              <div class="rulediv">
                <img
                  :src="require('@/assets/img/b' + ruleimg + '.png')"
                  class="sizeimg"
                />
                <audio
                  :src="require('@/assets/mp3/p1-' + ruleimg + '.mp3')"
                  class="media audio"
                  ref="audio"
                ></audio>
              </div>
              <div class="page1-group page1-click-btn">
                <div class="page1-group-box">
                  <div
                    class="page1-group"
                    v-for="(item, index) in items"
                    :key="index"
                    @click="changeOnVice(item)"
                    :class="item.ids == num ? 'active' : ''"
                  >
                    <div class="page1-group-box">
                      <div class="page1-img" ref="pageImgBtns">
                        <img
                          class="pageImgBtns"
                          :src="
                            item.ids == num
                              ? require('@/assets/img/img0' + item.url + '.gif')
                              : require('@/assets/img/img0' + item.url + '.png')
                          "
                          alt="img"
                        />
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="page1-img page1-click-voice">
                <img src="@/assets/img/img0j.png" alt="img0j" />
              </div>
              <div class="page1-img page1-click-handle">
                <img src="@/assets/img/img0k.png" alt="img0k" />
              </div>
            </div>
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/p201.png" alt="p201" />
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/img0l.png" alt="img0l" />
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/img0m.png" alt="img0m" />
          </div>
        </div>
        <router-link class="swiper-next" tag="div" to="/page2/">
          <div class="page-arrow">
            <img src="@/assets/img/arrow.png" alt="arrow" />
          </div>
        </router-link>
      </div>
    </template>
    <script>
    import Bgm from "@/components/Bgm";
    export default {
      name: "Njh",
      data() {
        return {
          num: -1,
          items: [
            { pid: "7", url: "c", ids: 1 },
            { pid: "6", url: "d", ids: 2 },
            { pid: "5", url: "e", ids: 3 },
            { pid: "3", url: "f", ids: 4 },
            { pid: "4", url: "g", ids: 5 },
            { pid: "1", url: "i", ids: 6 },
          ],
          ruleimg: "1",
          isOff: false,
        };
      },
      mounted() {
        // 自动播放音乐效果,解决微信自动播放问题
        document.addEventListener("touchstart", this.audioAutoPlay, false);
        document.addEventListener("WeixinJSBridgeReady", this.audioAutoPlay, false);
        let oAudio = document.querySelector("#media");
        oAudio.onended = function() {
          //播放完毕,重新循环播放
          oAudio.load();
          oAudio.play();
        };
      },
      components: {
        Bgm,
      },
      methods: {
        changeOn() {
          let oAudio = document.querySelector("#media");
          oAudio.pause();
          if (this.isOff) {
            oAudio.play(); //让音频文件开始播放
          } else {
            oAudio.pause(); //让音频文件暂停播放
          }
          this.isOff = !this.isOff;
        },
        audioAutoPlay() {
          let audio = document.getElementById("media");
          this.isOff = false;
          audio.play();
          document.removeEventListener("touchstart", this.audioAutoPlay);
        },
        changeOnVice(item) {
          //显示介绍图片
          let sizeimg = document.querySelector(".sizeimg");
          sizeimg.style.display = "block";
          let media = document.querySelector(".media");
          return (this.ruleimg = item.pid), (this.num = item.ids), media.play();
        },
        onSwipeUp() {
          this.$router.push("/page2");
        },
        onSwipeDowm() {
          this.$router.push("/");
        },
      },
    };
    </script>
    <style scoped lang="less">
    #bg_music {
      position: absolute;
      z-index: 1992;
      display: block;
       28px;
      height: 28px;
      top: 10px;
      right: 10px;
      #audio-btn {
         100%;
        height: 100%;
        background-size: 100% 100%;
      }
      .on {
        background: url("~@/assets/img/playing_1.svg") no-repeat 0 0;
        -webkit-animation: rotating 1.2s linear infinite;
        animation: rotating 1.2s linear infinite;
      }
      .off {
        background: url("~@/assets/img/paused_18.svg") no-repeat 0 0;
      }
    }
    @-webkit-keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    @keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    .page1-bg {
      background-image: url("~@/assets/img/bg01.png");
    }
    .page1-page-box {
       100%;
      min-height: 100%;
      position: relative;
      .page-img {
        background-size: cover;
        background-position: 50%;
        img {
           100%;
          pointer-events: none;
          display: block;
        }
      }
      .page1-group {
        background-size: cover;
        .page1-group-box {
           100%;
          min-height: 100%;
          position: relative;
        }
      }
      .page1-content {
        height: 22.24rem;
        left: 2.848rem;
        position: absolute;
        top: 10.912rem;
         18.976rem;
      }
      .page1-btn {
        animation: fadeInUp 1000ms 2000ms both;
        position: absolute;
        left: 6.5rem;
        top: 22.5rem;
         6.2rem;
        height: 2rem;
        z-index: 999;
        .page1-group-box {
          .page1-img:nth-child(1) {
            height: 1.792rem;
            left: 0rem;
            position: absolute;
            bottom: 0rem;
             6.144rem;
          }
          .page1-img:nth-child(2) {
            height: 1.792rem;
            left: 0rem;
            position: absolute;
            bottom: 0rem;
             6.144rem;
          }
        }
      }
      .page1-img {
        background-size: cover;
        background-position: 50%;
        img {
           100%;
          pointer-events: none;
          display: block;
        }
      }
      .page1-fz-content {
        animation: puffIn 1000ms 300ms both;
        height: 19.232rem;
        left: 0;
        position: absolute;
        top: 0;
         18.304rem;
      }
      .rulediv {
        position: absolute;
        left: 0;
        top: 0;
         52%;
        z-index: 999;
    
        .sizeimg {
          display: none;
          position: absolute;
          left: 0;
          top: 0;
           100%;
        }
      }
      .rulediv.active {
        display: block;
      }
      .page1-click-btn {
        height: 17.088rem;
        left: 1.216rem;
        position: absolute;
        top: 1.248rem;
         17.76rem;
        .page1-group.active {
          .page1-img {
            animation: fadeIn 1000ms 0ms both;
            transform: scale3d(1.5, 1.5, 1.5);
          }
        }
        .page1-group:nth-child(1) {
          animation: fadeIn 1000ms 1400ms both;
          height: 1.536rem;
          left: 11.584rem;
          position: absolute;
          top: 15.552rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(2) {
          animation: fadeIn 1000ms 900ms both;
          height: 1.536rem;
          left: 0;
          position: absolute;
          top: 13.056rem;
           4.448rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.448rem;
          }
        }
        .page1-group:nth-child(3) {
          animation: fadeIn 1000ms 1600ms both;
          height: 1.536rem;
          left: 4.576rem;
          position: absolute;
          top: 9.376rem;
           4.448rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.448rem;
          }
        }
        .page1-group:nth-child(4) {
          animation: fadeIn 1000ms 1100ms both;
          height: 1.536rem;
          left: 11.488rem;
          position: absolute;
          top: 10.496rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(5) {
          animation: fadeIn 1000ms 1000ms both;
          height: 1.536rem;
          left: 0.16rem;
          position: absolute;
          top: 2.656rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(6) {
          animation: fadeIn 1000ms 1300ms both;
          height: 1.536rem;
          left: 13.28rem;
          position: absolute;
          top: 2.656rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(7) {
          animation: fadeIn 1000ms 1700ms both;
          height: 1.536rem;
          left: 10.912rem;
          position: absolute;
          top: 0;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
      }
      .page1-click-voice {
        animation: fadeIn 1000ms 1900ms both;
        height: 1.536rem;
        left: 3.296rem;
        position: absolute;
        top: 20.704rem;
         11.68rem;
      }
      .page1-click-handle {
        animation: fadeIn 1000ms 1900ms both;
        height: 1.088rem;
        left: 4.096rem;
        position: absolute;
        top: 20.832rem;
         0.672rem;
        img {
          -webkit-animation: twinkling 0.6s infinite ease-in-out;
          animation: twinkling 0.6s infinite ease-in-out;
        }
      }
      .page1-img-content:nth-child(2) {
        animation: fadeInUp 1000ms 2200ms both;
        bottom: 1.528rem;
        height: 2.912rem;
        left: 4.032rem;
        position: absolute;
         16.896rem;
      }
      .page1-img-content:nth-child(3) {
        animation: fadeInRight 1000ms 100ms both;
        height: 4.8rem;
        left: 12rem;
        position: absolute;
        top: 2.528rem;
         5.088rem;
      }
      .page1-img-content:nth-child(4) {
        animation: fadeInLeft 1000ms 100ms both;
        height: 4.8rem;
        left: 6.912rem;
        position: absolute;
        top: 2.528rem;
         5.056rem;
      }
    }
    </style>
    

    普通话中的模块是类似的

    //Pth
    <template>
      <div
        id="main"
        v-touch:up="onSwipeUp"
        v-touch:down="onSwipeDowm"
        v-touch:left="onSwipeUp"
        v-touch:right="onSwipeDowm"
      >
        <transition>
          <router-view></router-view>
        </transition>
        <div id="bg_music">
          <div id="audio-btn" @click="changeOn" :class="isOff ? 'off' : 'on'">
            <audio src="@/assets/music.mp3" id="media" autoplay></audio>
          </div>
        </div>
        <div class="page-warp page1-bg"></div>
        <div class="page1-page-box">
          <div class="page1-group page1-content">
            <div class="page1-group-box">
              <router-link tag="div" to="/page1/njh" class="page1-group page1-btn">
                <div class="page1-group-box">
                  <div class="page1-img">
                    <img src="@/assets/img/img01.png" alt="img01" />
                  </div>
                </div>
              </router-link>
              <div class="page1-img page1-fz-content">
                <img src="@/assets/img/img0b.png" alt="img0b" />
              </div>
              <div class="rulediv">
                <img
                  :src="require('@/assets/img/b' + ruleimg + '.png')"
                  class="sizeimg"
                />
                <audio
                  :src="require('@/assets/mp3/p2-' + ruleimg + '.mp3')"
                  class="media audio"
                  ref="audio"
                ></audio>
              </div>
              <div class="page1-group page1-click-btn">
                <div class="page1-group-box">
                  <div
                    class="page1-group"
                    v-for="(item, index) in items"
                    :key="index"
                    @click="changeOnVice(item)"
                    :class="item.ids == num ? 'active' : ''"
                  >
                    <div class="page1-group-box">
                      <div class="page1-img" ref="pageImgBtns">
                        <img
                          class="pageImgBtns"
                          :src="
                            item.ids == num
                              ? require('@/assets/img/img0' + item.url + '.gif')
                              : require('@/assets/img/img0' + item.url + '.png')
                          "
                          alt="img"
                        />
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="page1-img page1-click-voice">
                <img src="@/assets/img/img0j.png" alt="img0j" />
              </div>
              <div class="page1-img page1-click-handle">
                <img src="@/assets/img/img0k.png" alt="img0k" />
              </div>
            </div>
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/p201.png" alt="p201" />
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/img0l.png" alt="img0l" />
          </div>
          <div class="page1-img-content page1-img">
            <img src="@/assets/img/img0m.png" alt="img0m" />
          </div>
        </div>
        <router-link class="swiper-next" tag="div" to="/page2/">
          <div class="page-arrow">
            <img src="@/assets/img/arrow.png" alt="arrow" />
          </div>
        </router-link>
      </div>
    </template>
    <script>
    import Bgm from "@/components/Bgm";
    export default {
      name: "Njh",
      data() {
        return {
          num: -1,
          items: [
            { pid: "7", url: "c", ids: 1 },
            { pid: "6", url: "d", ids: 2 },
            { pid: "5", url: "e", ids: 3 },
            { pid: "3", url: "f", ids: 4 },
            { pid: "4", url: "g", ids: 5 },
            { pid: "1", url: "i", ids: 6 },
          ],
          ruleimg: "1",
          isOff: false,
        };
      },
      mounted() {
        // 自动播放音乐效果,解决微信自动播放问题
        document.addEventListener("touchstart", this.audioAutoPlay, false);
        document.addEventListener("WeixinJSBridgeReady", this.audioAutoPlay, false);
        let oAudio = document.querySelector("#media");
        oAudio.onended = function() {
          //播放完毕,重新循环播放
          oAudio.load();
          oAudio.play();
        };
      },
      components: {
        Bgm,
      },
      methods: {
        changeOn() {
          let oAudio = document.querySelector("#media");
          oAudio.pause();
          if (this.isOff) {
            oAudio.play(); //让音频文件开始播放
          } else {
            oAudio.pause(); //让音频文件暂停播放
          }
          this.isOff = !this.isOff;
        },
        audioAutoPlay() {
          let audio = document.getElementById("media");
          this.isOff = false;
          audio.play();
          document.removeEventListener("touchstart", this.audioAutoPlay);
        },
        changeOnVice(item) {
          //显示介绍图片
          let sizeimg = document.querySelector(".sizeimg");
          sizeimg.style.display = "block";
          let media = document.querySelector(".media");
          return (this.ruleimg = item.pid), (this.num = item.ids), media.play();
        },
        onSwipeUp() {
          this.$router.push("/page2");
        },
        onSwipeDowm() {
          this.$router.push("/");
        },
      },
    };
    </script>
    <style scoped lang="less">
    #bg_music {
      position: absolute;
      z-index: 1992;
      display: block;
       28px;
      height: 28px;
      top: 10px;
      right: 10px;
      #audio-btn {
         100%;
        height: 100%;
        background-size: 100% 100%;
      }
      .on {
        background: url("~@/assets/img/playing_1.svg") no-repeat 0 0;
        -webkit-animation: rotating 1.2s linear infinite;
        animation: rotating 1.2s linear infinite;
      }
      .off {
        background: url("~@/assets/img/paused_18.svg") no-repeat 0 0;
      }
    }
    @-webkit-keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    @keyframes rotating {
      from {
        -webkit-transform: rotate(0deg);
        -moz-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
        -moz-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }
    .page1-bg {
      background-image: url("~@/assets/img/bg01.png");
    }
    .page1-page-box {
       100%;
      min-height: 100%;
      position: relative;
      .page-img {
        background-size: cover;
        background-position: 50%;
        img {
           100%;
          pointer-events: none;
          display: block;
        }
      }
      .page1-group {
        background-size: cover;
        .page1-group-box {
           100%;
          min-height: 100%;
          position: relative;
        }
      }
      .page1-content {
        height: 22.24rem;
        left: 2.848rem;
        position: absolute;
        top: 10.912rem;
         18.976rem;
      }
      .page1-btn {
        animation: fadeInUp 1000ms 2000ms both;
        position: absolute;
        left: 6.5rem;
        top: 22.5rem;
         6.2rem;
        height: 2rem;
        z-index: 999;
        .page1-group-box {
          .page1-img:nth-child(1) {
            height: 1.792rem;
            left: 0rem;
            position: absolute;
            bottom: 0rem;
             6.144rem;
          }
          .page1-img:nth-child(2) {
            height: 1.792rem;
            left: 0rem;
            position: absolute;
            bottom: 0rem;
             6.144rem;
          }
        }
      }
      .page1-img {
        background-size: cover;
        background-position: 50%;
        img {
           100%;
          pointer-events: none;
          display: block;
        }
      }
      .page1-fz-content {
        animation: puffIn 1000ms 300ms both;
        height: 19.232rem;
        left: 0;
        position: absolute;
        top: 0;
         18.304rem;
      }
      .rulediv {
        position: absolute;
        left: 0;
        top: 0;
         52%;
        z-index: 999;
    
        .sizeimg {
          display: none;
          position: absolute;
          left: 0;
          top: 0;
           100%;
        }
      }
      .rulediv.active {
        display: block;
      }
      .page1-click-btn {
        height: 17.088rem;
        left: 1.216rem;
        position: absolute;
        top: 1.248rem;
         17.76rem;
        .page1-group.active {
          .page1-img {
            animation: fadeIn 1000ms 0ms both;
            transform: scale3d(1.5, 1.5, 1.5);
          }
        }
        .page1-group:nth-child(1) {
          animation: fadeIn 1000ms 1400ms both;
          height: 1.536rem;
          left: 11.584rem;
          position: absolute;
          top: 15.552rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(2) {
          animation: fadeIn 1000ms 900ms both;
          height: 1.536rem;
          left: 0;
          position: absolute;
          top: 13.056rem;
           4.448rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.448rem;
          }
        }
        .page1-group:nth-child(3) {
          animation: fadeIn 1000ms 1600ms both;
          height: 1.536rem;
          left: 4.576rem;
          position: absolute;
          top: 9.376rem;
           4.448rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.448rem;
          }
        }
        .page1-group:nth-child(4) {
          animation: fadeIn 1000ms 1100ms both;
          height: 1.536rem;
          left: 11.488rem;
          position: absolute;
          top: 10.496rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(5) {
          animation: fadeIn 1000ms 1000ms both;
          height: 1.536rem;
          left: 0.16rem;
          position: absolute;
          top: 2.656rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(6) {
          animation: fadeIn 1000ms 1300ms both;
          height: 1.536rem;
          left: 13.28rem;
          position: absolute;
          top: 2.656rem;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
        .page1-group:nth-child(7) {
          animation: fadeIn 1000ms 1700ms both;
          height: 1.536rem;
          left: 10.912rem;
          position: absolute;
          top: 0;
           4.48rem;
          .page1-img {
            height: 1.536rem;
            left: 0;
            position: absolute;
            top: 0;
             4.48rem;
          }
        }
      }
      .page1-click-voice {
        animation: fadeIn 1000ms 1900ms both;
        height: 1.536rem;
        left: 3.296rem;
        position: absolute;
        top: 20.704rem;
         11.68rem;
      }
      .page1-click-handle {
        animation: fadeIn 1000ms 1900ms both;
        height: 1.088rem;
        left: 4.096rem;
        position: absolute;
        top: 20.832rem;
         0.672rem;
        img {
          -webkit-animation: twinkling 0.6s infinite ease-in-out;
          animation: twinkling 0.6s infinite ease-in-out;
        }
      }
      .page1-img-content:nth-child(2) {
        animation: fadeInUp 1000ms 2200ms both;
        bottom: 1.528rem;
        height: 2.912rem;
        left: 4.032rem;
        position: absolute;
         16.896rem;
      }
      .page1-img-content:nth-child(3) {
        animation: fadeInRight 1000ms 100ms both;
        height: 4.8rem;
        left: 12rem;
        position: absolute;
        top: 2.528rem;
         5.088rem;
      }
      .page1-img-content:nth-child(4) {
        animation: fadeInLeft 1000ms 100ms both;
        height: 4.8rem;
        left: 6.912rem;
        position: absolute;
        top: 2.528rem;
         5.056rem;
      }
    }
    </style>
    

    不同的代码实现不同的功能,挺有意思的

  • 相关阅读:
    VBA 声明 Option Explicit,让代码更规范
    VBA 声明 Option Explicit,让代码更规范
    VBA 静态变量 全局变量
    VBA 静态变量 全局变量
    VBA 设置单元格格式
    VBA 设置单元格格式
    正则表达式捕获性分组,非捕获性分组,前瞻,后瞻
    正则表达式捕获性分组,非捕获性分组,前瞻,后瞻
    vba 清除本sheet所有单元格内容和清除所有sheet中所有单元格
    vba 清除本sheet所有单元格内容和清除所有sheet中所有单元格
  • 原文地址:https://www.cnblogs.com/smart-girl/p/12870712.html
Copyright © 2011-2022 走看看