微信小程序Skyline搜索框吸顶到navtab胶囊位置,丝滑Q弹动画

news2024/11/18 22:57:57

进入下面小程序可以体验效果

基于官方原版demo加入了回弹动画

WXML:

<scroll-view
 class="scroll-area"
 type="custom"
 scroll-y
 show-scrollbar="{{false}}"
 worklet:onscrollend="handleScrollEnd"
 worklet:onscrollupdate="handleScrollUpdate"
>
  <view class="fake-nav-bar" />
  <sticky-section push-pinned-header="{{false}}">
    <sticky-header>
      <view class="search-container">
        <view class="search">
          <view class="search-icon-wrp">
            <image class="search-icon" src="/assets/image/search.png" />
          </view>
          <view class="search-text">搜索</view>
          <view class="search-btn">搜索</view>
        </view>
      </view>
    </sticky-header>
    <view>1211111111111111111111111111111111</view>
    <view>1211111111111111111111111111111111</view>
  </sticky-section>
</scroll-view>

js:


const app = getApp() //这段代码需要放在page页面JS的最顶部
const systemInfo = wx.getSystemInfoSync()

const { shared, Easing,spring ,timing,sequence,delay} = wx.worklet

const lerp = function (begin, end, t) {
  'worklet'
  return begin + (end - begin) * t
}

const clamp = function (cur, lowerBound, upperBound) {
  'worklet'
  if (cur > upperBound) return upperBound
  if (cur < lowerBound) return lowerBound
  return cur
}

