UNiAPP地区选择

<template>
  <view class="container">
    <!-- 左侧地区列表 -->
    <scroll-view
      class="left-list"
      scroll-y
      :scroll-into-view="currentLetterId"
      scroll-with-animation
      @scroll="onScroll"
      ref="scrollView"
    >
      <view
        v-for="group in dataList"
        :key="group.letter"
        :id="'letter-' + group.letter"
        class="group"
        :data-letter="group.letter"
      >
        <view class="group-letter">{{ group.letter }}</view>
        <view style="display: flex; gap: 20rpx; padding: 20rpx;">
                    <view v-for="item in group.items" :key="item" class="item">{{ item }}</view>
                </view>
      </view>
    </scroll-view>

    <!-- 右侧字母索引 -->
    <view
      class="right-index"
      @touchstart.prevent="onTouchStart"
      @touchmove.prevent="onTouchMove"
      @touchend.prevent="onTouchEnd"
      ref="indexWrapper"
    >
      <view
        v-for="(letter, index) in letters"
        :key="letter"
        class="letter"
        :class="{ active: letter === activeLetter }"
        :data-index="index"
      >
        {{ letter }}
      </view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),
      dataList: [
        { letter: 'A', items: ['安庆', '鞍山', '安阳'] },
        { letter: 'B', items: ['北京', '保定', '包头'] },
        { letter: 'C', items: ['长沙', '成都', '重庆'] },
        { letter: 'D', items: ['大连', '东莞', '德阳'] },
        { letter: 'F', items: ['福州', '佛山'] },
        { letter: 'G', items: ['广州', '贵阳'] },
        { letter: 'H', items: ['杭州', '合肥', '哈尔滨'] },
        { letter: 'J', items: ['济南', '嘉兴'] },
        { letter: 'K', items: ['昆明'] },
        { letter: 'L', items: ['兰州', '洛阳'] },
        { letter: 'M', items: ['绵阳'] },
        { letter: 'N', items: ['南京', '南昌'] },
        { letter: 'Q', items: ['青岛', '泉州'] },
        { letter: 'S', items: ['上海', '苏州', '深圳'] },
        { letter: 'T', items: ['天津', '唐山'] },
        { letter: 'W', items: ['武汉', '无锡'] },
        { letter: 'X', items: ['厦门', '西安'] },
        { letter: 'Y', items: ['烟台', '宜昌'] },
        { letter: 'Z', items: ['郑州', '珠海'] }
      ],
      currentLetterId: '',
      activeLetter: '',
      indexItemHeight: 0,
      indexTop: 0,
    };
  },
  mounted() {
    // 获取右侧字母索引容器的位置和单个字母高度
    uni.createSelectorQuery()
      .select('.right-index')
      .boundingClientRect(rect => {
                console.log('打印高度')
                console.log(rect)
        this.indexTop = rect.top;
      })
      .exec();
            // 获取每个字母的高度
            this.$nextTick(() => {
                const letterHeights = [];
                this.letters.forEach((letter, index) => {
                    uni.createSelectorQuery()
                        .select(`.right-index .letter:nth-child(${index + 1})`)
                        .boundingClientRect(rect => {
                            letterHeights.push(rect.height);
                            // 当所有字母的高度都获取到后,计算平均高度
                            if (letterHeights.length === this.letters.length) {
                                this.indexItemHeight = letterHeights.reduce((a, b) => a + b, 0) / letterHeights.length;
                                console.log('字母高度')
                                console.log(this.indexItemHeight)
                            }
                        })
                        .exec();
                });
            });
  },
  methods: {
    scrollToLetter(letter) {
      this.currentLetterId = 'letter-' + letter;
      this.activeLetter = letter;
    },
    onTouchStart(e) {
      this.handleTouch(e);
    },
    onTouchMove(e) {
      this.handleTouch(e);
    },
    onTouchEnd() {
      // 触摸结束可以做一些清理操作,如果需要
    },
    handleTouch(e) {
      const touch = e.touches[0];
      const y = touch.clientY;
      // 计算触摸点相对于字母索引顶部的偏移
      let index = Math.floor((y - this.indexTop) / this.indexItemHeight);
      if (index < 0) index = 0;
      if (index >= this.letters.length) index = this.letters.length - 1;
      const letter = this.letters[index];
      if (letter && letter !== this.activeLetter) {
        this.scrollToLetter(letter);
      }
    },
    onScroll(e) {
      // 可选:根据滚动位置动态改变右侧高亮字母
      // 这里可以实现滚动联动右侧字母高亮,稍复杂,可根据需求添加
    }
  }
};
</script>

