我正在寻找数字滚动动画的参考,并遇到了以下代码(使用SCSS,所以不会在浏览器中运行):

new Vue({
  el: ".app",
  data: {
    number: 0
  },
  methods: {
    setNumber(e) {
      this.number = e.target.value;
    }
  },
  computed: {
    numberString() {
      return String(this.number).padStart(this.total, "0");
    }
  },
  created() {
    this.total = 9;
  }
});
* {
  margin: 0;
  padding: 0;
}

$height: 80px;

html {
  height: 100%;
}

body {
  font: 16px/1.5 "Helvetica Neue", Helvetica, arial;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.app {
  margin: auto;
}

.wrap {
  display: flex;
  margin: 0 0 20px;
  color: #fff;
  text-align: center;
  font-size: 40px;
}

.item {
  flex: 0 0 auto;
  margin: 0 10px 0 0;
  box-shadow: 0 0 6px #0b415b;
  position: relative;
  padding: 4px;
  border-radius: 4px;
  overflow: hidden;

  &:before {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: linear-gradient(
      to bottom,
      #239cc8 49.9%,
      #1b6386 50%,
      #1b6386 100%
    );
  }

  &:last-child {
    margin: 0;
  }

  &__inner {
    position: relative;
    background: linear-gradient(
      to bottom,
      #3fb9d9 49.9%,
      #3596ae 50%,
      #3596ae 100%
    );
    width: 50px;
    overflow: hidden;
  }

  &__digit {
    transition: 0.3s transform;
    line-height: $height;
    height: $height;

    &-list {
      &:before {
        display: block;
        $content: "";
        @for $i from 0 through 9 {
          $content: #{$content}#{$i}#{"\A"}#{" "};
        }
        content: "#{$content}";
      }
    }
  }
}

.range {
  width: 100%;
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.8/vue.global.min.js"></script>
<div class="app">
  <div class="wrap">
    <div class="item" v-for="i in total" :key="i">
      <div class="item__inner">
        <div class="item__digit" :style="{
              transform: `translateY(${Number(numberString.charAt(i - 1)) * -100}%)`
            }">
          <div class="item__digit-list"></div>
        </div>
      </div>
    </div>
  </div>
  <input type="range" min="0" value="0" :max="10 ** total - 1" @input="setNumber" class="range" />
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

(原始代码:https://codepen.io/lpjc/pen/MWpMxYa)

我理解Vue和Sass的基本原理,但我真的被两个部分搞糊涂了:

  1. 在绑定样式的这一部分中,"i"从何而来?
<div class="item__digit" :style="{
              transform: `translateY(${Number(numberString.charAt(i - 1)) * -100}%)`}">
  1. SCSS:这个部分是否可以转换为显示更改的数字内容?多么?我知道#{}是用于内插的,而$var是变量.
&-list {
      &:before {
        display: block;
        $content: "";
        @for $i from 0 through 9 {
          $content: #{$content}#{$i}#{"\A"}#{" "};
        }
        content: "#{$content}";
      }
    }
  }
}

我试着搜索官方文件,也谷歌相关的主题,但很难找到相关的信息解释这个具体的情况.

推荐答案

1. The i comes from the Vue for loop.

在Vue模板中,循环和其他逻辑可以用元素属性定义,称为Vue指令.可以使用指令v-for编写for循环.在您问题中的代码中,循环的最外层元素为v-for="i in total".

<div class="item" v-for="i in total" :key="i">
    <div class="item__inner">
        <div class="item__digit" :style="{
            transform: `translateY(${Number(numberString.charAt(i - 1)) * -100}%)`
        }">
            <div class="item__digit-list"></div>
        </div>
    </div>
</div>

现在,在该元素中,可以使用i变量.在常规的JavaScript中,这就像是在编写

for ( const i in total ) {
    // Can use the i variable in here
}

有关v-for指令的更多信息,请参见https://vuejs.org/guide/essentials/list

2.Sass正在创建一份数字列表.

如果设置为https://www.sassmeister.com/,则可以将SCSS呈现为css,以查看它在做什么.您将看到content正在被编译为

content: "0\a  1\a  2\a  3\a  4\a  5\a  6\a  7\a  8\a  9\a  ";

(其中\a是换行符).

在sass中,#{$i}会将$i的值打印到该字符串中.他们没有输入"0\a 1\a 2\a 3\a 4\a 5\a 6\a 7\a 8\a 9\a ",而是 Select 编写一个小小的@for循环来做同样的事情.@for循环从0到9进行计数,并将当前数字附加到字符串.

实际上,这会创建一个包含从0到9的数字的垂直列表的::before元素.该元素的父级隐藏了溢出内容,因此一次只有一个数字可见.

Javascript相关问答推荐

将2D数组转换为图形

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

在网页上添加谷歌亵渎词

JS,当你点击卡片下方的绿色空间,而它是在它的背后转动时,

无法读取未定义错误的属性路径名''

rxjs插入延迟数据

闭包是将值复制到内存的另一个位置吗?

如何使用JavaScript拆分带空格的单词

DOM不自动更新,尽管运行倒计时TS,JS

同一类的所有div';S的模式窗口

元素字符串长度html

邮箱密码重置链接不适用于已部署的React应用程序

一个实体一刀VS每个实体多刀S

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

背景动画让网站摇摇欲坠

使用Reaction窗体挂钩注册日历组件

Pevent触发material 用户界面数据网格中的自动保存

用Reaction-RT-Chart创建实时条形图

select 2-删除js插入的项目将其保留为选项

如何在每隔2分钟刷新OKTA令牌后停止页面刷新