这是一个使用JavaScript实现的实时字幕生成网站。
Just a moment…
这是网站加载时的提示信息,用户可以等待片刻,页面即将加载完成。
StyleSheet
该网站使用了一种简洁、现代化的设计风格,主要采用无衬线字体(Sans-Serif)和明亮的颜色搭配。CSS样式定义如下:
body { background-color: #fff; -webkit-font-smoothing: antialiased; font-family: BlinkMacSystemFont, Ping Fang SC, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
.sl-recap-content { color: #333; flex-grow: 1; display: flex; justify-content: flex-start; flex-direction: column;
}
.sl-recap-container { top: 50%; left: 50%; position: absolute; z-index: 2; transform: translate(-50%, -50%);
}
.sl-recap-host { font-size: 18px; text-align: center; margin-bottom: 20px;
}
上述代码定义了网页的背景颜色、字体以及各种元素的样式。其中,.sl-recap-content
类定义了内容区域的样式,.sl-recap-container
类定义了容器的位置和大小,.sl-recap-host
类定义了主标题的样式等。
JavaScript Code
除了CSS样式外,该网站还需要用到JavaScript来实现实时字幕生成的功能。具体代码如下:
”`javascript // 获取字幕内容所在的元素 const captionContainer = document.querySelector(‘.sl-caption’); const contentContainer = document.querySelector(‘.sl-content’); const captionText = document.querySelector(‘.sl-text’); const hostName = document.querySelector(‘.sl-hostname’); const startTimeButton = document.querySelector(‘.sl-startbutton’); const stopTimeButton = document.querySelector(‘.sl-stopbutton’); const resetButton = document.querySelector(‘.sl-resetbutton’); const downloadButton = document.querySelector(‘.sl-downloadbutton’); let isCaptioningEnabled = false; // 控制字幕显示/隐藏的状态变量 let isCaptioningTimerRunning = false; // 控制定时器是否正在运行的状态变量 let captionStartTimeMs = null; // 存储字幕开始时间的变量 let captionEndTimeMs = null; // 存储字幕结束时间的变量 let captions = []; // 存储字幕内容的数组 // 初始化字幕容器的样式设置 captionContainer.style.display = ‘none’; // 默认隐藏字幕容器 captionContainer.style.transform = ‘translate(0%)’; // 默认将字幕容器水平居中显示 // 为按钮添加点击事件处理函数 startTimeButton.addEventListener(‘click’, startCaptions); // 点击开始字幕按钮时触发该函数 stopTimeButton.addEventListener(‘click’, stopCaptions); // 点击停止字幕按钮时触发该函数 resetButton.addEventListener(‘click’, resetCaptions); // 点击重置字幕按钮时触发该函数 downloadButton.addEventListener(‘click’, downloadCaptions); // 点击下载字幕按钮时触发该函数 // 实现实时字幕生成的函数(在浏览器中运行) function generateCaptions() { if (!isCaptioningEnabled) return; // 如果当前未启用字幕功能,则直接返回不做任何操作 const nowTimeMs = Date.now(); // 获取当前时间戳(毫秒) if (isCaptioningTimerRunning && nowTimeMs > captionStartTimeMs + captionEndTimeMs) { // 如果定时器正在运行且已经超过了设定的结束时间,则停止定时器并关闭字幕容器 isCaptioningTimerRunning = false; captionContainer.style.display = ‘none’; // 将字幕容器隐藏起来 } else if (!isCaptioningTimerRunning && nowTimeMs >= captionStartTimeMs) { // 如果定时器未启动且已经到达了设定的开始时间,则启动定时器并显示字幕容器 isCaptioningTimerRunning = true; captionContainer.style.display = ‘flex’; // 将字幕容器显示出来并设置为水平居中对齐的方式 } else if (isCaptioningTimerRunning && nowTimeMs > (captionStartTimeMs + (CAPTION_DURATION_MS * Math.random()))) { // 如果定时器正在运行且当前时间已经超过了随机生成的结束时间(用于模拟不稳定的情况),则停止定时器并关闭字幕容器(同时更新结束时间以便于下次循环) isCaptioningTimerRunning = false; captionContainer.style.display = ‘none’; // 将字幕容器隐藏起来 } else if (isCaptioningTimerRunning) { // 如果定时器正在运行且当前时间还未达到设定的结束时间,则不执行任何操作(保持字幕容器显示状态) ; // do nothing } else if (!isCaptioningEnabled || captionStartTimeMs === null || captionEndTimeMs === null) { // 如果当前未启用字幕功能、或尚未设定开始/结束时间、或已经到达了结束时间,则不执行任何操作(保持字幕容器隐藏状态) ; // do nothing }; // end if statements for each condition above (else if). The else statement will be executed when none of the above conditions are met (i.e. the current time has not reached the end time yet and the subtitles are enabled) } // end generateCaptions function definition