如何用大语言模型做一个Html+CSS+JS的词卡网站
一、引言
词汇是语言学习的核心,如何有效地帮助学生记忆并使用词汇是英语教学中的一个重要课题。大语言模型精通各类编程语言,能够为开发各类小项目提供帮助。为了辅助外语教学中的词汇学习,我借助大语言模型开发有声词卡网站,网站的主要功能是能够读取上传的txt文本,同时根据提前设定好的间隔时间、朗读遍数,进行滚动朗读和显示。本网站主要采用html+style+CSS编写,利用xampp在本地进行调试,然后上传网站运行,使用者可以通过手机、电脑、平板等终端进行使用。
二、网站的主要特点
根据需求,采用人机多轮对话的形式,设计并开发了一款有声在线词汇教学程序——Vocabulary Flashcards。它结合了交互式设计和自动播放功能,旨在提升学生的学习体验,同时减轻教师的教学负担。网站的界面如下所示:
程序的主要特点包括:
1. 程序以卡片的形式展示目标词汇。用户可以选择不同的单元进行学习。
2. 自动播放与重复设置。 用户可设定单词播放的重复次数和间隔时间。自动播放功能支持学生无缝学习,无需手动切换单词。
3. 可定制化学习。提供学习单元选择、间隔时间设定、是否自动朗读、朗读遍数等自定义参数设定。学习过程中可以启用或禁用自动朗读、朗读遍数等设定。
4. 控制按钮。设定有开始、暂停、重置功能按钮,便于学习灵活掌控学习节奏。
三、网站的设计
本网站程序采用了HTML、CSS和JS,HTML用于前端展示,CSS来控制样式,JS代码来实现功能逻辑,以下是整体开发思路:
1. 前端设计
使用HTML结构化呈现单词卡片、控制面板及功能按钮。利用CSS优化页面布局,确保卡片和控件在不同设备上的良好适配。可以在手机、电脑上进行自适应显示和播放,方便用户随时随地学习、复习和巩固单词。
2. 功能逻辑实现
用大语言模型编写Js代码用于实现自动播放、重复次数控制及按钮功能响应。
利用DOM操作动态更新单词显示内容。
3. 界面设计优化
集用采用CSS代码来控制网页样式、字体颜色、控件样式等,使用户界面设计简洁直观,大大降低使用门槛。用户可自定义的学习参数,提升灵活性和实用性。
四、开发过程
首先要通过Chatgtp进行提问,说明生成的是一个html+css+js的英语词卡朗读网站,详细描述其功能是可以读取wordlist文件夹下面的txt文件,然后展示在页面上,并根据是否设置auto read words来朗读单词,播放的同时还可以设定播放间隔时间和次数。在生成的三个不同的代码中,把html代码先放在txt文档当中,然后保存为index.html, css代码放入txt文件中,另存为style.css,js代码存入txt,另存为script.js文件,和其它的文件语言在同一目录。
同时把单词存为txt文件,放入到wordlist文件夹中。调试时,可以直接使用chrome浏览器,打开index.html就可以看到效果,如果想省事一些,也可以打开这个Just a moment...网站,把对应的html, css, js代码放到对应的位置就可以看到效果。但是,自动读取txt的功能还需要放在服务器上才可以,因此可以使用xampp来模拟网络空间,把文件放到htdoc目录下面,运行服务器,就可以通过网页127.0.0.1来访问了。
调试过程中如果出现问题,还可以继续向Chatgpt进行提问,修改js的功能逻辑,优化页面设置,从而最终使程序变的更加完善。
程序在开发的过程中借鉴了有道发音的部分代码,融入到了js代码当中,同时修复了部分bug
五、代码展示
Html代码展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vocabulary Flashcards</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="flashcard">
<div class="word" id="wordDisplay">Welcome</div>
</div>
<div class="controls">
<div class="unit-controls">
<select id="textSelect" class="control-item">
<option value="Unit1">Unit 1</option>
<option value="Unit2">Unit 2</option>
</select>
<select id="repeatCount" class="control-item">
<option value="1">Repeat 1x</option>
<option value="2">Repeat 2x</option>
<option value="3">Repeat 3x</option>
<option value="4">Repeat 4x</option>
<option value="5">Repeat 5x</option>
</select>
</div>
<div class="settings-row">
<div class="interval-control">
<label for="interval">Interval (seconds):</label>
<input type="number" id="interval" min="1" max="10" value="2" class="control-item">
</div>
<div class="auto-read-control">
<label for="autoRead">
<input type="checkbox" id="autoRead" class="control-item" checked>
Auto Read Words
</label>
</div>
</div>
<div class="buttons">
<button id="startBtn" class="control-item">Start</button>
<button id="pauseBtn" class="control-item" disabled>Pause</button>
<button id="resetBtn" class="control-item">Reset</button>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
CSS代码展示:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-size: 13px;
}
body {
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #f0f2f5;
font-family: Arial, sans-serif;
}
.container {
width: 90%;
max-width: 600px;
display: flex;
flex-direction: column;
align-items: center;
gap: 2rem;
}
.flashcard {
width: 100%;
height: 200px;
background: white;
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
display: flex;
justify-content: center;
align-items: center;
transition: transform 0.3s ease;
}
.flashcard:hover {
transform: translateY(-5px);
}
.word {
font-size: 52px;
color: #007bff;
text-align: center;
padding: 2rem;
}
.controls {
width: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
align-items: center;
}
.control-item {
padding: 0.5rem 1rem;
border: 1px solid #ddd;
border-radius: 6px;
background: white;
cursor: pointer;
transition: all 0.3s ease;
}
.control-item:hover {
border-color: #007bff;
}
.unit-controls {
display: flex;
gap: 1rem;
align-items: center;
}
select.control-item {
width: 150px;
}
.settings-row {
display: flex;
align-items: center;
gap: 2rem;
flex-wrap: wrap;
justify-content: center;
}
.interval-control, .auto-read-control {
display: flex;
align-items: center;
gap: 1rem;
}
.auto-read-control input[type="checkbox"] {
width: 16px;
height: 16px;
margin-right: 8px;
}
input[type="number"] {
width: 80px;
}
.buttons {
display: flex;
gap: 1rem;
}
button.control-item {
min-width: 80px;
background: #007bff;
color: white;
border: none;
}
button.control-item:hover {
background: #0056b3;
}
button.control-item:disabled {
background: #cccccc;
cursor: not-allowed;
}
js代码展示
class FlashcardPlayer {
constructor() {
this.currentList = [];
this.currentIndex = 0;
this.interval = 2000; // 默认的间隔时间,最终会基于音频时长调整
this.timer = null;
this.isPlaying = false;
this.audioElement = new Audio();
this.currentRepeatCount = 0;
this.maxRepeatCount = 1;
// DOM Elements
this.wordDisplay = document.getElementById('wordDisplay');
this.textSelect = document.getElementById('textSelect');
this.intervalInput = document.getElementById('interval');
this.autoReadCheckbox = document.getElementById('autoRead');
this.repeatCountSelect = document.getElementById('repeatCount');
this.startBtn = document.getElementById('startBtn');
this.pauseBtn = document.getElementById('pauseBtn');
this.resetBtn = document.getElementById('resetBtn');
// Initialize
this.setupEventListeners();
this.loadWordList();
}
setupEventListeners() {
this.startBtn.addEventListener('click', () => this.start());
this.pauseBtn.addEventListener('click', () => this.pause());
this.resetBtn.addEventListener('click', () => this.reset());
this.textSelect.addEventListener('change', () => this.loadWordList());
this.intervalInput.addEventListener('change', () => {
this.interval = this.intervalInput.value * 1000;
if (this.isPlaying) {
this.pause();
this.start();
}
});
this.repeatCountSelect.addEventListener('change', () => {
this.maxRepeatCount = parseInt(this.repeatCountSelect.value);
});
}
async loadWordList() {
try {
// const response = await fetch(`./wordlist/${this.textSelect.value}.txt`);
const response = await fetch(`./wordlist/${selectedFile}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const text = await response.text();
this.currentList = text.split('\n').filter(word => word.trim() !== '');
this.currentIndex = 0;
this.wordDisplay.textContent = this.currentList[0];
} catch (error) {
console.error('Error loading word list:', error);
this.wordDisplay.textContent = 'Error loading words';
}
}
playWord(word, repeatCount, callback) {
if (this.autoReadCheckbox.checked) {
let count = 0;
const playAudio = () => {
if (count < repeatCount) {
const encodedWord = encodeURIComponent(word);
this.audioElement.src = `https://xx.com/dictvoice?audio=${encodedWord}&type=1`;
this.audioElement.play();
count++;
this.audioElement.onended = playAudio;
} else {
callback(); // 音频播放结束后调用回调,开始延迟
}
};
playAudio();
} else {
callback(); // 如果没有勾选自动朗读,直接执行延迟
}
}
start() {
if (!this.isPlaying) {
this.isPlaying = true;
this.startBtn.disabled = true;
this.pauseBtn.disabled = false;
this.currentRepeatCount = 0;
this.showNextWord();
}
}
pause() {
if (this.isPlaying) {
this.isPlaying = false;
this.startBtn.disabled = false;
this.pauseBtn.disabled = true;
clearTimeout(this.timer);
this.audioElement.pause();
}
}
reset() {
this.pause();
this.currentIndex = 0;
this.currentRepeatCount = 0;
this.wordDisplay.textContent = this.currentList[0]; // 更新单词显示为第一个单词
this.audioElement.pause();
}
showNextWord() {
if (!this.isPlaying) return;
const currentWord = this.currentList[this.currentIndex];
const repeatCount = parseInt(this.repeatCountSelect.value);
// 获取当前单词的朗读次数并播放音频
this.playWord(currentWord, repeatCount, () => {
// 在播放完当前单词后,延迟切换到下一个单词
this.timer = setTimeout(() => {
if (this.currentIndex >= this.currentList.length - 1) {
this.currentRepeatCount++;
if (this.currentRepeatCount >= this.maxRepeatCount) {
this.pause();
this.currentIndex = 0;
this.currentRepeatCount = 0;
return;
}
this.currentIndex = 0;
} else {
this.currentIndex++;
}
this.wordDisplay.textContent = this.currentList[this.currentIndex]; // 更新显示当前单词
this.showNextWord(); // 递归调用,继续播放下一个单词
}, this.interval); // 使用间隔时间来控制延迟
});
}
}
// Initialize the flashcard player when the page loads
document.addEventListener('DOMContentLoaded', () => {
new FlashcardPlayer();
});
六、未来改进方向
本项目是一个小型的词卡朗读网站,未来可以考虑从以下几个方面来持续改进:
1. 单词库扩展:引入用户系统,扩展功能,支持用户上传自定义单词库,满足不同学习者的个性化要求。
2. 学习数据分析:通过本地存储记录学生学习进度,提供个性化反馈。
3. 增加管理功能:把网页程序扩展为php页面,增加用户注册、管理,词库上传、改名和删除功能。
通过本次开发,我们不仅增强了个人利用大语言模型来进行Web开发的实践能力,还探索了如何将技术融入外语词汇。希望这款小工具能为英语词汇教学提供助力,同时也期待与更多教育工作者探讨改进的方向!