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 方法,以达到最佳的开发效果和用户体验

相关推荐
升讯威在线客服系统22 分钟前
如何通过 Docker 在没有域名的情况下快速上线客服系统
java·运维·前端·python·docker·容器·.net
AsBefore麦小兜24 分钟前
Vite vs Webpack
前端·webpack
LaughingZhu24 分钟前
PH热榜 | 2025-02-23
前端·人工智能·经验分享·搜索引擎·产品运营
道不尽世间的沧桑2 小时前
第17篇:网络请求与Axios集成
开发语言·前端·javascript
diemeng11193 小时前
AI前端开发技能变革时代:效率与创新的新范式
前端·人工智能
bin91535 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
晴空万里藏片云7 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一7 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球7 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7237 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense