Vue: 腾讯Tdesign描点组件与scrollIntoView描点对比,及展开收缩功能总结

超出显示展开按钮功能

展开内容的逻辑可以根据具体需求来实现。下面是一个简单的示例,展开按钮点击后会显示完整的内容:

展开前

展开后

html 复制代码
<template>
  <div ref="container" class="container" :style="{ 'max-height': contentHeight + 'px' }">
    <div ref="content" class="content"> {{ text }} </div>
    <button v-if="showExpandButton" class="expand-button" @click="expandContent">
      {{ isExpanded ? '收起' : '展开' }}
    </button>
  </div>
</template>

<script setup>
import { ref, onMounted, watch } from 'vue';

const container = ref(null);
const content = ref(null);
const showExpandButton = ref(false);
const isExpanded = ref(false);
const contentHeight = ref(55); // 初始值
const text = ref('你的内容');

const handleResize = () => {
  const containerHeight = container.value.offsetHeight;
  const contentHeightValue = content.value.offsetHeight;
  showExpandButton.value = contentHeightValue > containerHeight;
  
  if (isExpanded.value) {
    contentHeight.value = contentHeightValue;
  } else {
    contentHeight.value = containerHeight;
  }
};

const expandContent = () => {
  if (isExpanded.value) {
    contentHeight.value = container.value.offsetHeight;
  } else {
    contentHeight.value = content.value.offsetHeight;
  }
  isExpanded.value = !isExpanded.value;
};

onMounted(() => {
  const observer = new ResizeObserver(handleResize);
  observer.observe(content.value);
});

watch(text, () => {
  handleResize();
});

</script>

<style scoped>
.container {
  /* max-height: 300px;  容器的最大高度 , 可以通过script中的contentHeight设置初始值 */
  overflow: hidden;
  position: relative;
}

.content {
  transition: height 0.3s;
  /* 内容样式 */
}

.expand-button {
  position: absolute;
  bottom: 0;
  right: 0;
}
</style>

在这个示例代码中,我们添加了isExpandedcontentHeight的响应式引用来控制展开状态和获取内容的高度。在handleResize中,根据展开状态和容器的高度来设置内容的高度。展开按钮的点击事件expandContent会更新展开状态,并根据展开状态设置内容的高度。在展开和收起后,通过过渡效果实现平滑的高度变化。我们可以根据具体需求修改代码中的变量和逻辑,并添加自己的展开内容逻辑。

使用scrollIntoView实现描点定位

scrollIntoView 是一个 DOM API,它可以让元素滚动到可见区域。在 Vue 中,你可以通过 ref 引用来获取到元素的引用,然后调用 scrollIntoView 方法来实现滚动。

使用方法如下:

  1. 在需要滚动的元素上添加 ref
html 复制代码
<template>
  <div>
    <div ref="scrollElement">需要滚动的元素</div>
    <button @click="scrollToElement">滚动到元素</button>
  </div>
</template>
  1. 在 Vue 组件中使用 scrollIntoView 方法来滚动元素:
html 复制代码
<script>
export default {
  methods: {
    scrollToElement() {
      this.$refs.scrollElement.scrollIntoView();
    }
  }
}
</script>

当按钮被点击时,scrollToElement 方法会被调用,然后 scrollIntoView 方法会将元素滚动到可见区域。

scrollIntoView 方法还支持传入一个可选的配置对象来更细致地控制滚动行为。例如:

js 复制代码
scrollToElement() {
  this.$refs.scrollElement.scrollIntoView({
    behavior: 'smooth',  // 平滑滚动
    block: 'start',      // 滚动到元素顶部
    inline: 'start'      // 滚动到元素左侧
  });
}

这里设置了 behavior 参数为 'smooth',使用平滑滚动效果;block 参数为 'start',将元素的顶部对齐到滚动容器的顶部;inline 参数为 'start',将元素的左侧对齐到滚动容器的左侧。

我们可以根据需要调整这些参数值来实现你想要的滚动效果。

当出现元素显示不全的情况,可以试试如下方法: 设置ref元素样式为:

css 复制代码
.anchor {
	height: 60px;
	margin-top: -70px;
}

来调整位置

使用Tdesign提供的描点组件

TDesign 框架中提供了描点组件,但是可能相比原生的 scrollIntoView 方法会存在一定的灵活度差异。这是因为 TDesign 框架是一个 UI 组件库,旨在为开发者提供通用的组件,而不是直接暴露原生的 JavaScript 方法。

虽然 TDesign 提供了描点组件,但其使用可能是基于固定的场景和约定,以简化组件的使用。这些约定可能包括:

  1. 定义了特定的标记或类名,用于指定和触发描点的元素。
  2. 定义了特定的动画效果和样式,以滚动到描点元素时产生视觉上的变化。
  3. 提供了对描点元素的定位和滚动的封装,以确保滚动位置的准确性和几何效果。

如上所述,TDesign 框架的描点组件可能相对较为限制,不如原生的 scrollIntoView 方法那样具有灵活性。如果对于描点和滚动效果有特定的需求,可以考虑直接使用原生的 scrollIntoView 方法来实现自定义的滚动行为。

然而,对于通用的、基于约定的描点需求,使用 TDesign 提供的描点组件可能更方便和符合框架的设计思想。它可以提供更简单的 API 和预定义的样式,以减少开发和维护的工作量。

综上所述,根据具体的需求和场景,可以权衡使用 TDesign 的描点组件还是原生的 scrollIntoView 方法,以达到最佳的开发效果和用户体验

相关推荐
让时光到此为止。20 分钟前
vue的首屏优化是怎么做的
前端·javascript·vue.js
温宇飞44 分钟前
CSS 中如何处理空白字符
前端
dengzhenyue1 小时前
矩形碰撞检测
开发语言·前端·javascript
llq_3501 小时前
为什么 npm view yarn version 显示 1.22.22?
前端
aesthetician1 小时前
ReactFlow:构建交互式节点流程图的完全指南
前端·流程图·react
neo_dowithless1 小时前
多语言维护太痛苦?我自研了一个翻译自动化 CLI 工具
前端·ai编程
Q_Q5110082851 小时前
python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别
vue.js·spring boot·python·django·flask·uni-app·node.js
小徐_23331 小时前
老乡鸡也开源?我用 Trae SOLO 做了个像老乡鸡那样做饭小程序!
前端·trae
麦麦大数据2 小时前
D017 vue+django+neo4j音乐知识图谱推荐可视化分析系统|带管理员角色+爬虫
vue.js·数据分析·django·知识图谱·neo4j·推荐算法
荒诞英雄2 小时前
菠萝滞销,帮帮我们(多个APP实例间pinia混乱)
前端·架构