读者 Rob Young 在 Newsweek.com 上看到了一个很酷的效果。

文字在底部淡出,并带有“更多...”链接。 文字淡出在这里并不新鲜。 我已经有了 演示 很久了,它使用透明 PNG 文件覆盖在文字之上。 但由于这是一个略有不同的想法,并且时代在变化,我们可以更进一步地发展这个想法。
假设这些小文本框用在侧边栏中,因此我们的 HTML 标记将是一个带有 sidebar-box 类别的 div。 此 div 可以包含任意数量的段落元素,其中最后一个将具有 read-more 类名,其中包含一个链接按钮。
<div class="sidebar-box">
<p>malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>
<p class="read-more"><a href="#" class="button">Read More</a></p>
</div>
框的高度将通过适当的属性 max-height 限制,其 overflow 设置为隐藏。 我们还将使用相对定位,因为我们需要它在阅读更多段落上使用绝对定位,该段落锁定在框的底部,并使用 CSS3 渐变实现文字淡出。
.sidebar-box {
max-height: 120px;
position: relative;
overflow: hidden;
}
.sidebar-box .read-more {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
text-align: center;
margin: 0; padding: 30px 0;
/* "transparent" only works here because == rgba(0,0,0,0) */
background-image: linear-gradient(to bottom, transparent, black);
}
这给了我们

