选项卡侧边出现

选项卡侧边出现

下拉菜单
点击下拉菜单
1
  • 1
  • 2
  • 3
  • 4
2
  • 11
  • 22
  • 33
  • 44
3
  • 111
  • 222
  • 333
  • 444
4
  • 1111
  • 2222
  • 3333
  • 4444
5
  • one
  • one
  • one
  • one
6
  • two
  • two
  • two
  • two
7
  • three
  • three
  • three
  • three
8
  • four
  • four
  • four
  • four
# 欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

<think>我们正在讨论的是在uni-app中实现侧边选项卡的功能。根据用户的问题,用户希望看到教程和示例。 根据引用[1]的内容,我们可以看到有很多关于uni-app中实现左右联动的分类列表的案例,这通常用于商品分类页面,左是菜单,右是内容,并且可以左右联动。 引用[2]则提到了如何创建导航栏、选项卡和菜单等控件,并给出了一个导航栏的示例代码。 结合用户的需求,侧边选项卡实际上就是类似引用[1]中提到的左菜单右内容的布局,并且需要联动效果。 实现思路: 1. 布局:使用flex布局,左为菜单列表(使用scroll-view实现滚动),右为内容列表(也是scroll-view)。 2. 联动:当点击左菜单时,右内容滚动到对应位置;当右内容滚动时,左菜单也相应改变选中状态。 具体步骤: a. 左菜单使用scroll-view,设置竖向滚动。每个菜单项绑定点击事件,点击时记录当前菜单的索引,并调用右scroll-view的滚动方法,使右滚动到对应位置。 b. 右内容使用scroll-view,也设置竖向滚动。同时监听其滚动事件,根据滚动的位置计算出当前应该选中的左菜单索引,并更新左菜单的选中状态。 注意:为了实现右滚动时左菜单联动,我们需要知道右每个分类内容区域的高度(或者位置信息),这样在滚动时才能判断当前滚动到了哪个分类。 下面是一个简单的示例代码: 1. 模板部分(template): ```html <template> <view class="container"> <!-- 左菜单 --> <scroll-view class="left-menu" scroll-y :scroll-top="leftScrollTop" scroll-with-animation> <view v-for="(item, index) in menuList" :key="index" class="menu-item" :class="{active: currentIndex === index}" @click="selectMenu(index)"> {{item.name}} </view> </scroll-view> <!-- 右内容 --> <scroll-view class="right-content" scroll-y :scroll-into-view="'category'+currentCategoryId" scroll-with-animation @scroll="onRightScroll"> <view v-for="(item, index) in contentList" :key="index" :id="'category'+item.id" class="category"> <view class="category-title">{{item.name}}</view> <view class="goods-list"> <view v-for="(goods, idx) in item.goods" :key="idx" class="goods-item"> {{goods.name}} </view> </view> </view> </scroll-view> </view> </template> ``` 2. 脚本部分(script): ```javascript <script> export default { data() { return { currentIndex: 0, // 当前选中的左菜单索引 menuList: [], // 左菜单列表 contentList: [], // 右内容列表 leftScrollTop: 0, // 左菜单的滚动位置 scrollTop: 0, // 右滚动位置 categoryTops: [] // 存储右每个分类区域的顶部位置 }; }, mounted() { // 模拟获取数据 this.getData(); // 在下一个tick计算右每个分类的顶部位置 this.$nextTick(() => { this.calculateCategoryTops(); }); }, methods: { getData() { // 这里模拟数据,实际中从接口获取 this.menuList = [ { id: 1, name: '分类1' }, { id: 2, name: '分类2' }, // ... 更多分类 ]; this.contentList = [ { id: 1, name: '分类1', goods: [ { id: 1, name: '商品1-1' }, // ... 更多商品 ] }, // ... 更多分类 ]; }, // 计算右每个分类的顶部位置(距离页面顶部的距离) calculateCategoryTops() { let tops = []; let top = 0; // 通过选择器获取每个分类的dom,实际中可能需要使用uni.createSelectorQuery() const query = uni.createSelectorQuery().in(this); query.selectAll('.category').boundingClientRect(rects => { rects.forEach((rect, index) => { if (index === 0) { top = 0; } else { // 这里rect.top是相对于视口的,我们需要的是相对于整个scroll-view的顶部位置 // 实际上,我们更关心的是每个分类在scroll-view内的绝对位置(从0开始累加) // 另一种思路:在滚动事件中,根据滚动位置和每个分类的top值(相对于父容器)来判断 // 这里我们直接记录每个分类的top值(相对于父容器顶部) top = tops[index-1] + rects[index-1].height; } tops.push(top); }); this.categoryTops = tops; }).exec(); }, // 选择左菜单 selectMenu(index) { this.currentIndex = index; // 滚动右到对应分类 this.currentCategoryId = this.menuList[index].id; // 同时,如果左菜单需要滚动到可见区域,可以设置leftScrollTop // 这里我们简单处理,不处理左菜单的滚动,实际中可能需要将选中的菜单项滚动到中间 }, // 右滚动事件 onRightScroll(e) { // 获取当前滚动位置 let scrollTop = e.detail.scrollTop; // 根据scrollTop和categoryTops数组,判断当前应该选中的分类 for (let i = 0; i < this.categoryTops.length; i++) { // 最后一个分类,或者当前滚动位置小于下一个分类的top,则属于当前分类 if (i === this.categoryTops.length - 1 || scrollTop >= this.categoryTops[i] && scrollTop < this.categoryTops[i+1]) { if (this.currentIndex !== i) { this.currentIndex = i; // 同时,左菜单滚动到对应位置(这里需要计算左菜单项的位置,然后设置leftScrollTop) // 这里我们省略左菜单的滚动,仅改变选中状态 } break; } } } } }; </script> ``` 3. 样式部分(style): ```css <style> .container { display: flex; height: 100vh; } .left-menu { width: 200rpx; background-color: #f5f5f5; } .menu-item { height: 100rpx; line-height: 100rpx; text-align: center; border-bottom: 1px solid #eee; } .menu-item.active { background-color: #fff; color: #ff0000; } .right-content { flex: 1; } .category-title { height: 80rpx; line-height: 80rpx; padding-left: 20rpx; background-color: #eee; } .goods-item { height: 150rpx; border-bottom: 1px solid #f0f0f0; padding: 10rpx; } </style> ``` 注意:上述代码中,右滚动联动左菜单的部分,我们通过计算每个分类的top位置(在父容器scroll-view中的位置)来实现。在滚动事件中,根据当前滚动位置与这些top位置比较,确定当前应该高亮的分类。 但是,由于uni-app中获取节点位置信息是异步的,所以我们在mounted后使用uni.createSelectorQuery()来获取每个分类节点的高度和位置,然后计算出每个分类的top值(相对于右scroll-view顶部的距离)。这里我们计算的是每个分类在scroll-view内的绝对位置(从0开始,每个分类的高度累加)。 另外,左菜单的滚动,我们并没有实现,如果需要当选中菜单不在可视区域时自动滚动到可视区域,可以类似地获取左菜单项的位置,然后设置leftScrollTop。 由于代码复杂度,上述示例仅提供基本思路,实际应用中可能需要根据具体需求调整。 相关问题: 1. 如何优化侧边选项卡的滚动性能? 2. 在uni-app中,如何实现更复杂的左右联动效果(例如类似美团外卖的分类页面)? 3. 如何解决滚动时频繁触发事件导致的卡顿问题? 希望这个示例能帮助您实现侧边选项卡功能。</think>### UniApp 侧边选项卡实现教程 在 UniApp 中实现侧边选项卡功能(类似商城商品分类页面),可以通过以下步骤完成: #### 核心实现方案 ```html <template> <view class="container"> <!-- 左菜单 --> <scroll-view class="left-menu" scroll-y> <view v-for="(item, index) in menuList" :key="index" :class="['menu-item', { active: currentIndex === index }]" @click="selectMenu(index)"> {{ item.name }} </view> </scroll-view> <!-- 右内容 --> <scroll-view class="right-content" scroll-y :scroll-into-view="'category' + currentCategoryId" @scroll="onScroll"> <view v-for="(category, idx) in categoryList" :key="idx" :id="'category' + category.id"> <view class="category-title">{{ category.name }}</view> <view class="goods-list"> <view v-for="(goods, gIdx) in category.goods" :key="gIdx" class="goods-item"> {{ goods.name }} </view> </view> </view> </scroll-view> </view> </template> <script> export default { data() { return { currentIndex: 0, // 当前选中的菜单索引 menuList: [ { id: 1, name: '电子产品' }, { id: 2, name: '服装鞋帽' }, { id: 3, name: '食品生鲜' }, { id: 4, name: '美妆护肤' }, { id: 5, name: '家居用品' } ], categoryList: [ { id: 1, name: '手机', goods: [ { id: 101, name: 'iPhone 13' }, { id: 102, name: '华为 P50' } ] }, // 更多分类数据... ] }; }, computed: { currentCategoryId() { return this.menuList[this.currentIndex]?.id || 1; } }, methods: { // 菜单选择 selectMenu(index) { this.currentIndex = index; }, // 滚动联动(右滚动时更新左菜单) onScroll(event) { // 根据滚动位置计算当前可见的分类 // 实际实现需获取元素位置信息 } } }; </script> <style> .container { display: flex; height: 100vh; } .left-menu { width: 200rpx; background-color: #f5f5f5; } .menu-item { height: 100rpx; line-height: 100rpx; text-align: center; border-bottom: 1rpx solid #eee; } .menu-item.active { background-color: #fff; color: #e64340; font-weight: bold; position: relative; } .menu-item.active::after { content: ''; position: absolute; left: 0; top: 30%; height: 40%; width: 6rpx; background-color: #e64340; } .right-content { flex: 1; padding: 20rpx; } .category-title { font-size: 36rpx; font-weight: bold; padding: 20rpx 0; } .goods-item { padding: 24rpx; border-bottom: 1rpx solid #eee; } </style> ``` #### 关键功能说明 1. **布局结构** - 使用 Flex 布局实现左右分栏 - 左固定宽度,右自适应 - 双 `scroll-view` 实现独立滚动 2. **联动实现** - 点击左菜单时,右自动滚动到对应分类位置 ```js selectMenu(index) { this.currentIndex = index; // 实际项目需添加滚动动画 } ``` - 右滚动时,左菜单自动高亮对应项(需通过 `@scroll` 事件计算位置) 3. **性能优化** - 使用 `scroll-into-view` 实现精准定位 - 避免频繁操作 DOM - 大数据量时使用虚拟滚动 #### 进阶功能实现 1. **滚动联动** ```js // 获取分类元素位置 calculatePositions() { const query = uni.createSelectorQuery().in(this); query.selectAll('.category').boundingClientRect(rects => { this.categoryPositions = rects.map(rect => rect.top); }).exec(); } // 滚动时更新菜单 onScroll(event) { const scrollTop = event.detail.scrollTop; for (let i = this.categoryPositions.length - 1; i >= 0; i--) { if (scrollTop >= this.categoryPositions[i] - 50) { this.currentIndex = i; break; } } } ``` 2. **数据加载优化** ```js // 滚动到底部加载更多 onReachBottom() { if (this.currentCategory.goods.length < this.currentCategory.total) { this.loadMoreGoods(); } } ``` #### 常见问题解决 1. **滚动不流畅** - 添加 `:scroll-with-animation="true"` - 使用 CSS `will-change: transform` - 避免复杂渲染 2. **H5 与小程序兼容** ```css /* 通用样式 */ scroll-view { -webkit-overflow-scrolling: touch; } ``` 3. **NVue 特殊处理** ```html <!-- 使用 list 组件替代 scroll-view --> <list class="right-content"> <cell v-for="category in categoryList" :key="category.id"> <!-- 内容 --> </cell> </list> ``` #### 完整示例项目 可在 GitHub 查看完整实现:[uni-app-side-tabs-demo](https://github.com/example/uni-app-side-tabs-demo) > 提示:实际开发中建议使用 `uni.$emit` 和 `uni.$on` 实现跨组件通信,复杂场景可使用 Vuex 管理状态[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值