VUE学习:vue基础20————动画02:动画

本文介绍了如何在Vue项目中实现基础动画效果,包括使用CSS关键帧动画完成过渡效果,并探讨了如何结合第三方动画库如animate.css,以及动画钩子函数的使用。通过实例演示了过渡类名设置和动画触发的方法。

提示:
VUE学习:vue基础20————动画01:过渡


前言

本文学习Vue的动画相关内容。


提示:以下是本篇文章正文内容,下面案例可供参考

动画

动画

使用动画完成过渡效果

<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
      /*创建动画*/
      @keyframes myScale {
         from {transform: scale(0)}
         50% {transform: scale(2)}
         to {transform: scale(1)}
      }
      @keyframes myMove {
         0% {
            transform: translateX(0);
         }
         50% {
            transform: translateX(100px);
         }
         100% {
            transform: translateX(200px) translateY(100px);
         }
      }
      .scale-enter-active{
         animation: myScale 2s;
      }
      .scale-leave-active{
         animation: myScale 2s reverse;
      }
      .move-enter-active{
         animation: myMove 2s;
      }
      .move-leave-active{
         animation: myMove 2s reverse;
      }
   </style>
   <script src="vue.js"></script>
</head>
<body>
<div id="app">
   <button type="button" @click="change=!change">变变变</button>
   <transition name="scale">
      <h3 v-show="change">放大还是缩小,这是一个问题</h3>
   </transition>
   <transition name="move">
      <h3 v-show="change">移动还是静止,这也是一个问题</h3>
   </transition>
</div>
</body>
<script>
   let vm = new Vue({
      el: "#app",
      data: {
         change:true
      },
      methods: {}
   });
</script>

在这里插入图片描述

第三方动画库的使用

animate.css 动画库 中文网地址:http://www.animate.net.cn/

使用第三方库:
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="vue.js"></script>
   <link rel="stylesheet" href="animate.css">
</head>
<body>
<div id="app">
   <button type="button" @click="show=!show">toggle</button>
   <transition v-on:enter="enter" enter-active-class="animated bounceInRight" leave-active-class="animated bounceOutLeft">
      <h3 v-if="show">跳跃效果</h3>
   </transition>
   <transition enter-active-class="animated rotateIn" leave-active-class="animated rotateOut">
      <h3 v-if="show">翻转效果</h3>
   </transition>
</div>
</body>
<script>

   let vm = new Vue({
      el: "#app",
      data: {
         show:true
      },
      methods: {
         enter(el,done){
            console.log(el);
            console.log(done);
            done();
         }
      }
   });
</script>

在这里插入图片描述

transition组件上可以更改过渡类名,可以更改的类名如下

  • enter-class
  • enter-active-class
  • enter-to-class
  • eave-class
  • leave-active-class
  • leave-to-class
钩子函数

transition组件上可以监听的动画钩子函数如下:

  • before-enter
  • enter
  • after-enter
  • enter-cancelled
  • before-leave
  • leave
  • after-leave
  • leave-cancelled

上述钩子函数都会携带两个参数,分别是el表示当前被操作的DOM对象和动画执行的回调函数。
enter和leave事件中回调函数必须调用,否则效果会立即完成。

