使用react、CSS使悬停时文本溢出可见

t40tm48m  于 2023-03-09  发布在  React
关注(0)|答案(1)|浏览(198)

我有一个包含书名的div数组,我使用.map函数对从数据库中获取的数据生成了这些div,其中一些书名太长了,所以我使用了下面的CSS来隐藏它们:

.book-title{
  font-weight: 600;
  height: 1.5rem;
    max-width: 15rem;
    overflow: hidden;
    padding-top: 0.7rem;
}

但是我希望当用户悬停在div上时文本可见。我目前的解决方案适用于.map函数生成和显示的所有div-我不确定如何使其仅适用于文本太长的div。

.book-title:hover{
  height: 6rem;
  overflow: visible;
}

有没有一种合适的方法可以用react来实现这一点?
下面是相关的.jsx

const listsForFrontPage = listArray.map((book, id) => {
    return (
      <Link className="book-link" to={`/books/${book.book_id}`} key={id}>
        <div className="book-card">
          <div className="book-card-image">
            <img
              className="cover-image"
              src={book.cover_image}
              alt="The book cover"
            />
          </div>
          <div className="book-info">
            <div className="book-title">{book.title}</div>
            <div className="author-name">{book.name}</div>
          </div>
        </div>
      </Link>
    )
  })
8zzbczxx

8zzbczxx1#

您需要检查元素是否溢出
添加用户参考:

const refs = useRef(listArray.map(() => React.createRef()));

那么你应该创建一个函数来检查元素是否溢出:

const isOverflown = (el) => {
    if(!el) return;
    const { clientWidth, clientHeight, scrollWidth, scrollHeight } = el;
    return scrollHeight > clientHeight || scrollWidth > clientWidth;
  }

然后需要根据isOverflated值添加类:

const listsForFrontPage = listArray.map((book, id) => {
    return (
      <Link className="book-link" to={`/books/${book.book_id}`} key={id}>
        <div className="book-card">
          <div className="book-card-image">
            <img
              className="cover-image"
              src={book.cover_image}
              alt="The book cover"
            />
          </div>
          <div className="book-info">
            <div ref={refs.current[id]} className={`book-title ${isOverflown(refs.current[id].current) ? 'book-title-overflow' : ''}`}>{book.title}</div>
            <div className="author-name">{book.name}</div>
          </div>
        </div>
      </Link>
    )
  })

别忘了加上你的css:

.book-title-overflow:hover{
  height: 6rem;
  overflow: visible;
}

相关问题