马上又是新的一年,简单许个愿

前言

最近在手机上看见一个许愿的页面,用户留言的许愿信息一个个从页面底部向上移出页面顶部,底部有个输入框可以输入愿望,点击发送就显示到页面中。感觉挺好玩的,因此来实现一个类似的效果。

页面布局

手机上的许愿页面和每条许愿信息都有背景,搭配的很好看。没有设计才华的人只能从网上找一些比较顺眼的搭配一下了。因此从一个设计网站(Canva)找了一张过年氛围的红色背景图,4个书签当做许愿信息的背景。

页面主要包含两个部分,一个是用来显示许愿信息,另一个是输入愿望。

  1. 页面设置最大宽度为750px, 高度为100vh,并设置背景图。

  2. 许愿信息使用js动态创建li元素,添加到页面

  3. 输入愿望模块使用固定定位展示在页面底部

html 复制代码
<div class="container">
    <ul class="wish-container"></ul>

    <div class="send-box">
      <input id="send-input" type="text" placeholder="请输入许愿内容(15字以内)">
      <button id="send-btn">发送</button>
    </div>
  </div>

具体实现

  1. 在css中定义从下到上移动的动画效果

这里定义了两种动画效果,都是从页面底部移动到顶部,其中一种加上了逐渐变小的效果,同时改变translateZ()属性的值 (translateZ用于 3D 空间的 z 轴方向移动元素,实现元素在自己的眼前或近或远)。

ps: 手机上的许愿动画效果3d的感觉更明显,许愿信息在最上面看起来比较大,下面的小一些,不知道是怎么实现的

css 复制代码
 @keyframes up {
      0% {
        top: 100vh;
        transform: translateY(0);
      }

      100% {
        top: 0;
        transform: translateY(-100vh);
      }
    }

    @keyframes bottomup {
      0% {
        top: 100vh;
        transform: translateY(0) translateZ(400);
      }
      50% {
        top: 50vh;
        transform: translateY(-50vh) translateZ(200)  scale(.7);
      }
      100% {
        top: 0;
        transform: translateY(-100vh) translateZ(0)  scale(.5);
      }
    }
  1. 定义数组data和wishBg,data用于模拟数据,存储用户的许愿信息;wishBg用来存储许愿信息的背景。

  2. 创建愿望元素的方法createElement()

    a. 在其中创建li愿望元素,给其添加wishBg数组中随机一个背景图,并在其中创建span标签,加上许愿文字。

    b. li元素一开始不显示,当动画开始才让其显示;根据屏幕宽度设置left的值

    c. 定义一个变量count,来决定使用哪种动画效果。当count为偶数时就给元素加上bottomup动画,为奇数就加上另一种动画

    d.给动画设置随机持续时间和延迟时间

js 复制代码
function createElement(value) {
      let wish = document.createElement('li')
      let randomNum = Math.floor(randomFloat(0, 4))
      wish.style.backgroundImage = `url(${wishBg[randomNum]})`
      wish.innerHTML = `<span>${value}</span>`
      
      wish.style.opacity = 0
      wish.addEventListener('animationstart', function () {
        wish.style.opacity = 1
      })
      // 获取屏幕当前的宽度
      const screenWidth = window.innerWidth
      //元素距页面左侧的距离
      wish.style.left = Math.floor(randomFloat(10, screenWidth - 60)) + 'px'
      // 给生成元素添加动画
      if(count % 2 === 0){
        wish.style.animationName = 'bottomup'
      }else{
        wish.style.animationName = 'up'
      }
      // 随机设置动画时间
      const fadeAndDropDuration = randomFloat(10, 15) + 's' 
      const leafDelay = randomFloat(0, 4) + 's'
      wish.style.animationDelay = leafDelay
      wish.style.animationDuration = fadeAndDropDuration
      count++
      return wish
    }
  1. 创建初始化数据的方法initWish()

页面初始化的时候,将data数据展示到页面中

  1. 发送按钮添加点击事件

当输入的值不为空并且长度小于15,就执行创建元素的方法,并将元素添加到页面中

效果展示

相关推荐
码爸21 分钟前
flink doris批量sink
java·前端·flink
深情废杨杨22 分钟前
前端vue-父传子
前端·javascript·vue.js
J不A秃V头A1 小时前
Vue3:编写一个插件(进阶)
前端·vue.js
司篂篂2 小时前
axios二次封装
前端·javascript·vue.js
姚*鸿的博客2 小时前
pinia在vue3中的使用
前端·javascript·vue.js
宇文仲竹3 小时前
edge 插件 iframe 读取
前端·edge
Kika写代码3 小时前
【基于轻量型架构的WEB开发】【章节作业】
前端·oracle·架构
天下无贼!4 小时前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr4 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林4 小时前
npm发布插件超级简单版
前端·npm·node.js