<style>
.container {
  display: flex;
  height: 100vh;
    background-color: #fff;
}
.left-list {
  flex: 1;
}
.group {
  padding: 20rpx 0;
}
.group-letter {
  font-weight: bold;
  font-size: 36rpx;
  background: #F2F4F5;
  padding: 10rpx 30rpx;
}
.item {
    width: 120rpx;
    height: 42rpx;
    line-height: 42rpx;
    background-color: #F2F4F5;
    text-align: center;
    border-radius: 30rpx;
    font-size: 24rpx;
}
.right-index {
  width: 60rpx;
  background: transparent;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  user-select: none;
  /* 方便触摸 */
  padding: 10rpx 0;
}
.letter {
  font-size: 28rpx;
  color: #666;
  padding: 4rpx 0;
  width: 100%;
  text-align: center;
  cursor: pointer;
}
.letter.active {
  color: #007AFF;
  font-weight: bold;
}
/* 通用隐藏方案 */
::-webkit-scrollbar {
  display: none !important;
  width: 0 !important;
  height: 0 !important;
  -webkit-appearance: none;
  background: transparent;
}

/* 安卓专用优化 */
/* #ifdef APP-PLUS */
scroll-view ::-webkit-scrollbar {
  display: none;
}
/* #endif */
</style>

最后效果,可以根据需要调试

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

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

相关文章

嵌入式硬件篇---CAN

文章目录 前言1. CAN协议基础1.1 物理层特性差分信号线终端电阻通信速率总线拓扑 1.2 帧类型1.3 数据帧格式 2. STM32F103RCT6的CAN硬件配置2.1 硬件连接2.2 CubeMX配置启用CAN1模式波特率引脚分配过滤器配置&#xff08;可选&#xff09; 3. HAL库代码实现3.1 CAN初始化3.2 发…

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候&#xff0c;或者实际做企业级的产品落地的时候&#xff0c;你必…

机器学习 day04

文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习&#xff0c;我掌握了机器学习中的线性回归的相关基本概念&#xff0c;包括损失函数的概念&#xff0c;最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…

img.dims() <= 2 in function ‘cv::matchTemplate报错

Mat src mat_ori;//imread(img_original);Mat src_template imread(img_template);cvtColor(src, src, COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错cvtColor(src_template, src_template,COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错 error: (-215…

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…

exit耗时高

背景&#xff1a;程序退出发现被强制退出&#xff0c;而不是正常的退出。正常退出是发送15信号&#xff0c;而异常退出是发送信号9&#xff0c;强制退出。退出机制是先发送信号15&#xff0c;然后6s内没有退出完成&#xff0c;会发送信号9。通过查看退出流程&#xff0c;是将初…

docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令

docker compose 表示调用 Docker Compose 工具&#xff0c;用于管理基于 YAML 文件定义的多容器应用。 up 核心指令&#xff0c;作用是根据 docker-compose.yml 文件中的配置&#xff0c;创建并启动所有定义的服务、网络、卷等资源。 如果容器未创建&#xff0c;会先构建镜像&…

从辅助到协作:GitHub Copilot的进化之路

