用vue写一个随着滚动高度 而高亮的效果

这篇具有很好参考价值的文章主要介绍了用vue写一个随着滚动高度 而高亮的效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分别在hbuilder中 和vscode中写一套代码

滑动高亮文章来源地址https://www.toymoban.com/news/detail-511485.html


上效果图

1. 在hbuilder中 小程序的代码

<template>
	<view  class="">
		<view class="detailNavbar" :style="[{ height: navbar - sys_statusBar + 'px',opacity: tabOpacityVal  }]">
			<view @tap="onTab(item)" class="navbar-item" :class="curTab === item.value ? 'current' : ''"
				v-for="item in tabList" :key="item.to">
				{{item.label}}
			</view>
		</view>

		<view class="detail-swiper-selecto">

		</view>
		<view class="detail-comment-selector">

		</view>
		<view class="detail-content-selector">

		</view>
	</view>
</template>

<script setup>
	import {
		onLoad,
		onShow,
		onPageScroll
	} from '@dcloudio/uni-app'
	import throttle from "@/utils/throttle.js"
	import {
		ref
	} from "vue";
	const curTab = ref('goods')
	const tabOpacityVal = ref(0)
	const tabList = ref([{
			label: '商品',
			value: 'goods',
			to: 'detail-swiper-selector',
		},
		{
			label: '评价',
			value: 'comment',
			to: 'detail-comment-selector',
		},
		{
			label: '详情',
			value: 'detail',
			to: 'detail-content-selector',
		},
	])
	// 设备信息
	const device = uni.getSystemInfoSync();

	// 标题栏高度
	const getNavBar = () => {
		return device.statusBarHeight + 44;
	};
	const navbar = getNavBar();
console.log('divce',device);
	const sys_statusBar = device.statusBarHeight

	let commentCard = {
		top: 0,
		bottom: 0,
	};
	// 点击跳转到对应的位置
	const onTab = (item) => {
		let scrollTop = 0;
		if (item.value === 'comment') {
			scrollTop = commentCard.top - navbar + 1;
		} else if (item.value === 'detail') {
			scrollTop = commentCard.bottom - navbar + 1;
		}
		console.log(scrollTop);
		uni.pageScrollTo({
			scrollTop,
			duration: 200,
		});
	}

	// 获取评论区的top值 和详情区的bottom
	const getCommentCardNode = () => {
		return new Promise((res, rej) => {
			uni.createSelectorQuery()
				.select('.detail-comment-selector')
				.boundingClientRect((data) => {
					if (data) {
						commentCard.top = data.top;
						commentCard.bottom = data.top + data.height;
						res(data);
					} else {
						res(null);
					}
				})
				.exec();
		});
	}

	onPageScroll((e) => {
		// 判断是否需要透明
		tabOpacityVal.value = e.scrollTop > navbar ? 1 : e.scrollTop * 0.01;
		// 获取评论区的top值 和详情区的bottom
		if (commentCard.top === 0) {
			throttle(() => { //节流函数
				getCommentCardNode();
			}, 50);
		}
		if (e.scrollTop < commentCard.top - navbar) {
			// 滑动的距离小于评论区的顶部时
			curTab.value = 'goods';
		} else if (
			e.scrollTop >= commentCard.top - navbar &&
			e.scrollTop <= commentCard.bottom - navbar
		) {
			// 滑动的距离大于评论区顶部 小于评论区底部时
			curTab.value = 'comment';
		} else {
			curTab.value = 'detail';
		}

	})


	

	const updateTheme = () => {

	}
</script>

<style scoped lang="scss">
	.detailNavbar {
		position: fixed;
		top: 0;
		color: #000;
		background-color: #fff;
		width: 100%;
		// height: ;
		display: flex;
		align-items: center;
		justify-content: center;

		.navbar-item {
			flex: 1;
			text-align: center;
		}

		.current {
			color: red;
		}
	}

	.detail-swiper-selecto {
		height: 100vh;
		width: 100%;
		background-color: red;
	}

	.detail-comment-selector {
		height: 30vh;
		width: 100%;
		background-color: blue;
	}

	.detail-content-selector {
		height: 100vh;
		width: 100%;
		background-color: green;
	}
</style>

2. 在h5中用vscode的代码

<template>
  <!-- 滑动效果  手机版 -->
  <div id="scroll-container" ref="scrollref">
    <div class="detailNavbar" :style="[{ height:navbarHeight + 'px',opacity: tabOpacityVal  }]">
      <div @click="onTab(item)" class="navbar-item" :class="curTab === item.value ? 'current' : ''"
        v-for="item in tabList" :key="item.to">
        {{item.label}}
      </div>
    </div>

    <div class="detail-swiper-selector">

    </div>
    <div class="detail-comment-selector">

    </div>
    <div class="detail-content-selector">

    </div>
  </div>
</template>

