评论 展开|收起

场景:

列表中文本最多三行,超出部分省略,并显示展开收起按钮,如果文本没有超出三行则不显示展开收起按钮

方案:

1)在div 中添加一个span 然后给div设置超出三行省略,这时候就可以获取到文本高度和div高度了

在这里插入图片描述
优点:能很好的限制超出行数做展开|收起,低于某个行数全部显示;且对换行空格也有效
缺点:像评论列表这种内容很不固定的,手机上会发现判断有误,需要进一步优化。后我想到一个折中办法是把判断字符串长度的判断也加上可以弥补一下

<template><div class="text-box"><div :class="['txt', { 'over-hidden': !unfold }]" ref="textBox"><span ref="spanBox">{{content}}</span><div v-if="ifOver" @click="unfold = !unfold" class="btn":class="[unfold ? 'btn-open' : 'btn-close']">{{unfold ? '收起' : '展开'}}</div></div></div>
</template>
<script>
export default {name: "text-box",data() {return {ifOver: false, // 文本是否超出三行,默认否unfold: false // 文本是否是展开状态 默认为收起};},props: {content: {type: String,default: ""}},mounted() {// 判断是否显示展开收起按钮this.ifOver = this.$refs.spanBox.offsetHeight > this.$refs.textBox.offsetHeight}
};
</script>
<style scoped>
.txt {font-size: 16px;color: #333;line-height: 0.44rem;text-align: justify;word-break: break-all;word-wrap: break-word;white-space: pre-line;position:relative;
}
.over-hidden {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;
}
.btn {color: #2caf7d;line-height: 0.44rem;
}
.btn-close{position: absolute;bottom: 0;right: 0;padding-left: .06rem;background: #fff;
}
.btn-close::before {content: '...';color: #888888;
}
.btn-open{display: block;width: 2rem;font-size: 0.28rem;color: #2caf7d;line-height: 0.44rem;
}
</style>
2)根据字符串长度判断是否做展开|收起、单行|双行显示处理

特点:简单粗暴
缺点:对于有换行字符的,无法准确定位行数
适用场景:大段简介、标题单行|双行切换显示
在这里插入图片描述
在这里插入图片描述

<template><!-- 话题 简介 组件 --><div class="intro"><div ref="introContent" class="intro__content" :class="{'intro__content-close': this.intro.length > 100 && !isOpen}">{{intro}}<a v-show="this.intro.length > 100 && !isOpen" @click.stop="handleOpen" class="intro__content-btn">展开</a></div><a v-show="this.intro.length > 100 && isOpen" @click.stop="handleOpen" class="intro__content-btn1">收起</a></div>
</template><script>
export default {name: "TopicIntro",props: {options: {type: String,required: true}},components: {},data() {return {intro: this.options,isOpen: false, // 是否展开}},computed: {},created() {this.intro = this.intro.replace('<br />', '').replace('<br/>', '');},mounted() {},methods: {handleOpen() {this.isOpen = !this.isOpen}}
}
</script><style scoped lang="less">
.intro{width: 100%;background-color: #fff;padding: 0 0.36rem;
}
.intro__content{font-size: 0.28rem;color: #888888;line-height: 0.44rem;text-align: justify;word-break: break-all;word-wrap: break-word;white-space: pre-line;
}
.intro__content-close{display: -webkit-box; -webkit-box-orient: vertical;-webkit-line-clamp: 3;word-break: break-all;-o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; text-overflow:ellipsis; overflow: hidden;word-break: break-all;text-align: justify;position: relative;.intro__content-btn{font-size: 0.28rem;color: #2caf7d;line-height: 0.44rem;position: absolute;bottom: 0;right: 0;padding-left: .06rem;background: #fff;&::before {content: '...';color: #888888;}}
}
.intro__content-btn1{display: inline-block;font-size: 0.28rem;color: #2caf7d;line-height: 0.44rem;padding: 0.14rem 0.3rem 0;margin-left: -0.3rem;
}
</style>
<div class="comm__title">{{weekInfo[0].title | ellipsis }}</div>filters: {ellipsis(value) {if (!value) return "";if (value.length <= 18) {return value.slice(0, 14) + "...";}if (value.length > 18) {return value.slice(0, 33) + "...";}return value;}}
3)根据行数限制通过文字行高计算显示块的高度

特点:效果可以
缺点:代码量大;对有换行符的情况不适用,长段表情类评论显示有问题
思路

首先得判断文本自否超过四行,因为这些一般都是是前端异步请求然后后端发送过来,在组长的指导下,使用了 Vue 中的 nextTick 来监听 DOM 中是数据变化。
接下来主要是 css 上的思路,其实上图可以分为两部分,如下图,标号1的部分展示前面三行,标号为2的部分会根据1的行数判断缩进的大小,然后展示第四行。最后通过背景色的控制让两者看上去是一段文字。
在这里插入图片描述

<template><div><div style="text-align: center">{{title}}</div><div class="top-prove">为了证明楼下的那货不会对我造成影响</div><div :class="showTotal ? 'total-introduce' : 'detailed-introduce'"><div class="intro-content" :title="introduce" ref="desc"><span class="merchant-desc" v-if="introduce">{{introduce}}</span><div class="unfold" @click="showTotalIntro" v-if="showExchangeButton"><p>{{exchangeButton ? '展开' : '收起'}}</p></div></div></div><div class="bottom-prove">为了证明楼上的那货不会对我造成影响</div><div class="change-buttom"><div class="long" @click="tryLong">点这试试一段比较长的文字</div><div class="short" @click="tryShort">点这试试一段比较短的文字</div></div></div>
</template><script>
export default {name: 'Spread',data () {return {title: '演示展开收起',introduce: '',// 是否展示所有文本内容showTotal: true,// 显示展开还是收起exchangeButton: true,// 是否显示展开收起按钮showExchangeButton: false,rem: ''};},mounted () {this.init();},methods: {showTotalIntro () {console.log(this.showTotal);this.showTotal = !this.showTotal;this.exchangeButton = !this.exchangeButton;},getRem () {console.log('getRem');const defaultRem = 16;let winWidth = window.innerWidth;console.log('winWidth:' + winWidth);let rem = winWidth / 375 * defaultRem;return rem;},init () {this.introduce = '拥有财富、名声、权力,这世界上的一切的男人--哥尔·D·罗杰,在被行刑受死之前说了一句话,让全世界的人都涌向了大海。“想要我的宝藏吗?如果想要的话,那就到海上去找吧,我全部都放在那里。”,世界开始迎接“大海贼时代”的来临。拥有财富、名声、权力,这世界上的一切的男人 “海贼王”哥尔·D·罗杰,在被行刑受死之前说了一句话,让全世界的人都涌向了大海。“想要我的宝藏吗?如果想要的话,那就到海上去找吧,我全部都放在那里。”,世界开始迎接“大海贼时代”的来临。';},tryLong () {let longIntroduce = 'Vue是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。';if (this.introduce !== longIntroduce) {this.showExchangeButton = false;this.showTotal = true;this.introduce = longIntroduce;}},tryShort () {let shortIntroduce = 'Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。';if (this.introduce !== shortIntroduce) {this.showExchangeButton = false;this.showTotal = true;this.introduce = shortIntroduce;}}},watch: {'introduce': function () {this.$nextTick(function () {console.log('nextTick');// 判断介绍是否超过四行let rem = parseFloat(this.getRem());console.log('watch 中的rem', rem);if (!this.$refs.desc) {console.log('desc null');return;}let descHeight = window.getComputedStyle(this.$refs.desc).height.replace('px', '');console.log('descHeight:' + descHeight);console.log('如果 descHeight 超过' + (5.25 * rem) + '就要显示展开按钮');if (descHeight > 5.25 * rem) {console.log('超过了四行');// 显示展开收起按钮this.showExchangeButton = true;this.exchangeButton = true;// 不是显示所有this.showTotal = false;} else {// 不显示展开收起按钮this.showExchangeButton = false;// 没有超过四行就显示所有this.showTotal = true;console.log('showExchangeButton', this.showExchangeButton);console.log('showTotal', this.showTotal);}}.bind(this));}}
};
</script><style lang="less" scoped rel="stylesheet/less">.top-prove {height: 100px;width: 100%;background: #dddddd;text-align: center;line-height: 100px;}.total-introduce {height: auto;overflow: hidden;font-size: 14px;color: #434343;margin: 10px;.intro-content {.merchant-desc {width: 100%;line-height: 21px;}}.unfold {display: block;z-index: 11;float: right;width: 40px;height: 21px;p {margin: 0;line-height: 21px;color: #7fbe87;}}}.detailed-introduce {font-size: 14px;color: #434343;position: relative;overflow: hidden;margin: 10px;.intro-content {// 最大高度设为4倍的行间距max-height: 84px;line-height: 21px;word-wrap: break-word;/*强制打散字符*/word-break: break-all;background: #ffffff;/*同背景色*/color: #ffffff;overflow: hidden;.merchant-desc {width: 100%;line-height: 21px;}&:after,// 这是展开前实际显示的内容&:before {content: attr(title);position: absolute;left: 0;top: 0;width: 100%;color: #434343// overflow: hidden;}// 把最后最后一行自身的上面三行遮住&:before {display: block;overflow: hidden;z-index: 1;max-height: 63px;background: #ffffff;}&:after {display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;height: 81px;/*截取行数*/-webkit-line-clamp: 4;text-overflow: ellipsis;-webkit-box-sizing: border-box;box-sizing: border-box;/*行首缩进字符数,值为[(截取行数-1)*尾部留空字符数]*/text-indent: -12em;/*尾部留空字符数*/padding-right: 4em;}.unfold {z-index: 11;width: 40px;height: 21px;outline: 0;position: absolute;right: 0;bottom: 0;p {margin: 0;line-height: 21px;color: #7fbe87;}}}}.bottom-prove {height: 100px;width: 100%;background: #dddddd;text-align: center;line-height: 100px;}.change-buttom {font-size: 14px;color: #2371be;.long {text-align: 21px;text-align: center;height: 21px;}.short {text-align: 21px;text-align: center;height: 20px;}}
</style>

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

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

相关文章

引用类型赋值

转载于:https://www.cnblogs.com/dongyuhan/p/6519711.html

Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028

图形如矩形、椭圆、路径等都从Shape类派生&#xff0c;它们一般表示规则或不规则图形&#xff0c;这些图形都是简单的二维图形&#xff0c;我相信大家都能理解的。 例一&#xff1a;矩形。 请看下面的XAML代码。 [html] view plaincopyprint? <Rectangle RadiusX"20&q…

Windows Phone开发(46):与Socket有个约会 转:http://blog.csdn.net/tcjiaan/article/details/7669315...

不知道大家有没有“谈Socket色变”的经历&#xff1f;就像我一位朋友所说的&#xff0c;Socket这家伙啊&#xff0c;不得已而用之。哈&#xff0c;Socket真的那么恐怖吗&#xff1f; 其实这话一点也不假&#xff0c;Socket有时候真的不太好操控&#xff0c;也不好维护&#xff…

百度分享插件wbuid属性无法@指定微博

好久不写博客&#xff0c;看到很多人遇到相关的问题&#xff0c;决定写一篇拯救大家于水火 现象很简单&#xff0c;你要是根据官网的例子来&#xff0c;肯定出错。。。。 官网上教你如果想在分享时自动""并且在分享后提示关注要用wbuid这个属性来配置微博id对不对&am…

10 进制转 2 进制、16 进制

为什么80%的码农都做不了架构师&#xff1f;>>> function IntToBin(Value: LongInt; Size: Integer): String; vari: Integer; beginResult:;for i:Size-1 downto 0 dobeginif Value and (1 shl i)<>0 thenResult:Result1elseResult:Result0;end; end;//举例…

SSH之Hibernate总结篇

Hibernate hibernate 简介&#xff1a; hibernate是一个开源ORM(Object/Relationship Mipping)框架&#xff0c;它是对象关联关系映射的持久层框架&#xff0c;它对JDBC做了轻量级的封装&#xff0c;而我们java程序员可以使用面向对象的思想来操纵数据库。 为什么要用hibernate…

Vue开发规范

规范目的 为提高团队协作效率 便于后台人员添加功能及前端后期优化维护 输出高质量的文档 命名规范 为了让大家书写可维护的代码&#xff0c;而不是一次性的代码 让团队当中其他人看你的代码能一目了然 甚至一段时间时候后你再看你某个时候写的代码也能看 css命名规范 遵循…

Vue项目搭建流程

Vue 简介 vue是目前前端最具前景的框架之一&#xff0c;能帮助我们快速搭建并开发前端项目。 Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;…

Vue模板语法详解

vue基础、安装、介绍双大括号&#xff08;Mustache语法&#xff0c;又叫胡子语法&#xff09;v-textv-htmlv-showv-if、v-else-if、v-elsev-show 与 v-if 的区别v-forv-for 中的 keyv-if 与 v-for 一起使用v-on&#xff08;缩写&#xff1a; &#xff09;v-bind&#xff08;缩写…

小白如何从零开始运营微信公众号?

小白如何从零开始运营微信公众号&#xff1f; 一、公众号定位&#xff0c;名称&#xff0c;头像 第一步公众号定位&#xff0c;最重要。如果你自己都讲不清楚自己是干嘛的&#xff0c;还有谁愿意来关注你呢&#xff1f;无论是旅游攻略还是美妆种草&#xff0c;成长干货还是养生…

软件测试技术lab1 2017.3.13

1.安装Junit和Hamcrest 2. 安装Eclemma 3.三角问题的测试用例 4.测试结果及coverage覆盖 转载于:https://www.cnblogs.com/kale12/p/6543904.html

Fiddler 抓包详细使用教程

主要抓包工具介绍与对比&#xff08;一&#xff09;Fiddler介绍&#xff08;二&#xff09;Fiddler与其他工具对比&#xff08;三&#xff09;工作原理&#xff08;四&#xff09;下载安装&#xff08;五&#xff09;Fiddler界面概述1 主菜单说明2. 快捷菜单说明3.会话列表说明…

如何学习微信公众平台的开发?

如何学习微信公众平台的开发&#xff1f; 在整个移动互联网的开发技术中&#xff0c;微信公众号的开发几乎是成本最低&#xff0c;传播最快&#xff0c;影响最广的&#xff0c;你几乎不需要再添加任何配置&#xff0c;就可以开始。 个人可以申请公众号&#xff0c;需要高级权限…

pom.xml配置文件配置jar(不用记,快速配置)

1&#xff1a;网址:http://mvnrepository.com/ 2:在搜索栏搜索要用的框架;例如spring *以下为示例 转载于:https://www.cnblogs.com/kaiwen/p/6545581.html

HTML中各种 div 位置距离关系

HTML中各种 div 位置距离关系一. 盒模型图片展示&#xff1a;二. 位置距离计算属性三. 应用场景一. 盒模型图片展示&#xff1a; 二. 位置距离计算属性 offsetWidth, offsetHeight 获取盒子的宽度/高度&#xff08;包括盒子的border&#xff0c;padding和内容width/height&…

Docker运行操作系统环境(BusyBoxAlpineDebian/UbuntuCentOS/Fedora)

目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列。前者以自带软件包版本较新而出名&#xff1b;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时&#xff0c;社区还推出了完全基于Docker的Linux发行版CoreOS。 使用Docker&#xff…

poj1681 Painter's Problem高斯消元

链接http://poj.org/problem?id1681 View Code 1 #include <stdio.h> 2 #include <string.h>3 #include <algorithm>4 #include <cmath>5 using namespace std;6 int d[230][230], N, M;7 char s[16][16]; 8 void solve( int n)9 { 10 int x[230…

小程序、vue 新闻上下轮播

小程序、vue 新闻上下轮播vue小程序红色部分&#xff1a;相当于放映机&#xff0c;也就是容器&#xff0c;overflow&#xff1a;hidden绿色内容&#xff1a;相当于胶片&#xff0c;也就是domvue vue的核心之一&#xff0c;数据驱动模版&#xff0c;循环播放映射的数据上就是 […

ajax.actionlink使用问题

突然发现ajax.actionlink调用的方法全是GET方式的&#xff0c;就算制定了POST也不行&#xff0c;Confirm窗口也弹不出来。。。直接StackOverFlow搜索 ajax.actionlink post not work, 出来一堆结果&#xff0c;有的是因为路由参数不对&#xff0c;有的是回调方法不对&#xff…

CSDN Markdown编辑器编辑教程

目录快捷键文字样式设置&#xff08;字体, 大小, 颜色, 高亮底色&#xff09;内嵌HTML表格定义列表代码块脚注数学公式UML 图:离线写博客常见颜色[TOC](目录)快捷键 - 加粗 Ctrl B - 斜体 Ctrl I - 引用 Ctrl Q- 插入链接 Ctrl L- 插入代码 Ctrl K- 插入图…