如何在TimelineJS3的单条时间线条目(单张幻灯片)中添加多张图片/音频/视频?
别慌,我之前刚好折腾过这个需求,给你一步步捋清楚怎么改本地的TimelineJS3代码来实现:
1. 先调整你的数据源结构
TimelineJS3默认每个幻灯片(slide)只有一个media字段,咱们得给每个需要多媒体的幻灯片加一个media_collection数组,用来存所有你要加的媒体。
如果你用JSON作为数据源,修改后大概是这样:
{ "date": { "start": "2024-01-01" }, "text": { "headline": "我的多媒体幻灯片", "text": "这是包含多张图片、音频和视频的幻灯片" }, "media_collection": [ { "url": "path/to/your/image1.jpg", "caption": "第一张图片的说明", "type": "image" }, { "url": "path/to/your/audio-file.mp3", "caption": "这段音频的介绍", "type": "audio" }, { "url": "path/to/your/video-file.mp4", "caption": "视频的说明文字", "type": "video" } ] }
要是你用Google Sheets做数据源,可以加一列media_collection,把每个媒体的JSON字符串填进去就行,不过本地开发的话用JSON会更直接好调试。
2. 修改TimelineJS的幻灯片模板
找到源码里的src/html/templates/slide.html(TimelineJS用Handlebars模板渲染页面),原来的代码只处理单个media对象,咱们改成循环渲染media_collection里的所有媒体:
原来的模板代码大概是这样:
{{#if media}} <div class="media"> {{> media media}} </div> {{/if}}
把它替换成下面的代码(保留原来的单媒体渲染,兼容旧的数据源):
{{#if media_collection}} <div class="media-collection"> {{#each media_collection}} <div class="media-item"> {{> media this}} </div> {{/each}} </div> {{/if}} <!-- 保留原有单媒体渲染逻辑,避免旧幻灯片出问题 --> {{#if media}} <div class="media"> {{> media media}} </div> {{/if}}
这样模板就会自动遍历media_collection里的每一项,用TimelineJS原生的媒体组件渲染。
3. 加CSS样式让多媒体排版好看
默认的排版会把媒体堆在一起,咱们去src/css/timeline.css里加一点样式,让多个媒体能整齐排列:
.media-collection { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1rem; } .media-item { flex: 1 1 300px; max-width: 45%; } .media-item img, .media-item audio, .media-item video { width: 100%; height: auto; }
这个样式会让媒体组件弹性排列,自适应不同屏幕宽度,看起来更舒服。
4. 重新编译代码(重要!)
TimelineJS3是用构建工具把源码打包成生产可用的文件的。你在VS Code里打开终端,先跑npm install安装依赖,然后执行grunt build(如果用的是Grunt,看项目里的package.json确认构建命令),把修改后的模板和CSS编译到dist目录里,之后就用dist里的文件来运行你的时间线。
5. 临时替代方案(不想改代码的话)
要是你暂时不想动源码,也可以在幻灯片的text字段里直接写HTML插入媒体,比如:
"text": { "headline": "临时方案的幻灯片", "text": "这是用HTML插入的多媒体<br><img src='path/to/your/image.jpg' alt='图片说明'><br><audio controls src='path/to/your/audio.mp3'></audio><br><video controls src='path/to/your/video.mp4'></video>" }
不过这个方法的缺点是,插入的媒体没有TimelineJS原生媒体组件的样式和交互,只是纯HTML元素,所以还是改源码的方法更靠谱。
备注:内容来源于stack exchange,提问作者Anthony Shuey

