赞
踩
最近在仿写——起点中文网的微信小程序,在书籍简介中存在一个需求
简介文本超出规定的范围出现省略号以及展开按钮
网上其他做法都是js控制,但是一般开发中,能不写js就不写js,下面我将通过css方式实现此效果
思路:
代码:
wxml:
<view class="topIntroduct">
<view class="text {{introductFlag ?'foldIntroduct':''}} ">
{{bookDetailData.bookIntroduct}}//文本内容
//下面的是展开按钮那一部分,其中的文本内容是需要动态的设置::after/::before设置
<view class="fold" bindtap="fold" data-text="{{foldText}}" data-etc="{{textEtc}}"></view>
</view>
</view>
css:
/**小说简介 */ .topIntroduct{ width:100%; } .topIntroduct .text{ //文本的view实现父级的相对定位,并实现省略号 width:90%; margin:10rpx auto; line-height:60rpx; color:#64676e; position: relative; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; //设置超出几行省略内容 text-overflow:ellipsis; overflow: hidden; } .fold::before{ //设置在文本下面的展开按钮那一部分,此部分的前面设置——...省略号,并通过绝对定位设置在超出部分的后面 content:attr(data-etc); position: absolute; left:0; bottom:-10rpx; transform: translateX(4rpx); } .fold::after{ //设置文本下面的展开按钮的那一部分,此部分的后面设置——展开 展开按钮,并通过绝对定位设置在省略号的后面 content:attr(data-text); position:absolute; bottom:-10rpx; right:0; color:#409eff; } .fold{ //展开按钮的那一部分,同样设置绝对定位,并设置宽高,将通过样式实现的省略号遮住,同时将::before和::after展开的内容设置在里面 width:105rpx; height:35rpx; position: absolute; right:0; bottom:0; background-color:#fff; } .foldIntroduct{ //出现此样式名时,设置不出现省略号和展开按钮 -webkit-line-clamp:inherit!important; }
展现步骤
1.第一步骤
2.第二步骤
设置完成后,将会出现效果
——同时出现另一个需求,点击简介后,如果没有超出三行(自定义的超出部分),将不会出现省略号和展开效果。
<view class="fold" bindtap="fold" data-text="{{foldText}}" data-etc="{{textEtc}}"></view>
.fold::before{
content:attr(data-etc);
position: absolute;
left:0;
bottom:-10rpx;
transform: translateX(4rpx);
}
.fold::after{
content:attr(data-text);
position:absolute;
bottom:-10rpx;
right:0;
color:#409eff;
}
js代码:
data{
introductFlag:false,//设置点击时,是否出现全文还是出现省略号和展开按钮
foldText:'展开', //控制简介中展开和收起的出现与否
textEtc:"...", //控制简介中省略号的出现与否
},
//简介的展开
async fold(e){
await this.setData({
introductFlag:!this.data.introductFlag,
})
this.setData({
foldText:this.data.introductFlag==true? '收起':'展开',
textEtc:this.data.introductFlag==true? ' ':'...'
})
},
四.完整代码
wxml:
<view class="topIntroduct">
<view class="text {{introductFlag ?'foldIntroduct':''}} ">
{{bookDetailData.bookIntroduct}}//文本内容
//下面的是展开按钮那一部分,其中的文本内容是需要动态的设置::after/::before设置
<view class="fold" bindtap="fold" data-text="{{foldText}}" data-etc="{{textEtc}}"></view>
</view>
</view>
css:
/**小说简介 */ .topIntroduct{ width:100%; } .topIntroduct .text{ //文本的view实现父级的相对定位,并实现省略号 width:90%; margin:10rpx auto; line-height:60rpx; color:#64676e; position: relative; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; //设置超出几行省略内容 text-overflow:ellipsis; overflow: hidden; } .fold::before{ //设置在文本下面的展开按钮那一部分,此部分的前面设置——...省略号,并通过绝对定位设置在超出部分的后面 content:attr(data-etc); position: absolute; left:0; bottom:-10rpx; transform: translateX(4rpx); } .fold::after{ //设置文本下面的展开按钮的那一部分,此部分的后面设置——展开 展开按钮,并通过绝对定位设置在省略号的后面 content:attr(data-text); position:absolute; bottom:-10rpx; right:0; color:#409eff; } .fold{ //展开按钮的那一部分,同样设置绝对定位,并设置宽高,将通过样式实现的省略号遮住,同时将::before和::after展开的内容设置在里面 width:105rpx; height:35rpx; position: absolute; right:0; bottom:0; background-color:#fff; } .foldIntroduct{ //出现此样式名时,设置不出现省略号和展开按钮 -webkit-line-clamp:inherit!important; }
js代码:
data{
introductFlag:false,//设置点击时,是否出现全文还是出现省略号和展开按钮
foldText:'展开', //控制简介中展开和收起的出现与否
textEtc:"...", //控制简介中省略号的出现与否
},
//简介的展开
async fold(e){
await this.setData({
introductFlag:!this.data.introductFlag,
})
this.setData({
foldText:this.data.introductFlag==true? '收起':'展开',
textEtc:this.data.introductFlag==true? ' ':'...'
})
},
(时隔一年多,昨天又碰到了类似的需求,最后在一篇回答中得到了启发,line-height)
上文中会出现一个问题,那怎样判断内容到底是几行,如果超过三行出现省略号,不超过不出现省略号同时不出现“展开”字样
——不出现省略号可以通过样式( -webkit-line-clamp: 3;)去控制,那“展开”的功能该怎样去判断
思路:
1.css中存在一个属性line-height,这是内容的每一行的行高,如果设置了line-height,如果存在三行,那是否意味着该内容的高度为3*line-height
观察我批注的地方,我设置了line-height:20px;左侧的高度是为60px的,但因为截图有限,无法展示,但可通过window.getComputedStyle(ele,null)来获取该元素的所有的样式,然后进行计算,得出该内容的行数
let height=window.getComputedStyle(ele,null).height//可以获取该元素的实际高度
let row=height/(line-height的高度)//此时得到的就是行数
let heightVal=height.substring(0,height.length-2) //去掉px
console.log(height,heightVal/20)
if(heightVal/20>=3){ //line-height=20px; 超过三行
console.log('rrrr超过三行',)
}else{
console.log('ttt不超过三行')
}
完结:
——此时已经可以得出了该内容的行数,那之后的事情,就是通过行数来判断“展开”字样是否显示了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。