如果说现代程序员的标配工具除了VS Code、Stack Overflow之外&#xff0c;还有谁能入选&#xff0c;那一定是GitHub Copilot。从2021年首次亮相&#xff0c;到如今深度集成进开发者日常流程&#xff0c;这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了&#xff0c;而…

局部放大maya的视图HUD文字大小的方法

一、问题描述&#xff1a; 有网友问&#xff1a;有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗&#xff1f; 在 Maya 中&#xff0c;可以通过自定义 HUD&#xff08;Heads-Up Display&#xff09;元素的字体大小来局部放大特…

C++中隐式的类类型转换知识详解和注意事项

一、隐式转换的基本概念 隐式类型转换&#xff08;implicit conversion&#xff09;指编译器在需要时自动在两种类型之间插入转换代码&#xff0c;无需显式调用。对于内置类型&#xff08;如 int 到 double&#xff09;&#xff0c;转换由标准定义&#xff1b;对于用户自定义类…

【C++】18.二叉搜索树

由于map和set的底层是红黑树&#xff0c;同时后面要讲的AVL树(高度平衡二叉搜索树)&#xff0c;为了方便理解&#xff0c;我们先来讲解二叉搜索树&#xff0c;因为红黑树和AVL树都是在二叉搜索树的前提下实现的 在之前的C语言数据结构章节中&#xff0c;我们讲过二叉树&#x…

Leaflet使用SVG创建动态Legend

接前一篇文章&#xff0c;前一篇文章我们使用 SVG 创建了带有动态文字的图标&#xff0c;今天再看看怎样在地图上根据动态图标生成相关的legend&#xff0c;当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码&#xff0c;生成了一个 svg 节点&#xff0c;其中…

Linux基础开发工具二(gcc/g++,自动化构建makefile)

3. 编译器gcc/g 3.1 背景知识 1. 预处理&#xff08;进行宏替换/去注释/条件编译/头文件展开等) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 连接&#xff08;生成可执行文件或库文件) 3.2 gcc编译选项 格式 &#xff1a; gcc …

PostGIS实现栅格数据入库-raster2pgsql

raster2pgsql使用与最佳实践 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于将GDAL支持的栅格格式(如GeoTIFF、JPEG、PNG等)导入PostgreSQL数据库,支持批量加载、分块切片、创建空间索引及金字塔概览,是栅格数据入库的核心工具。 二、核心功能与典型用法 1…

精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈

精益数据分析&#xff08;64/126&#xff09;&#xff1a;移情阶段的用户触达策略——从社交平台到精准访谈 在创业的移情阶段&#xff0c;精准找到目标用户并开展深度访谈是验证需求的关键。今天&#xff0c;我们结合《精益数据分析》中的方法论&#xff0c;探讨如何利用Twit…

ORACLE RAC环境REDO日志量突然增加的分析

服务概述 CRM系统在7/11日出现REDO日志产生量突增&#xff0c;达到平时产生量的20倍以上&#xff0c;对数据同步已经造成了较大的影响。工程师接到故障申报后&#xff0c;及时进行响应&#xff0c;通过对相关日志等信息的深入分析&#xff0c;整理汇总此文档。 二、数据库REDO…

注册表设置windows背景护眼色

方法一&#xff1a; CtrlR&#xff0c;输入regedit打开注册表 HKEY_CURRENT_USER\Control Panel\Colors 右侧窗口Windows键值由255 255 255改为202 234 206。 方法二&#xff1a; 还是注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColo…

回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合

目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一…

自己手写tomcat项目

一&#xff1a;Servlet的原理 在Servlet(接口中)有&#xff1a; 1.init():初始化servlet 2.getServletConfig()&#xff1a;获取当前servlet的配置信息 3.service():服务器&#xff08;在HttpServlet中实现&#xff0c;目的是为了更好的匹配http的请求方式&#xff09; 4.g…

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化&#xff0c;服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论&#xff0c;在用户需求与技术边界之间找到最优解。 此次智能驾驶项目&#xff0c;我们为某车载平台提供…