vue实现抖音时间转盘

博主分享用Vue实现抖音时间转盘,代码仅160行。指出看似复杂的圆形部分,用简单的CSS3通过rotate修改计算即可展示,最后还贴出了代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

做了一个抖音时间转盘 还挺简单的 可能我做的很粗糙 

用vue做的 才160行代码。。。。

其实很简单 只是大部分人被这个圆给迷惑了

这个圆就是用简单css3就能做 通过rotate来修改计算就能展示出来了。。。。

然后贴代码。。。

<template>
  <div class="main">
    <div class="timeBox">
      <div class="yearBox box">{{year}}</div>
      <div class="dayBox box" :style="'transform: rotate('+(360/day.length)*curDay+'deg)'">
        <ul class="container">
          <li
            v-for="(v,i) in day"
            :key="i"
            :style="'transform: rotate('+(-360/day.length) * (i+1) +'deg);transform-origin: -100% 50% 0px;margin-left:150px;margin-top:90px'"
          >{{v}}</li>
        </ul>
      </div>
      <div class="hourBox box" :style="'transform: rotate('+(-360/hour.length)*curHour+'deg)'">
        <ul class="container">
          <li
            v-for="(v,i) in hour"
            :key="i"
            :style="'transform: rotate('+(360/hour.length)*i+'deg);transform-origin: -200% 50% 0px;margin-left:300px;margin-top:190px'"
          >{{v}}</li>
        </ul>
      </div>
      <div class="minutesBox box" :style="'transform: rotate('+(-360/minutes.length)*curMin+'deg)'">
        <ul class="container">
          <li
            v-for="(v,i) in minutes"
            :key="i"
            :style="'transform: rotate('+(360/minutes.length)*i+'deg);transform-origin: -300% 50% 0px;margin-left:450px;margin-top:290px'"
          >{{v}}</li>
        </ul>
      </div>
       <div class="secondBox" :style="'transform: rotate('+(-360/seconds.length)*curSec+'deg)'">
        <ul class="container">
          <li
            v-for="(v,i) in seconds"
            :key="i"
            :style="'transform: rotate('+(360/seconds.length)*i+'deg);transform-origin: -400% 50% 0px;margin-left:600px;margin-top:390px'"
          >{{v}}</li>
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data: function () {
    return {
      data: ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾', '佰', '仟', '万'],
      hour: [],
      curHour: 0,
      day: [],
      curDay: 0,
      minutes: [],
      curMin: 0,
      seconds: [],
      curSec: 0,
      year: ''
    }
  },
  created () {
    this.dealData()
    this.seconds = JSON.parse(JSON.stringify(this.minutes))
    var sky = ['', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚']
    var land = ['', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申']
    var one = new Date().getFullYear() % 10
    var two = new Date().getFullYear() % 12
    this.year = sky[one] + land[two]
    setInterval(() => {
      this.getTime()
    }, 1000)
  },
  methods: {
    dealData () { // 生成数据
      // 星期
      for (let i = 0; i < 7; i++) {
        this.day.push('星期' + this.data[i + 1])
      }
      // 小时
      for (let i = 0; i < 24; i++) {
        if (i < 11) {
          this.hour.push(this.data[i])
        } else {
          this.hour.push((parseInt(i / 10) > 1 ? this.data[parseInt(i / 10)] : '') + '拾' + (parseInt(i % 10) !== 0 ? this.data[i % 10] : ''))
        }
      }
      // 分钟
      for (let i = 0; i < 60; i++) {
        if (i < 11) {
          this.minutes.push(this.data[i])
        } else {
          this.minutes.push((parseInt(i / 10) > 1 ? this.data[parseInt(i / 10)] : '') + '拾' + (parseInt(i % 10) !== 0 ? this.data[i % 10] : ''))
        }
      }
    },
    getTime () { // 获取时间
      var now = new Date()
      this.curSec = now.getSeconds()
      this.curDay = now.getDay()
      this.curMin = now.getMinutes()
      this.curHour = now.getHours()
    }
  }
}
</script>
<style lang="scss" scoped>
.box{
  position: absolute;
  transition: 1s;
}
.main{
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background: #ccc;
}
.yearBox{
  top: 50%;
  left: 50%;
  height: 40px;
  width: 40px;
  margin-top: -20px;
  margin-left: -20px;
  line-height: 40px;
  text-align: center;
  font-size: 18px;
}
.timeBox{
  width: 800px;
  height: 800px;
  margin: 0 auto;
  position: relative;
}
.dayBox {
  width: 200px;
  height: 200px;
  top: 300px;
  left: 300px;
}
.hourBox {
  width: 400px;
  height: 400px;
  top: 200px;
  left: 200px;
}
.minutesBox {
  width: 600px;
  height: 600px;
  top: 100px;
  left: 100px;
}
.secondBox {
  width: 800px;
  height: 800px;
  top: 0;
  left: 0;
  position: absolute;
}
.container {
    overflow:auto;
    li {
      width: 50px;
      height: 20px;
      font-size: 12px;
      position: absolute;
    }
  }
</style>

 

### 回答1: 基于Vue打造WebApp,实现滑屏效果可以通过以下步骤来实现。 首先,我们需要引入Vue及其相关组件和插件,如Vuex、Vue Router等,以便搭建基本的开发环境。 接着,我们需要准备数据,包括视频列表、用户信息等。可以通过API接口或者本地模拟数据进行获取。 然后,我们可以使用Vue Router来搭建页面路由。根据的设计,通常会有首页、个人页面、消息页面等。我们可以创建对应的组件,并设置相应的路由导航。 接下来,我们可以使用Vuex来管理全局状态。的滑屏效果通常涉及到视频的播放状态、用户的点赞、关注等操作。使用Vuex可以方便地统一管理这些状态,并实现不同组件间的通信。 然后,我们可以使用Vue的动画机制来实现滑屏效果。通过监听用户的手势事件,可以判断用户的滑动方向和距离,从而实现视频的滑动效果。可以使用Vue提供的transition组件来实现过渡效果,使滑动更加平滑自然。 最后,根据的设计,我们还可以添加一些额外的功能,如视频的点赞、评论,用户之间的关注等。可以通过与后端的交互来实现这些功能,并更新页面的数据。 综上所述,基于Vue打造WebApp,实现滑屏效果需要引入Vue及其相关组件和插件,准备数据,搭建页面路由,使用Vuex管理全局状态,利用Vue的动画机制实现滑屏效果,并根据的设计添加额外的功能。 ### 回答2: 是一款非常流行的短视频APP,其具有独特而吸引人的滑屏效果。在基于Vue框架打造WebApp时,我们可以通过使用一些已有的插件和组件来实现滑屏效果。 首先,我们可以使用Vuevue-awesome-swiper插件来实现滑屏效果。该插件是一个基于Swiper的Vue组件,可以实现多种滑动效果。我们可以将它引入项目中,并根据需求进行配置,例如设置滑动方向、轮播间隔时间、是否自动轮播等。 其次,为了模拟的滑屏效果,我们可以使用Vue的过渡动画效果来实现滑动时的平滑过渡效果。可以在滑动过程中使用transition组件,并设置过渡效果的名称、持续时间等参数,实现滑动时的流畅过渡效果。 另外,为了更加贴近的滑屏效果,我们还可以添加一些交互和动画效果。例如,在滑动到某个视频时,可以添加缩放或旋转动画效果,以增加视觉效果和用户体验。 总结来说,基于Vue打造WebApp实现滑屏效果,我们可以使用vue-awesome-swiper插件来实现基本的滑动功能,结合Vue的过渡动画效果来实现平滑过渡效果,同时通过添加交互和动画效果来增加视觉效果和用户体验。这样就可以实现一个基于VueWebApp,并能够呈现独特而吸引人的滑屏效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值