如何在 vue3 中使用了解更多按钮进行线夹
How to do line-clamp with a learn more button in vue3
我在我的一个项目中使用 vue3 和 vitejs,我偶然发现了一个问题。我有以下代码。
<div>
<p class="line-clamp-4">Some really long text here...</p>
<a id="read-more" href="readmore.html">Read more</a>
</div>
我在这里使用的是 tailwindcss,我能够限制 4 条线。我有一份这些文本的列表,并不是每个文本都有线夹。所以,我只想在应用线夹时显示阅读更多按钮。现在,我如何知道线夹应用到此文本并且我必须显示阅读更多按钮?
这是我为实现这一目标所做的工作:
@foreach($module->captions as $caption)
<div class="mt-1 relative">
<div id="body-{{$caption->id}}" class="text-md leading-7 text-gray-700 font-normal whitespace-pre-line line-clamp-6">
{{ $caption->body }}
</div>
</div>
<div id="readMore-{{$caption->id}}" class="hidden flex justify-center absolute bottom-0 left-0 bg-white w-full rounded-b-lg">
<p class="text-blue-600 cursor-pointer py-2"></p>
</div>
@endforeach
<script>
let elements = document.getElementsByClassName('line-clamp-6')
Array.from(elements).forEach((element) => {
let captionId = element.id.split('-')[1];
let body = document.getElementById('body-' + captionId)
let readMore = document.getElementById('readMore-' + captionId)
if (element.clientHeight === 168) {
readMore.firstElementChild.innerText = 'Read More'
readMore.classList.remove('hidden')
readMore.addEventListener('click', (el) => {
if (body.classList.contains('line-clamp-6')) {
body.classList.remove('line-clamp-6')
readMore.firstElementChild.innerText = 'Read Less'
} else {
body.classList.add('line-clamp-6')
readMore.firstElementChild.innerText = 'Read More'
}
})
}
})
</script>
在我的例子中,我使用 foreach 循环访问一些数据,但您仍然可以根据需要自定义它。基本上,我得到了 class 名称为 line-clamp-6
的所有元素。然后循环遍历这些元素以查看它们的 clientHeight 是否为 168。如果是,则它们需要阅读更多 link.
请记住,您可能需要检查不同的 clientHeight。
然后我会听到点击阅读更多 link 如果 line-clamp-6
存在则我们删除它否则我们添加它。
希望对您有所帮助。我在最后一个小时一起完成了这个,所以可能有更好的方法,但这似乎对我有用。
我在我的一个项目中使用 vue3 和 vitejs,我偶然发现了一个问题。我有以下代码。
<div>
<p class="line-clamp-4">Some really long text here...</p>
<a id="read-more" href="readmore.html">Read more</a>
</div>
我在这里使用的是 tailwindcss,我能够限制 4 条线。我有一份这些文本的列表,并不是每个文本都有线夹。所以,我只想在应用线夹时显示阅读更多按钮。现在,我如何知道线夹应用到此文本并且我必须显示阅读更多按钮?
这是我为实现这一目标所做的工作:
@foreach($module->captions as $caption)
<div class="mt-1 relative">
<div id="body-{{$caption->id}}" class="text-md leading-7 text-gray-700 font-normal whitespace-pre-line line-clamp-6">
{{ $caption->body }}
</div>
</div>
<div id="readMore-{{$caption->id}}" class="hidden flex justify-center absolute bottom-0 left-0 bg-white w-full rounded-b-lg">
<p class="text-blue-600 cursor-pointer py-2"></p>
</div>
@endforeach
<script>
let elements = document.getElementsByClassName('line-clamp-6')
Array.from(elements).forEach((element) => {
let captionId = element.id.split('-')[1];
let body = document.getElementById('body-' + captionId)
let readMore = document.getElementById('readMore-' + captionId)
if (element.clientHeight === 168) {
readMore.firstElementChild.innerText = 'Read More'
readMore.classList.remove('hidden')
readMore.addEventListener('click', (el) => {
if (body.classList.contains('line-clamp-6')) {
body.classList.remove('line-clamp-6')
readMore.firstElementChild.innerText = 'Read Less'
} else {
body.classList.add('line-clamp-6')
readMore.firstElementChild.innerText = 'Read More'
}
})
}
})
</script>
在我的例子中,我使用 foreach 循环访问一些数据,但您仍然可以根据需要自定义它。基本上,我得到了 class 名称为 line-clamp-6
的所有元素。然后循环遍历这些元素以查看它们的 clientHeight 是否为 168。如果是,则它们需要阅读更多 link.
请记住,您可能需要检查不同的 clientHeight。
然后我会听到点击阅读更多 link 如果 line-clamp-6
存在则我们删除它否则我们添加它。
希望对您有所帮助。我在最后一个小时一起完成了这个,所以可能有更好的方法,但这似乎对我有用。