假设我想要连续显示两个非常相似的图像(首先是一张照片,第二张是同一张照片,其中一些区域突出显示)。我想避免过渡动画,只是让第二张图像替换第一张图像。这可能是reveal.js
吗?
设置data-transition="none"
并不能很好地工作,因为上一张幻灯片仍保留其动画。
答案 0 :(得分:11)
Reveal.js本身没有任何直接的方法来处理所要求的内容。但是,可以使用div
容器和reveal.js的fragment功能来完成。容器包括绝对定位在其中的图像,并且因此必须具有固定尺寸。
以下html显示第一张图片,下一张幻灯片显示第一张图片。
<section>
<h1>Slide 1</h1>
<div style="position:relative; width:640px; height:480px; margin:0 auto;">
<img class="fragment" width="640" height="480" src="img1.jpg" style="position:absolute;top:0;left:0;" />
<img class="fragment" width="640" height="480" src="img2.jpg" style="position:absolute;top:0;left:0;" />
</div>
</section>
当这段html显示第一张图片时,在下一张幻灯片上,第一张图片淡出,第二张图片淡入。
<section>
<h1>Slide 2</h1>
<div style="position:relative; width:640px; height:480px; margin:0 auto;">
<img class="fragment fade-out" data-fragment-index="0" width="640" height="480" src="img1.jpg" style="position:absolute;top:0;left:0;" />
<img class="fragment fade-in" data-fragment-index="0" width="640" height="480" src="img2.jpg" style="position:absolute;top:0;left:0;" />
</div>
</section>
答案 1 :(得分:3)
另一种可能的解决方案是使用Javascript。
假设您有一个标题,并且您有三张图像应该在同一部分内相互显示。我们可以扩展片段的功能。
html看起来像:
<section>
<h3>Your title</h3>
<img src="" />
<div>
<span class="fragment imgsrc" data-src="img/pic1.svg" data-fragment-index="0"></span>
<span class="fragment imgsrc" data-src="img/pic2.svg" data-fragment-index="1"></span>
<span class="fragment imgsrc" data-src="img/pic3.svg" data-fragment-index="2"></span>
</div>
</section>
现在我们添加一个函数fadeImage()
,并在每次触发fragmentshown
或fragmenthidden
时调用它。
function fadeImage($el) {
// Get image DOM element
$img = $el.parent().siblings('img');
// Fade the image out, change source and fade in again
$img.fadeOut(100, function() {
$img.attr('src', $el.data('src'));
$img.fadeIn(500);
});
}
Reveal.addEventListener('fragmentshown', function(event) {
// Get DOM element of current fragment
var $el = $(event.fragment);
// Check if current fragment is of 'type' imgsrc
// If yes: fade image with source of current element
if($el.hasClass('imgsrc'))
fadeImage($el);
});
Reveal.addEventListener('fragmenthidden', function(event) {
// Get DOM element of current fragment
var $el = $(event.fragment);
// Check if current fragment is of 'type' imgsrc
// If yes: fade image with source of previous element
if($el.hasClass('imgsrc')) {
fadeImage($el.prev());
}
});
由于我们刚刚扩展了片段功能,我们仍然可以使用data-fragment-index
属性。例如,您可以显示每个图像的描述。
该解决方案可以轻松优化/定制。
答案 2 :(得分:0)
您可以指定两个转换,用于进入和离开,因此以下工作但有毛刺(出现时图像闪烁):
<section data-transition="slide none">
<img src="timeline2.a.svg">
</section>
<section data-transition="none">
<img src="timeline2.b.svg">
</section>
<section data-transition="none side">
<img src="timeline2.c.svg">
</section>
否则这也可能是一个解决方案,这与你想要的有点不同但是也不错:
<section data-transition="slide fade-out">
<img src="timeline2.a.svg">
</section>
<section data-transition="fade-in fade-out">
<img src="timeline2.b.svg">
</section>
<section data-transition="fade-in side">
<img src="timeline2.c.svg">
</section>
答案 3 :(得分:0)
reveal.js 4.0引入了一个新的r-stack
类,可以更轻松地将元素堆叠在一起。
<div class="r-stack">
<img class="fragment" src="https://placekitten.com/450/300" width="450" height="300">
<img class="fragment" src="https://placekitten.com/300/450" width="300" height="450">
<img class="fragment" src="https://placekitten.com/400/400" width="400" height="400">
</div>
以上示例使彼此重叠的图像渐隐。如果您想一次只显示一张图像,则需要使用稍微不同的片段设置。
<div class="r-stack">
<img class="fragment current-visible" src="...">
<img class="fragment current-visible" src="...">
<img class="fragment" src="...">
</div>
您可以在Reveal.js文档https://revealjs.com/layout/#stack
中看到有关此工作原理的示例。答案 4 :(得分:-1)
假设您使用data-background
来显示照片,那么您需要使用data-background-transition="none"
来获得所需的效果。