记录:uniapp直播的弹幕的样式修改与发送弹幕会自动滚动到底部两个技巧

news2024/11/17 17:26:45
1、在直播页面的弹幕评论中,我们希望的样式是: 观众名字:评论
而且颜色有所区分,并在同一行显示
2、我们希望在发弹幕的时候可以回自动滚动到自己发的内容那里

一:弹幕样式修改

因为是小白,前端对于样式这一块实在是太难了,只能一边百度学习一边修改,踩坑无数,最终达到自己想要的效果,在此记录一下。

1.1:目标效果图:

1.2:踩坑记录

(我这个使用的是nvue页面,在使用大佬的页面模板下样式发生了改变,只能自己慢慢修改调整)

因为这个名字和弹幕内容需要颜色区分开,所以我本来打算的是使用两个text组件,颜色分别设置,最后给父元素使用flex-direction: row让他们在同一行即可,但是这样使用的话会导致弹幕文字直接溢出灰色背景不会换行;如果再给它的父元素添加flex-wrap: wrap;很不幸,这样不仅导致子元素全部换行,也就是名字和弹幕占据两行,而且文字的溢出也没有解决,实在是头大,最终还是找到大佬的解决方案(https://www.cnblogs.com/robot666/p/14987404.htmlhttps://www.cnblogs.com/robot666/p/14987404.html),使用一个rich-text替代两个text,在这里分别设置不同的样式和内容

1.3:代码 

这是templete代码,里面我使用:style="{ width: computedWidth(item) + 'rpx' 来设置弹幕的灰色背景,使其有不同宽度的背景

<view id="scroll-view-content">
						<view class="remind">{{ remind }}</view>
						<view class="main">
							<view class="plMaim" v-for="(item, index) in danmuData" :key="index" :id="'item-' + index"
								:style="{ width: computedWidth(item) + 'rpx' }">
								<!-- <text class="myName">{{ item.name }}:</text>
								<text class="myPl">{{ item.content }}</text> -->
								<rich-text :nodes="richNodes(item)"></rich-text>
							</view>
						</view>
					</view>

下面是script代码,可以根据自己情况设置

richNodes(item) {	//弹幕样式计算
			    return [{
			        children: [{
			            type: 'text',
			            attrs: {
			                style: 'color: #a1e5fc; font-size: 32rpx; line-height: 36rpx; padding: 8rpx; border: #ffff7f solid 1px;'
			            },
			            text: item.name + ':'
			        },
			        {
			            type: 'text',
			            attrs: {
			                style: 'color: #ffffff; font-size: 32rpx; line-height: 36rpx; padding: 8rpx; border: #ffff7f solid 1px; '
			            },
			            text: item.content
			        }]
			    }];
			}

二、发送弹幕自动滚到内容处

2.1:方式一:滚动视图减去不需要的视图高度

这个我先使用百度到的方式,原理是:uni .createSelectorQuery().in(this)使用这个api,获取到可滚动视图的总高度,通过减去弹幕区域固定的高度,剩余的就是我们不需要的高度,我们只需要将这个剩余高度设置为可滚动区域的顶部,就相当于滚动到弹幕底部了,代码我放在下面。但是我在使用这个时出现了问题,具体报错如下图,我研究了好一会,但是不明白,只能采用第二个方式。

<scroll-view :style="{ height: scrollViewHeight + 'px' }" :scroll-y="true" :scroll-top="scrollTop"
:scroll-with-animation="true" :scroll-y-bar="false" show-scrollbar class="scrollView" ref="scrollViewRef">
<view id="scroll-view-content">
<view class="remind">{{ remind }}</view>
<view class="main">
<view class="plMaim" v-for="(item, index) in danmuData" :key="index"
:style="{ width: computedWidth(item) + 'rpx' }">
<!-- <text class="myName">{{ item.name }}:</text>
<text class="myPl">{{ item.content }}</text> -->
<rich-text :nodes="richNodes(item)"></rich-text>
</view>
</view>
</view>
</scroll-view>
<script>
export default {
  data() {
    return {
//滚动条位置
      scrollTop: 0,
      scrollViewHeight: 191, //滚动视图的高度
            }
        }
}
methods: {
//发送按钮
sendOut() {
				if(this.content){
					const list = {
						name: this.nickname,
						content: this.content,
					};
					this.danmuData.push(list);
					this.content = ''
					this.scrollToBottom();
}},
//根据内容自动滚动
    scrollToBottom() {
      this.$nextTick(() => {
        uni
          .createSelectorQuery()
          .in(this)
          .select("#scroll-view-content")
          .boundingClientRect((res) => {
            let top = res.height - this.scrollViewHeight;
            if (top > 0) {
              this.scrollTop = top;
            }
          })
          .exec();
      });
    },
}
</script>

2.2:方式二:根据索引滚动到指定位置

可以在展示每条弹幕消息中加上索引:id="'item-' + index",根据索引滚动

<scroll-view :style="{ height: scrollViewHeight + 'px' }" :scroll-y="true" 
					:scroll-with-animation="true" :scroll-y-bar="false" show-scrollbar class="scrollView" :scroll-into-view="scrollToView">
					<view id="scroll-view-content">
						<view class="remind">{{ remind }}</view>
						<view class="main">
							<view class="plMaim" v-for="(item, index) in danmuData" :key="index" :id="'item-' + index"
								:style="{ width: computedWidth(item) + 'rpx' }">
								<!-- <text class="myName">{{ item.name }}:</text>
								<text class="myPl">{{ item.content }}</text> -->
								<rich-text :nodes="richNodes(item)"></rich-text>
							</view>
						</view>
					</view>
				</scroll-view>

 在点击发送按钮后执行下面的方法,把当前用户的名字发送过来进行匹配,获取最后一个即可

//根据索引滚动
			scrollToBottom(name) {
				 this.$nextTick(() => {
				     const index = this.danmuData
				         .map((item, i) => item.name === name ? i : -1)
				         .filter(i => i !== -1)
				         .pop(); // 获取最后一个匹配项的索引
				 
				     if (index !== undefined) {
				         this.scrollToView = 'item-' + index;
				     }
				 });

				
			},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Machine Learning Specialization 学习笔记(1)

文章目录 前言一、监督学习二、无监督学习三、一些基本概念线性回归模型简单线性回归多元线性回归模型训练模型评估应用 损失函数 &#xff08;cost function&#xff09;梯度下降 &#xff08;gradient descent&#xff09;多类特征&#xff08;multiple features&#xff09;…

微积分复习笔记 Calculus Volume 1 - 1.5 Exponential and Logarithmic Functions

1.5 Exponential and Logarithmic Functions - Calculus Volume 1 | OpenStax

JavaScript(进阶篇)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;今天讲解的是JavaScript进阶&#xff0c;希望大家可以有所收获&#xff0c;话不多说&#xff0c;开干&#xff01; &#x1f525;&#x1f525;&#x1f525;文章专题&#xff1a;JavaScript &#x1f63d;感谢大家…

Numba坐标索引(CPU + 多线程)

文章目录 一、测试样本 —— 创建样本mask&#xff0c;具有 N 个唯一像素值&#xff0c;每个值有 M 个坐标。二、加速方法&#xff08;1&#xff09;多线程加速 —— 每次提取一个像素值&#xff0c;然后遍历图像&#xff0c;匹配并判断其与初始化坐标的关系。&#xff08;2&am…

传输层 I(传输层提供的服务、UDP协议)【★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 运输层是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念&#xff1a; (1) 运输层为相互通信的应用进程提供逻辑通信。 (2) 端口和套接字的意义。 …

OpenCV 之 模版匹配多个对象、图片旋转 综合应用

引言 在图像处理和计算机视觉中&#xff0c;模板匹配是一种常用的技术&#xff0c;用于在一幅较大的图像中查找与给定模板图像相似的部分。然而&#xff0c;在实际应用中&#xff0c;目标物体可能会出现在不同的角度&#xff0c;这就需要我们在匹配之前对模板进行旋转处理。本…

[AHK]动态创建带ListBox的窗口,答选择题的界面

根据传入的窗口标题、提示信息(题干)、列表(选项)生成一个带ListBox的窗口(向导界面)。 AHK v1代码 if(A_ScriptFullPath=A_LineFile)MsgBox % ListBox("窗口标题", "这是一个生成listbox的Demo", "a|b|c|d|",3) return ;-------------…

清华智普ChatGlm批量API多线程写文章软件【glm-4-flash的key免费无限写 】

清华智普GLM-4-Flash经全面测评&#xff0c;在语义理解、数学逻辑、逻辑推理、代码执行以及广泛知识覆盖等方面&#xff0c;其表现显著超越了Llama-3-8B模型。 清华智普GLM-4-Flash模型还具备多种核心功能&#xff0c;包括但不限于流畅的多轮对话能力、内置的网页浏览功能、直…

线上购物商城小程序,uniapp,PHP语言开发在线购物商城小程序

前言&#xff1a; 商城小程序能够帮助商家降低成本、提高效率&#xff0c;为用户提供更加便捷和个性化的购物体验&#xff0c;是移动互联网时代的一种高效商业工具。 一、商城小程序功能有哪些&#xff1f; 基础功能需求 用户注册与登录 - 用户可以通过手机号、微信等方式进…

【第25章】Spring Cloud之Sentinel控制台详解

文章目录 前言一、实时监控二、簇点链路三、流控规则四、熔断规则五、热点规则六、系统规则七、授权规则八、集群流控九、机器列表总结 前言 前面我们详细介绍了Sentinel控制台的安装过程&#xff0c;这里我们来了解各个菜单的功能作用。 一、实时监控 同一个服务下的所有机器…

【网络安全】分析JS文件实现账户接管

未经许可,不得转载。 文章目录 正文正文 网站使用的是简单的OTP(一次性密码)验证机制,通过用户注册时提供的电子邮件发送邮箱验证码。在功能有限的情况下,我选择去分析网站加载的JavaScript文件。 我发现了一个名为 saveJobseekerPasswordInCache 的函数: 这个函数虽然…

等待实质审查的商标可以用吗!

申请注册商标受理书下来后&#xff0c;会有一个等待实质审查&#xff0c;这个审查出来就会出现要么通过初审&#xff0c;要么驳回&#xff0c;要么部分驳回&#xff0c;普推知产商标老杨发现时间大约是三个月左右&#xff0c;所以基本从申请3个月左右就知道结果了。 申请注册商…

智算时空 重塑视界│智汇云舟2024视频孪生产品发布会圆满举行,多个“全球首款”重磅亮相

​秋风送爽&#xff0c;丹桂飘香。9月6日&#xff0c;由北京智汇云舟科技有限公司主办&#xff08;简称&#xff1a;智汇云舟&#xff09;&#xff0c;北京北科软科技有限公司&#xff08;简称&#xff1a;北科软&#xff09;、北京恒升联合科技有限公司&#xff08;简称&#…

【北京迅为】《STM32MP157开发板使用手册》- 第十一章 编译U-Boot

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

TPM管理培训为何难以落地?原因解析与解决之道

近年来&#xff0c;TPM管理被视为提升设备效率、减少故障率、降低生产成本的关键。然而&#xff0c;尽管TPM的理念被广泛接受&#xff0c;其在实践中的落地却常常面临各种挑战。本文&#xff0c;深圳天行健企业管理咨询公司将深入解析TPM管理培训难以落地的根本原因&#xff0c…

微信小程序登录与获取手机号 (Python)

文章目录 相关术语登录逻辑登录设计登录代码 相关术语 调用接口[wx.login()]获取登录凭证&#xff08;code&#xff09;。通过凭证进而换取用户登录态信息&#xff0c;包括用户在当前小程序的唯一标识&#xff08;openid&#xff09;、微信开放平台账号下的唯一标识&#xff0…

华为防火墙 nat64

如果设备接收到的IPv6报文的前缀是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv4网络&#xff0c;报文将经过NAT64处理后被转发至IPv4网络。 如果设备接收到的IPv6报文的前缀不是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv6网络&#xff0c;报文…

强烈推荐!分享5款ai论文生成软件

在当今学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是五款值得推荐的AI论文生成软件&#xff0c;特别是千笔-AIPassPaper。 ### 千笔-…

Gin-封装自动路由

O.0 思路一、API二、控制层三、自动路由核心四、分组路由外加中间件使用 思路 由于Java转Go直接使用的goframe框架&#xff0c;然学习Gin时觉得一个接口一个路由太麻烦&#xff0c;于是有了...1、在请求结构体中采用标签的形式&#xff0c;直接给出路由和请求方式 2、在控制层…

yum源配置与静态配置地址

网络yum源 备份配置文件 下载新的CentOS-Base.repo文件到/etc/yum.repos.d/目录下 执行yum clean all清除原有 yum 缓存 执行yum makecache&#xff08;刷新缓存&#xff09; 本地yum 将/etc/yum/repos.d/下的文件a都移走&#xff0c;此处移到了该目录下的bak中 找到光盘路…