使用 jQuery 的“显示”
使此方法起作用的最简单方法是在点击时从侧边栏框中删除 max-height CSS。 这将使它立即扩展到所有包含段落的自然高度。 从理论上讲,您可以使用 CSS3 和 :target 来实现这一点,但这只是暂时的,会导致页面跳下。 我们可以使用 JavaScript 和 jQuery 的简单动画使它更优雅。
var $el, $ps, $up, totalHeight;
$(".sidebar-box .button").click(function() {
totalHeight = 0
$el = $(this);
$p = $el.parent();
$up = $p.parent();
$ps = $up.find("p:not('.read-more')");
// measure how tall inside should be by adding together heights of all inside paragraphs (except read-more paragraph)
$ps.each(function() {
totalHeight += $(this).outerHeight();
});
$up
.css({
// Set height to prevent instant jumpdown when max height is removed
"height": $up.height(),
"max-height": 9999
})
.animate({
"height": totalHeight
});
// fade out read-more
$p.fadeOut();
// prevent jump-down
return false;
});
因此,用简单的话来说,当在一个 sidebar-box 内点击一个按钮时,找到所有相关的参与者(父元素等),测量一个新的理想高度,动画到那个新的高度,然后删除按钮。
关于透明度和渐变的快速说明
我花了一些时间试图弄清楚一个使用 CSS3 渐变并从“透明”淡化为常规十六进制颜色的 奇怪的问题 。 它似乎颜色正在乘到背景上。 实际上发生的是,单词“透明”实际上只是映射到“rgba(0, 0, 0, 0)” ,这意味着“完全透明的黑色”。 因此,当构建渐变时,中间颜色与不完全透明的黑色混合。 为了解决此问题,您需要在起始颜色和淡化为的颜色中使用 RGBa 颜色,即使它是完全透明的。 例如,对于红色从红色淡化为透明
background-image: -webkit-gradient(
linear,
left top,
left bottom,
color-stop(0, rgba(255, 0, 0, 0)),
color-stop(1, rgba(255, 0, 0, 100)));
不要忘记所有其他渐变语法。 CSS3 Please! 是一个获取最新的 CSS3 语法的绝佳资源。
感谢 @foodgoesinmouth、@sebnitu、@maddesigns 和其他人...
从理论上讲,无法使用
:target和-webkit-transition来实现与使用 jQuery 相同的效果吗?如果使用上述提议的方法,是否会遇到任何障碍?
(顺便说一下,好帖子 Chris)
我对 :target 的问题是它会导致跳下,因为您需要使用井号链接。 有些 方法可以使它不那么令人反感 ,但我认为它仍然不理想。 我几乎希望在 CSS 本身中可以使用 .preventDefault() =)
但是,也许您只需要在链接上使用
onclick="return false;"就可以用纯 CSS3 完成剩下的工作...您知道,在这种情况下,您只需要使用
pointer-events:none;,您就不需要.preventDefault()或onclick=""return false;"。但这将无法跨浏览器兼容,但嘿,CSS 渐变也不太兼容(至少现在是这样的)。 因此,这将很好地满足 .preventDefault() 在这种情况下的作用。
我经常使用“在这种情况下”,因为
pointer-events:none;只能停止指针事件(如悬停、点击等)的默认操作。 但它确实在这种情况满足了 .preventDefault 的要求。使用
pointer-events:none;代替.preventDefault()是否会得到与帖子中显示的(几乎)相同的结果?pointer-events 不会起作用,因为那样你就无法点击按钮,因此 URL 中的井号永远不会改变,然后你就无法使用 :target。
所以它只是以更美观的方式做浏览器自己做的事情。
这就像您之前设计此网站的初始版本中的那样,在人们用干草叉起义之前吗? 在暴民把它赶出城市之前我从未见过它。 我喜欢它。
像往常一样,您拥有最好的信息,我需要知道:您睡觉吗? :)
逻辑是什么?
有时候你会弄死我 Chris :)
您对 CSS 的了解总是令人印象深刻。 我希望有一个第二意见侧栏,由从事可用性方面工作的某人来解决任何给定 CSS 技巧的实用性和可用性。
事实上,我很想和你聊聊这件事...
我认为这将是一个非常酷的(嘉宾=)) 博客文章。 拿出一些无上下文的小型 UI 示例,并确定它们是否是
…或者这些的某种变体。
你有我的电子邮件地址,给我发邮件讨论。
像往常一样...非常棒的效果! 我喜欢您网站的新布局 :)
不错的效果。 我宁愿在最后两行或更多行上使用不透明度属性。 如果您的背景不是纯色,渐变将不起作用。
问题是,如果文本后面有一个非纯色背景,渐变就不会平滑,但是,如果您使用 css mask-image,它是一个更灵活的解决方案。
这是一篇非常高质量的文章。 从理论上讲,我也想这样写——花时间和真正的努力来写一篇有趣的文章...但我能说什么呢...我拖延了很多,似乎从未完成
jQuery 中有趣的代码嵌套和格式。
叫我笨蛋,但从理论上讲,您不能只使用透明 PNG 并将其固定到底部来实现某种程度上的相同效果吗?
那并不愚蠢,那很好。 那只是需要一个图像,这需要额外的请求并且更难更新。 这里的想法是如果可以的话,更进一步。
我收藏了您的网站以获取更多更新。 博客设计也很棒!
我非常感谢作者分享了这些好信息
在 FF 和 Chrome 中效果很好。在 Opera 中效果不佳。
不错的效果,但说真的,这算是好的排版吗?
感谢分享,一如既往地棒
使用您的 JavaScript,我会在点击函数内声明变量(“var $el, $ps, $up, totalHeight;”),这样就不会污染全局命名空间。反正它们在点击事件之外也不需要 :)
我在我的一个网站上也有类似的东西,但它没有淡入淡出效果。我认为淡入淡出效果可以提高可用性,因为它暗示着还有更多内容。
谢谢!
不错的视觉效果,感谢分享 Chris!
非常酷,Chris。
为什么不把“阅读更多”嵌入一个渐变透明的 png 中呢?
感谢您的帖子……为什么不使用一个包含嵌入渐变的 png 呢?在我看来,这似乎是最简单的解决方案。
感谢分享精彩的帖子。我想知道,这是否可以在所有浏览器中正常工作,而无需使用 jQuery 选项?
我们可以更改背景颜色吗?
以及在哪里更改?
您好!如何将淡入淡出文本的方向改为从右侧开始?
您好,博客很棒。
我只想要两个盒子,但我很难将它们居中显示在页面上。有人知道怎么做吗?
另外,是否可以使其响应式?
谢谢,
John
非常酷。如果我们可以切换显示隐藏内容,那就更好了!
是否可以添加“阅读更少”按钮来关闭文本?
我和 Osvaldo 想的一样。我找到了一个解决方案。以下代码展示了添加点击事件的原始代码块,如果您点击段落,它会恢复到原始状态。
$up.css({
// 设置高度,以防止在移除最大高度时立即跳下
"height": $up.height(),
"max-height": 9999
})
.animate({
"height": totalHeight
})
.click(function() {
// 展开后,点击段落以恢复到原始状态
$p.fadeIn();
$up.animate({
"height": 120
});
});
非常好!我一直在寻找这个。
谢谢。
还有一个问题:可以使它使用白色背景吗?