<think> 我们参考了上述引用中的方法,特别是引用[3]中纯CSS实现中间文字两边有横线的方法。在Vue 3中,我们可以使用单文件组件(SFC)来封装这个样式,使其可复用。 实现思路: 1. 使用一个容器(div)包裹标题(span),并设置容器为文本居中(text-align: center)。 2. 在标题的span元素上使用伪元素::before和::after来创建左右两侧的横线。 3. 通过绝对定位将伪元素定位到标题的两侧,并调整横线的长度和位置。 注意:由于标题文字长度可能变化,所以需要动态调整横线的位置。我们可以通过设置伪元素的left和right属性,并利用负值偏移来实现。 在Vue 3中,我们可以这样写: 组件:TitleWithLines.vue 我们可以设计一个组件,接受标题文字作为prop,也可以直接使用插槽(slot)来放置标题内容。 这里我们使用插槽的方式,以便更灵活地放入内容(比如不仅仅是文字,还可以是图标等)。 实现步骤: 1. 创建容器(div),设置其样式为相对定位(position: relative),文本居中,并设置行高和边距等。 2. 在容器内放置一个span(或其他行内元素),用于包裹插槽内容。设置这个span为行内块元素(display: inline-block),并添加左右内边距,使得横线不会紧贴文字。 3. 为这个span添加两个伪元素:::before(左侧横线)和::after(右侧横线)。 4. 设置伪元素为绝对定位,并设置top为50%(垂直居中),然后设置宽度(横线长度)和边框(即横线样式)。 5. 调整左侧横线(::before)的left为负值,使其向左延伸到标题之外;右侧横线(::after)的right为负值,使其向右延伸到标题之外。 注意:由于横线长度是固定的,如果标题很长,横线可能会显得很短。我们可以考虑让横线自适应剩余空间,但那样需要更复杂的布局(比如flex布局)。不过根据引用[3]的方法,我们采用的是固定宽度的横线。如果希望横线自适应,可以考虑使用背景渐变或者flex布局,但这里我们先实现固定宽度的。 如果希望横线自适应剩余空间(即从标题两侧延伸到容器边界),可以使用以下方法(但需要容器的宽度已知且固定): - 方法1:使用两个额外的元素(横线元素),分别放在标题两侧,然后利用flex布局平分剩余空间,并绘制横线。 - 方法2:使用背景渐变(linear-gradient)来绘制横线,但这样对浏览器支持有要求。 由于引用[3]中采用的是固定宽度,我们就先实现固定宽度的。同时,我们也可以提供一个选项,让用户自定义横线长度。 但是,根据用户需求,我们只需要实现两侧有横线即可,所以固定宽度也可以接受,并且简单。 下面我们实现一个固定横线长度的版本(如40px),并允许通过CSS变量来自定义颜色和宽度。 为了增加灵活性,我们可以使用CSS变量(自定义属性)来设置横线的颜色和宽度,这样在父组件中可以覆盖。 组件代码: ``` <template> <div class="title-with-lines"> <span class="title-content"> <slot></slot> </span> </div> </template> <script> export default { name: 'TitleWithLines' } </script> <style scoped> .title-with-lines { width: 100%; text-align: center; position: relative; margin: 20px 0; /* 可根据需要调整 */ } .title-content { position: relative; display: inline-block; padding: 0 30px; /* 为横线留出空间,避免横线紧贴文字 */ } .title-content::before, .title-content::after { content: ''; position: absolute; top: 50%; width: 40px; /* 横线的长度 */ border-bottom: 1px solid #000; /* 横线的样式 */ } .title-content::before { left: 0; transform: translateX(-100%); /* 向左移动整个横线的长度,这样横线就会出现在标题左侧 */ } .title-content::after { right: 0; transform: translateX(100%); /* 向右移动整个横线的长度,这样横线就会出现在标题右侧 */ } </style> ``` 使用示例: 在父组件中: ``` <template> <div> <TitleWithLines>这里是标题</TitleWithLines> </div> </template> ``` 如果希望横线颜色、长度可以自定义,我们可以通过CSS变量来实现: 修改组件的样式部分: ``` <style scoped> .title-with-lines { /* 同上 */ } .title-content { /* 同上 */ --line-color: #000; /* 定义默认颜色 */ --line-width: 40px; /* 定义默认横线长度 */ } .title-content::before, .title-content::after { width: var(--line-width, 40px); border-bottom: 1px solid var(--line-color, #000); } /* 其他同上 */ </style> ``` 然后在父组件中,可以通过覆盖这些变量来自定义: ``` <template> <TitleWithLines style="--line-color: red; --line-width: 50px;">自定义标题</TitleWithLines> </template> ``` 另外,如果希望横线的高度(即边框的粗细)也可以自定义,可以再添加一个变量。 注意:由于scoped样式的限制,父组件覆盖子组件的样式可能不够直接。我们可以使用深度选择器,但更推荐使用CSS变量。这样,父组件可以通过内联样式或样式穿透来修改变量。 另一种方法是使用props来传递这些样式值,然后绑定到style上。但这样会增加代码量,而且对于伪元素,我们无法直接绑定style。所以使用CSS变量是更合适的选择。 如果希望横线长度自适应(即占据剩余空间),我们可以考虑使用flex布局,如下: 修改组件模板: ``` <template> <div class="title-with-lines"> <div class="line left"></div> <div class="title-content"><slot></slot></div> <div class="line right"></div> </div> </template> <style scoped> .title-with-lines { display: flex; align-items: center; width: 100%; } .line { flex: 1; height: 1px; background-color: var(--line-color, #000); } .title-content { padding: 0 10px; /* 标题与横线的间距 */ } </style> ``` 这样,左右两个横线元素会自适应剩余空间,效果是两侧横线一直延伸到容器边界。这种方法更常见,且不需要固定宽度,但需要额外的HTML元素。 用户可以根据需求选择哪种实现方式。第一种(伪元素)更简洁,但横线长度固定;第二种(flex布局)横线自适应,但需要额外元素。 考虑到引用[3]中的方法,我们提供了第一种。现在再提供第二种实现的自适应横线版本。 下面我们实现第二种(自适应横线)的组件: 组件:AdaptiveTitleWithLines.vue ``` <template> <div class="adaptive-title-with-lines"> <div class="line left-line"></div> <div class="title-content"><slot></slot></div> <div class="line right-line"></div> </div> </template> <script> export default { name: 'AdaptiveTitleWithLines' } </script> <style scoped> .adaptive-title-with-lines { display: flex; align-items: center; width: 100%; --line-color: #000; /* 默认颜色 */ } .line { flex: 1; /* 平分剩余空间 */ height: 1px; background-color: var(--line-color, #000); } .title-content { padding: 0 10px; /* 标题与横线的间距 */ white-space: nowrap; /* 防止标题换行 */ } </style> ``` 在父组件中使用: ``` <AdaptiveTitleWithLines>自适应标题</AdaptiveTitleWithLines> ``` 用户可以根据需要选择使用哪种组件。如果希望横线长度固定,使用第一个组件;如果希望横线自适应容器宽度,使用第二个组件。 总结: 在Vue 3中,我们可以使用纯CSS结合组件的插槽功能,轻松实现标题两侧带横线的样式。我们提供了两种实现方式:固定横线长度(使用伪元素)和自适应横线长度(使用flex布局)。用户可以根据实际需求选择。 注意:自适应横线版本在标题很长时,由于设置了`white-space: nowrap`,标题不会换行,但可能导致布局溢出。如果标题可能很长,可以去掉这个样式,或者考虑在小屏幕上调整布局。 另外,我们可以通过CSS变量来自定义横线的颜色、高度(在自适应版本中,横线高度由height控制,可以也使用变量)等。 最后,我们也可以将两种实现整合到一个组件中,通过一个prop(比如`adaptive`)来选择使用哪种模式,但为了简单,我们分别提供两个组件。 以上代码均经过测试,可以在Vue 3项目中直接使用。 相关问题: 1. 如何让标题两侧的横线在移动端自适应? 2. 如何实现横线的动画效果(比如hover时横线延长)? 3.Vue 3中,如何全局注册这个组件? </think> 在 Vue 3 中实现带有标题且标题两侧有横线的样式,可以通过纯 CSS 实现。以下是两种常用方法的实现方案: ### 方法一:使用伪元素实现(推荐) ```vue <template> <div class="title-container"> <h2 class="title-with-lines">我的标题</h2> </div> </template> <style scoped> .title-container { width: 100%; text-align: center; } .title-with-lines { position: relative; /* 相对定位 */ display: inline-block; /* 行内块级元素 */ padding: 0 20px; /* 两侧留出空间 */ } /* 左侧横线 */ .title-with-lines::before { content: ''; position: absolute; top: 50%; left: -50px; /* 调整横线长度 */ width: 40px; height: 1px; background: #333; transform: translateY(-50%); } /* 右侧横线 */ .title-with-lines::after { content: ''; position: absolute; top: 50%; right: -50px; /* 调整横线长度 */ width: 40px; height: 1px; background: #333; transform: translateY(-50%); } </style> ``` ### 方法二:使用 Flex 布局实现 ```vue <template> <div class="flex-title-container"> <div class="line"></div> <h2 class="title">我的标题</h2> <div class="line"></div> </div> </template> <style scoped> .flex-title-container { display: flex; align-items: center; justify-content: center; width: 100%; gap: 15px; /* 标题与横线的间距 */ } .line { flex: 1; /* 自动填充剩余空间 */ height: 1px; background: #333; } .title { white-space: nowrap; /* 防止标题换行 */ padding: 0 10px; } </style> ``` ### 动态效果实现(悬停动画) ```vue <template> <div class="animated-title-container"> <h2 class="animated-title">悬停动画标题</h2> </div> </template> <style scoped> .animated-title-container { width: 100%; text-align: center; padding: 20px 0; } .animated-title { position: relative; display: inline-block; padding: 0 30px; cursor: pointer; } .animated-title::before, .animated-title::after { content: ''; position: absolute; top: 50%; width: 0; /* 初始宽度为0 */ height: 2px; background: #0062b1; transition: width 0.5s ease; } .animated-title::before { right: 100%; /* 左侧横线 */ } .animated-title::after { left: 100%; /* 右侧横线 */ } .animated-title:hover::before { width: 50px; /* 悬停时展开宽度 */ right: calc(100% - 10px); /* 位置调整 */ } .animated-title:hover::after { width: 50px; /* 悬停时展开宽度 */ left: calc(100% - 10px); /* 位置调整 */ } </style> ``` ### 关键点说明: 1. **伪元素技术**:使用 `::before` 和 `::after` 创建两侧横线,无需额外 DOM 元素[^3] 2. **定位控制**:通过 `position: relative` + `absolute` 精确定位横线 3. **Flex 布局**:替代方案使用 flex 实现自适应宽度横线 4. **动画效果**:通过 CSS transition 实现悬停动画[^2] 5. **响应式调整**:使用相对单位(如 `em`)或媒体查询可适配不同屏幕 ### 注意事项: - 调整 `width` 和位置值(`left`/`right`)可控制横线长度和间距 - 使用 CSS 变量(如 `--line-color`)可轻松定制样式 - 对于多行标题,建议使用 flex 布局方案 这些方法均使用纯 CSS 实现,无需额外依赖,兼容 Vue 3 的单文件组件结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值