css鼠标悬停图文展示效果

css鼠标悬停图文展示效果

如题,要做到类似如下效果

鼠标移入前

overflow: hidden;

text-overflow: ellipsis;

white-space: nowrap;

word-break: break-all;

通过以上属性为超过行宽的span规定不换号和加上省略号,

鼠标移入后

将white-space改成normal让文本可以换行,再加上如下属性:

-webkit-line-clamp: 2;

display: -webkit-box;

-webkit-box-orient: vertical;

以上属性使span不能超过两行,超过加上省略号,

同时让span向上平移一定距离

鼠标移出后

将span往下平移回原位置,同时将属性还原为鼠标移入前


这样就实现了gif中的效果,但是gif中的那个span是没有背景色的,如果加上背景色,你就会发现鼠标移出后第二行突然消失,这是因为white- space不支持transcation,就会生硬,如果非要加上背景色,可以待向下平移动画完成后再改变white- space,这样第二行被隐藏了就看不出生硬了,

如下效果

重点就是监控向下平移的动画结束后修改white- space

showMore($event) {
      let sheetTitle = $event.currentTarget.querySelectorAll(".song-sheet-title")[0];
      let titleLimit = $event.currentTarget.querySelectorAll(".title-limit")[0];
      if (sheetTitle.clientWidth < titleLimit.offsetWidth + 4) { // 文本超过容器宽度
        sheetTitle.style.transform = "translate(0, -24px)";
        sheetTitle.style.whiteSpace = "normal";
        sheetTitle.classList.add("showMore");
      }
    },
removeMore($event) {
      let sheetTitle = $event.currentTarget.querySelectorAll(".song-sheet-title")[0];
      sheetTitle.classList.remove("showMore");
      sheetTitle.style.transform = "translate(0,0)";
      const changeRowShow = function () {
        sheetTitle.removeEventListener('transitionend', changeRowShow, false);
        // whiteSpace不支持动画, 所以多行会瞬间缩小到一行引起视觉突兀, 所以等待向下的动画完成后修改这个样式
        sheetTitle.style.whiteSpace = "nowrap";
      }
      sheetTitle.addEventListener('transitionend', changeRowShow, false);
}
编辑于 2021-12-02 23:17