<script setup>
  import throttle from "@/utils/throttle.js"
  import {
    ref,
    onMounted,
    nextTick
  } from "vue";
  const curTab = ref('goods')
  const tabOpacityVal = ref(0)
  const tabList = ref([{
      label: '商品',
      value: 'goods',
      to: 'detail-swiper-selector',
    },
    {
      label: '评价',
      value: 'comment',
      to: 'detail-comment-selector',
    },
    {
      label: '详情',
      value: 'detail',
      to: 'detail-content-selector',
    },
  ])
  const scrollref = ref(null)
  const navbarHeight = 44
  onMounted(() => {
    // const container = document.getElementById('scroll-container');
    // const container = document.getElementById('scroll-container');
    // 添加滚动事件监听器
    // console.log(container);
    nextTick(() => {
      scrollref.value.addEventListener('scroll', onPageScroll, true);
    })
  })
  let commentCard = {
    top: 0,
    bottom: 0,
  };
  // 点击跳转到对应的位置
  const onTab = (item) => {
    let scrollTop = 0;
    if (item.value === 'comment') {
      scrollTop = commentCard.top - navbarHeight + 1;
    } else if (item.value === 'detail') {
      scrollTop = commentCard.bottom - navbarHeight + 1;
    }
    console.log(scrollTop);

    // window.scrollTo({
    //   top: scrollTop,
    //   behavior: "smooth",
    // });
    //上面的方法在设置 overflow: scroll;后不能使用 原因未知  下面的两种方法都能使用
    scrollref.value.scrollTop = scrollTop
    // const scrolDom = document.querySelector(`.${item.to}`)
    // scrolDom.scrollIntoView({
    //   behavior: 'smooth' // 加一个过渡动画(固定的)
    // })

  }

  // 获取评论区的top值 和详情区的bottom
  const getCommentCardNode = () => {
    return new Promise((res, rej) => {
      let elem = document.querySelector(".detail-comment-selector");
      let rect = elem.getBoundingClientRect();
      console.log(rect);
      if (rect) {
        commentCard.top = rect.top;
        commentCard.bottom = rect.top + rect.height;
        res(rect)
      } else {
        res(null)
      }

    });
  }

  const onPageScroll = (e) => {
    // console.log(e.target.scrollTop);
    // 判断是否需要透明
    const scrollTop = e.target.scrollTop
    tabOpacityVal.value = scrollTop > navbarHeight ? 1 : scrollTop * 0.01;
    // 获取评论区的top值 和详情区的bottom
    if (commentCard.top === 0) {
      throttle(() => { //节流函数
        getCommentCardNode();
      }, 50);
    }
    if (scrollTop < commentCard.top - navbarHeight) {
      // 滑动的距离小于评论区的顶部时
      curTab.value = 'goods';
    } else if (
      scrollTop >= commentCard.top - navbarHeight &&
      scrollTop <= commentCard.bottom - navbarHeight
    ) {
      // 滑动的距离大于评论区顶部 小于评论区底部时
      curTab.value = 'comment';
    } else {
      curTab.value = 'detail';
    }
  }
</script>

<style scoped lang="scss">
  #scroll-container {
    width: 100%;
    height: 100vh;
    // overflow-y: auto;
    overflow: scroll;
    scroll-behavior: smooth ;
  }

  .detailNavbar {
    position: fixed;
    top: 0;
    color: #000;
    background-color: #fff;
    width: 100%;
    // height: ;
    display: flex;
    align-items: center;
    justify-content: center;

    .navbar-item {
      flex: 1;
      text-align: center;
    }

    .current {
      color: red;
    }
  }

  .detail-swiper-selector {
    height: 100vh;
    width: 100%;
    background-color: red;
  }

  .detail-comment-selector {
    height: 30vh;
    width: 100%;
    background-color: blue;
  }

  .detail-content-selector {
    height: 100vh;
    width: 100%;
    background-color: green;
  }
</style>```

到了这里,关于用vue写一个随着滚动高度 而高亮的效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue uniapp实现图片宽度100%、高度自适应的效果

    在Uniapp中,我们可以使用image组件来加载图片,而想要实现图片宽度100%、高度自适应的效果,可以通过以下步骤实现: 首先,在image组件上设置mode属性为widthFix,表示按照图片的宽度等比缩放,并保证图片宽度为100%。 接着,在image组件上设置style属性,为图片设置高度自适应

    2024年02月15日
    浏览(69)
  • echarts 使用地图,设置背景图片和高亮图片,点击实现高亮显示,更换散点图图片,高亮散点图形,3D悬浮效果展示地图,集成Vue组件

    先看下   需要实现的效果: 第一步 需准备需要的插件  1  注意新版 echarts 的引入方式为:  import * as echarts from \\\'echarts\\\',这里我把 echarts 直接挂载到了Vue上,本项目使用echarts比较多,这样的话很方便,也可以在需要echarts的模块按需引入        在main.js中添加以下代码:

    2024年02月10日
    浏览(59)
  • 如何使用CSS实现一个无限滚动效果(Infinite Scroll)?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月12日
    浏览(52)
  • Vue3 大屏数字滚动效果

     父组件: template   div class=\\\"homePage\\\"     NumRoll v-for=\\\"(v, i) in numberList\\\" :key=\\\"i\\\" :number=\\\"v\\\"/NumRoll   /div /template script setup import { onMounted, ref } from \\\'vue\\\' import NumRoll from \\\'@/views/components/numRoll.vue\\\' const numberList = ref([0]) const number = ref(1200) onMounted(() = {   numberList.value = number.value.toString().spl

    2024年02月13日
    浏览(47)
  • 如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(52)
  • 如何使用CSS实现一个无限循环滚动的图片轮播效果?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(49)
  • 如何使用CSS实现一个平滑滚动到页面顶部的效果(回到顶部按钮)?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月11日
    浏览(49)
  • vue如何获取一个元素的高度

    Vue 中获取一个元素的高度可以使用 JavaScript 原生方法或者 Vue 内置的 $refs。 使用 JavaScript 原生方法: 可以在 mounted 钩子函数中获取到元素,然后使用 offsetHeight 属性获取元素高度。

    2024年02月12日
    浏览(43)
  • 大前端04-固定组件在屏幕位置,随着滑轮滚动——使用css样式:position

    在遇到一些很长,很长的页面时候我们希望组件能够跟随用户操作,悬浮在固定位置,因此我们可以使用postition组件 CSS 的 position 属性用于设置元素在页面上的定位方式。它有 5 个可能的值: static 、 relative 、 absolute 、 fixed 和 sticky 。下面分别对这些值进行介绍,并给出一些

    2023年04月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包