Page({

  /**
   * 页面的初始数据
   */
  data: {
      
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.saftPadding = shared(0)
    this.searchBarheight = shared(0)
    this.searchBarWidth = shared(100)
    this.searchBarLeft = shared(0)
    this.navBarOpactiy = shared(1)

    this.isTop = shared(false) //是否触顶了
    this.isBottom = shared(false) //是否触底了
    this.isExc = shared(false) //是否执行动画了
    this.isScrolling = shared(false) //是否正在滑动
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    this.applyAnimatedStyle('.nav-bar', () => {
      'worklet'
      return {
        opacity: this.navBarOpactiy.value
      }
    })

    this.applyAnimatedStyle('.search', () => {
      'worklet'
      return {
        width: `${this.searchBarWidth.value}%`,
        left: `${this.searchBarLeft.value}%`,
        height: `${this.searchBarheight.value}px`
      }
    })

    this.applyAnimatedStyle('.search-container', () => {
      'worklet'
      return {
        backgroundColor: (this.navBarOpactiy.value > 0) ? 'transparent' : '#fff',
        paddingTop: `${this.saftPadding.value}px`
      }
    })

    wx.nextTick(()=>{
        //胶囊顶部位置(安全位置)
        this.saftPadding.value = app.globalData.menu.top
        // //胶囊高度
        this.searchBarheight.value = app.globalData.menu.height
    })
  },
  handleScrollUpdate(evt) {
    'worklet'
    const maxDistance = 60
    const scrollTop = clamp(evt.detail.scrollTop, 0, maxDistance)
    const progress = scrollTop / maxDistance
    const EasingFn = Easing.cubicBezier(0.4, 0.0, 0.2, 1.0)
    this.searchBarLeft.value = lerp(0, 25, EasingFn(progress))
    this.navBarOpactiy.value = lerp(1, 0, progress)
    const t1= lerp(100, 45, EasingFn(progress))
    if(t1>45&&t1<100){
        this.isScrolling.value=true
    }
    if((t1>45&&t1<100)&&(!this.isExc.value||this.isScrolling.value)){
        this.searchBarWidth.value = t1-1.5
    }
    if(t1===45&&evt.detail.scrollTop>60&&!this.isTop.value){
        //靠顶了
        this.isTop.value=true
        this.isBottom.value=false
        this.searchBarWidth.value = t1-2
        this.searchBarWidth.value = spring(t1)
        this.isExc.value=true
        this.isScrolling.value=false
    }else if(t1===100&&evt.detail.scrollTop<2&&!this.isBottom.value){
        //靠底了
        this.isBottom.value=true
        this.isTop.value=false
        this.searchBarWidth.value = t1-2
        this.searchBarWidth.value = spring(t1)
        this.isExc.value=true
        this.isScrolling.value=false
    }
  },

  handleScrollEnd(evt){
    'worklet'
    this.isScrolling.value=false
    this.isExc.value=false
  },
/**
   * 生命周期函数--监听页面显示
   */
  onShow(){
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

WXSS: 

.fake-nav-bar {
    height: 60px;
  }
  
  .search-container {
    padding: 0 16px 10px 16px;
  }
  .search {
    display: flex;
    flex-direction: row;
    box-sizing: border-box;
    width: 100%;
    height: 40px;
    border-radius: 20px;
    border: 2px solid #07c160;
    position: relative;
    align-items: center;
    background-color: #fff;
  }
  
  .search-text {
    color: #8f8888;
    font-size: 14px;
  }
  
  .search-icon-wrp {
    display: flex;
    width: 30px;
    height: 100%;
    flex-direction: row;
    align-items: center;
    justify-content: center;
  }
  
  .search-icon {
    width: 16px;
    height: 16px;
  }
  
  .search-btn {
    position: absolute;
    right: 0;
    width: 60px;
    height: 100%;
    border-radius: 20px;
    background-color: #07c160;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #FFF;
    font-size: 16px;
    /* font-weight: bold; */
  }
  
  .nav-bar {
    background-color: #fff;
    position: absolute;
  }
  
  .nav-left {
    display: flex;
    flex-direction: row;
    align-items: center;
  }
  
  .nav-logo {
    width: 40px;
    height: 40px;
    border-radius: 50%;
  }
  
  .nav-title {
    margin-left: 2px;
    font-size: 20px;
    color: #3f3e3e;
    /* font-weight: bold; */
  }
  
  .scroll-area {
    height: 100vh;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1540314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具】cassetteai — 制作音乐就像现在写提示一样简单

Cassette 是一种人工智能驱动的音乐创作工具,使各种技能水平的用户都可以根据自己的特定需求和偏好生成高质量、免版税的音乐曲目。它基于基于潜在扩散 (LDM) 的机器学习模型,可以使用用户提供的文本描述来想象节拍。它具有易于使用的界面,用户可以输入各种参数,例如所需的…

Qt播放音乐代码示例

主界面 点击play按钮播放或暂停音乐&#xff0c;拖动进度条&#xff0c;音乐对应播放。 QWidget window;QPushButton* playButton new QPushButton("Play");// Qt 播放音乐// 创建 QMediaPlayer 对象QMediaPlayer* player new QMediaPlayer;// 指定音频文件的路径…

查立得php+mysql源码通用数据库配置教程

适用范围&#xff1a; 查分吧PHP多条件都输对版已有表万用查询系统 phpMySql已有数据表通用搜索可增删改查 查立得快搜系统(phpMysql) v20220208 查立得万能查&#xff08;phpmysql&#xff09; v20220512 及 各付费版 等几十款源码 数据库配置路径 数…

Redis的String类型为什么重新设计使用了SDS数据结构呢

Redis 选择重新设计其 String 类型的底层数据结构&#xff0c;采用 SDS&#xff08;Simple Dynamic String&#xff09;而不是直接使用 C 语言标准库提供的原生字符串&#xff08;char*&#xff09;的原因主要包括以下几点&#xff1a; O(1) 时间复杂度获取长度&#xff1a; 在…

SpringBoot健康监控

文章目录 1-SpringBoot2-监控-健康监控服务2-SpringBoot2-监控-Admin可视化 在Spring Boot中&#xff0c;可以通过Actuator模块实现应用程序的健康监控。Actuator是Spring Boot提供的一个用于监控和管理应用程序的模块&#xff0c;可以轻松地查看应用程序的运行状况、性能指标和…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP&#xff1a;31940 部署k8集群…

创建vue3项目并集成cesium插件运行

创建vue3项目并集成cesium插件 一、vue项目创建 1、前期准备 node.js&npm或yarn 本地开发环境已经安装好。 参考安装 2、安装vue-cli&#xff0c;要求3以上版本 #先查看是否已经安装 vue -V#安装 npm install -g vue/cli4.5.17 示例&#xff1a;Idea工具 页面 Termin…

【物联网开源平台】tingsboard二次开发环境搭建+编译

文章目录 一&#xff0c;需要准备的环境二&#xff0c;获取tingsboard源码1.git拉取源码2.下载源码压缩包 三.新建仓库存放依赖文件四&#xff0c;编译五&#xff0c;遇到的错误 提示&#xff1a; 1.这篇只要准备两个环境&#xff0c;方法更简单&#xff01; 2.基于tingsboard …

CSS3新属性(学习笔记)

一、. 圆角 border-radius:; 可以取1-4个值&#xff08;规则同margin&#xff09; 可以取px和% 一般用像素&#xff0c;画圆的时候用百分比&#xff1a;border-radius:50%; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

Linux环境下使用Eclipse Paho C 实现(MQTT Client)同步模式发布和订阅Message

目录 概述 1 同步模式和异步模式 1.1 同步模式 1.2 异步模式 2 下载和安装paho.mqtt.c 3 同步方式发布和订阅消息功能实现 3.1 MQTT Client参数配置 3.2 初始化MQTT Client 3.3 发布消息功能 3.4 订阅消息功能 3.5 解析订阅的信息 4 编译和测试 4.1 编译代码 4.2…

InstructGPT的流程介绍

1. Step1&#xff1a;SFT&#xff0c;Supervised Fine-Tuning&#xff0c;有监督微调。顾名思义&#xff0c;它是在有监督&#xff08;有标注&#xff09;数据上微调训练得到的。这里的监督数据其实就是输入Prompt&#xff0c;输出相应的回复&#xff0c;只不过这里的回复是人工…

ctfshow-web入门-反序列化

web254 先看题 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com*/error_reporting(0); highlight_file(__FIL…

详细解读开源版Sora视频生成模型

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;OpenAI的视频生成模型Sora一经发布就广受全世界的瞩目&#xff0c;上海人工智能实验室最近推出了一个基于Diffusion Transformer的结构的模型Latte&#xff0c;堪称最接近Sora原理的视频生成模型。这篇博客…

神级工具之git (一): git 基操

一切都从&#xff1a;Git User Manual开始&#xff0c;或者中文版的Git中文手册 核心概念 工作区 工作区我们可见的&#xff0c;可以进行修改的目录树。我们可以在目录树中进行文件的查看&#xff0c;修改。通常我们会使用一个神级编辑器Vim。我给她取了个名字&#xff0c;就…

综合知识篇19-软件知识产权保护考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

CSK6 接入聆思平台(LSPlatform)

一、开发环境 硬件&#xff1a;视觉语音大模型AI开发套件 二、使用大语言模型 官方指导文档&#xff1a; 开始使用 | 聆思文档中心 获取API密钥 | 聆思文档中心 1、注册 提交申请之后需要将注册电话号码通过微信发送给聆思科技工作人员&#xff0c;工作人员授权后&#xff…

使用 chezmoi vscode, 管理你的 dotfiles

什么是 dotfiles In Unix-like operating systems, any file or folder that starts with a dot character (for example, /home/user/.config), commonly called a dot file or dotfile. 任何以 . 开头去命名的文件或者目录都可以称为 dotfile, 在 Unix-like 系统一般用的比较…

JavaEE-文件操作和IO

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念&#xff0c;就类似办公桌上的⼀份份真…

工作中常用到的Linux命令

系统&#xff0c;用户信息操作相关命令 查看主机ip地址 ifconfig 获取用户信息 id 修改用户密码 passwd 查看链接用户 who 创建新用户账号 useradd 删除用户账号 userdel 修改用户账号的属性 usermod 查看系统发行版本 cat /proc/version 说明适用于所有版本。…