关于这个功能有一个比较有名的jQuery插件dotdotdot.js,但用别人的插件总是觉得自由度不高,而且没法像animate一样让盒子动态伸缩,所以便花时间自己写了一个。
先贴上代码:
//文段溢出显示省略号 (外部盒子选择器,内部文段选择器,文段最大高度,省略号内容)
function overFlowDotDot(outBox, boxText, textMaxHeight, ellipsis)
{
var origiText = new Array(); //存放会溢出的文段内容原文/缩略文
var overHeight = new Array(); //存放原溢出高度
//初始化
for (var i=0; i<$(boxText).length; i++)
{
origiText[i] = "0";
overHeight[i] = 0;
}
$(boxText).each(function()
{
//判断文字是否溢出板块
if (parseInt($(this).css('height')) > textMaxHeight)
{
//存放好原文、溢出高度
var index = $(boxText).index(this);
origiText[index] = $(this).html();
overHeight[index] = parseInt($(this).css('height')) - textMaxHeight;
while (parseInt($(this).css('height')) > textMaxHeight)
{
var text = $(this).text();
var text = text.substring(0, text.length-10) + ellipsis;
$(this).html(text);
}
//鼠标显示为可点击
$(this).css('cursor', 'pointer');
}
});
//鼠标点击缩略了的文段
$(boxText).click(function()
{
var index = $(boxText).index(this);
if (origiText[index] != "0") //判断是不是有缩略的文段
{
var temp = $(this).html();
if ($(this).html().length < origiText[index].length) //判断是否已点开
{
$(this).parents(outBox).animate({height: "+=" + overHeight[index]}, 100, function()
{
$(this).find(boxText).html(origiText[index]);
origiText[index] = temp;
});
}
else
{
$(this).parents(outBox).animate({height: "-=" + overHeight[index]}, 100, function()
{
$(this).find(boxText).html(origiText[index]);
origiText[index] = temp;
});
}
}
})
}
效果大概如下:
因为我的文段是像这样放在一个有其他元素的盒子里,外部的盒子高度也要跟随伸缩变化,因此参数里有outBox外部盒子选择器和boxText内部文段的选择器两个,如果只有文段伸缩便自行修改下代码吧。
origiText和outHeight分别用于存放缩略前的文段和超出的高度,同时可通过判断origiText是否为空来判断该文段是否为缩略的文段。
存放好原文后,在一个while循环里用substring函数处理文段直至文段高度不超过最大高度。
点开缩略文段时,要先让高度animate变化,之后再在callback里改变文段内容,出来的效果才好看。
文段缩略时,origiText存放的是原文;文段点开时,origiText存放缩略文。