# 分类页的双列联动的设计
## 前言
这种交互作为商品的分类展示页的时候比较常见,一言概之,就是:左边点,右边滚;右边滚,左边点。这种交互比较基础也相对简单,我们来看一下应该如何做。
## DOM结构
作为演示就在这里随便写点,联动结构对节点的布局结构要求并不大,大致分两列就可以了,我们主要用js去设计交互逻辑。
~~~jsx
<template>
<div class="container">
<div class="left-list">
<div v-for="(item, idx) in leftTitleList" :key="idx" @click.stop="onLeftTitleClick(item, idx)" :class="['left-item', { activated: currentIndex == idx }]">{{ item }}</div>
</div>
<div class="right-list">
<scroll-view scroll-y style="height: 90vh">
<div class="right-item" v-for="(item, idx) in List" :key="item.id" :ref="`category-${idx}`" :id="`category-${idx}`">
<div class="category-title">{{ item.name }}</div>
<div class="category-content"></div>
</div>
</scroll-view>
</div>
</div>
</template>
<script>
const List = [
{
id: 1,
name: '热门推荐',
data: [{}],
},
{
id: 2,
name: '线上购物',
data: [{}],
},
{
id: 3,
name: '影音音乐',
data: [{}],
},
{
id: 4,
name: '话费充值',
data: [{}],
},
{
id: 5,
name: '外卖零食',
data: [{}],
},
{
id: 6,
name: '其他',
data: [{}],
},
]
export default {
name: '',
components: {},
data() {
return {
List,
currentIndex: 0
}
},
methods: {
onLeftTitleClick(item,index) {
this.currentIndex = index;
}
},
computed: {
leftTitleList() {
return this.List.map((item) => item.name)
},
},
mounted() {
},
}
</script>
<style>
page {
background: #f4f4f4;
}
</style>
<style lang="scss" scoped>
.nav-title {
font-size: 36rpx;
font-weight: 600;
color: #000000;
}
.container {
display: flex;
}
.left-list {
display: flex;
flex-direction: column;
flex: 1;
background: #fff;
.left-item {
padding: 37rpx 0;
display: flex;
justify-content: center;
align-items: center;
&.activated {
background: #f4f4f4;
}
}
}
.right-list {
flex: 3;
margin-left: 20rpx;
margin-right: 20rpx;
.right-item {
.category-title {
font-size: 28rpx;
font-weight: 400;
color: #333333;
padding: 44rpx 0;
display: flex;
align-items: center;
}
.category-content {
background: #fff;
height: 900rpx;
border-radius: 8rpx;
}
}
}
</style>
~~~
总之大概这样就可以了,现在我们来一步一步的设计需求所要求的交互。
## 左边点,右边滚
最直观的思路就是记录一开始记录右边区域的每一个元素的y轴偏移量,然后点击左边列表的时候相应的控制右边滚动条的高度。
所幸我们用的是uniapp,scroll-view
- 自述
- 学会提问
- 起步
- 安装
- 版本升级
- 1.x 升级 2.x 常见问题
- 命令行模式下node-sass安装错误
- 查看版本
- uView UI 1.x 相关问题
- 安装
- Popup 弹窗
- tabs 标签
- Waterfall 瀑布流
- Table 表格
- Dropdown 下拉菜单
- uview-ui组件篇
- u-upload监听beforeRead事件无效
- 组件怎么关不了
- 导航栏不默认返回好麻烦
- ref怎么获取不到
- z-index拉满都覆盖不了map
- u-text对手机号脱敏
- u-input的placeholder去不掉
- 服务端返回数据,form表单验证错误
- checkbox增加选中面积
- uview-ui组件篇/checkbox无法取消选中
- 小程序输入框的placeholder会穿透到弹出层
- JavaScript篇
- 判断数据类型
- 数组操作
- 节流与防抖函数
- this怎么就不对
- 计算地图上两点间的距离
- CSS篇
- 我要超出显示省略号
- uniapp中小程序样式穿透问题
- 关键帧与动画
- CSS动画属性总结
- 过渡与动画
- 正则表达式篇
- 身份证号
- 手机号
- 是否合法的http/https域名
- 数据处理篇
- 对数组分组
- 深拷贝对象
- 提取数组属性
- 提取对象属性
- 常见问题
- 如何给由组件触发的事件中传入自定义的参数
- 分类的双列联动
- 三级联动的实现
- 小程序预览提示包过大
- 框架安装失败
- 表格、瀑布流、下拉列表 组件为什么没有了
- tabBar组件怎么用
- 时间、日历、选择器相关问题
- 字体图标不显示
- class 或 /deep/ 不生效