【vue】组件中的文字标题加hover动效

476 阅读1分钟

:D 先放参考文章的地址 :  wow.techbrood.com/fiddle/9635

上完成效果:

说明:用到的事件是 mouseout  和 mouseover。鼠标悬停在目标字符上时,给目标字符和左右字符加不同的class 名,通过不同的类名控制字符的样式。鼠标从字符的上级节点移出时,把同级节点的类名移除掉。

附上完整代码:

<template>
    <div class="dynamic-title" @mouseout="outHover">
      <span
        v-for="(item, index) in this.LETTERS"
        :key="index"
        @mouseover="inhover"
        >{{ item }}</span
      >
    </div>
</template>
<script>
const letters = [
  "新",
  "闻",
  "资",
  "讯",
  "|",
  "关",
  "注",
  "动",
  "态",
  "绽",
  "放",
  "精",
  "彩",
];
export default {
  name: "DynamicTitle",
  created() {
    this.LETTERS = letters;
  },
  methods: {
    inhover(e) {
      if (!e.target) {
        return;
      }
      e.target.classList = ["on"];
      if (e.target.nextElementSibling) {
        e.target.nextElementSibling.classList = ["side"];
        e.target.nextElementSibling.classList = ["side2"];
      }
      if (e.target.previousElementSibling) {
        e.target.previousElementSibling.classList = ["side"];
        e.target.previousElementSibling.classList = ["side2"];
      }
    },
    outHover(e) {
      let doms = e.currentTarget.children;
      for (let i = 0, len = doms.length; i < len; i++) {
        doms[i].classList = [];
      }
    },
  },
};
</script>
<style lang="less" scoped>
.dynamic-title {
  font-size: 36px;
  font-family: PingFang SC;
  color: #231815;
  text-align: center;
  letter-spacing: 2px;
  span {
    display: inline-block;
    cursor: pointer;
    padding: 0 0.2em;
    position: relative;
    -webkit-transition: all 0.15s linear;
    transition: all 0.15s linear;
  }
}
span.on {
  -webkit-transform: scale(2.2);
  -ms-transform: scale(2.2);
  transform: scale(2.2);
  text-shadow: 0 0 1px #fff;
}
span.side {
  -webkit-transform: scale(1.65);
  -ms-transform: scale(1.65);
  transform: scale(1.65);
  text-shadow: 0 0 1px rgba(255, 255, 255, 0.85);
}
span.side2 {
  -webkit-transform: scale(1.35);
  -ms-transform: scale(1.35);
  transform: scale(1.35);
  text-shadow: 0 0 2px rgba(255, 255, 255, 0.7);
}
</style>