幼儿时钟学习应用设计

03 11月
作者:cinjep|分类:辅助教学

一个既有趣又教育性的时钟应用,帮助幼儿认识时间、时针、分针和秒针,以及它们之间的关系。

幼儿认识时钟.PNG

以下是实现代码( 由 deepseek 依据人工指令生成):

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>幼儿时钟学习应用</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Comic Sans MS', 'Marker Felt', sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #ffccd5, #c9e9ff);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            color: #333;
            user-select: none;
        }
        
        header {
            text-align: center;
            margin-bottom: 20px;
        }
        
        h1 {
            color: #ff6b6b;
            font-size: 2.5rem;
            margin-bottom: 10px;
            text-shadow: 2px 2px 0 #fff;
        }
        
        .subtitle {
            font-size: 1.2rem;
            color: #555;
            max-width: 600px;
        }
        
        .container {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 40px;
            max-width: 1200px;
            width: 100%;
        }
        
        .clock-section {
            display: flex;
            flex-direction: column;
            align-items: center;
            background-color: rgba(255, 255, 255, 0.8);
            border-radius: 20px;
            padding: 20px;
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
            flex: 1;
            min-width: 300px;
            max-width: 500px;
        }
        
        .clock-face {
            width: 300px;
            height: 300px;
            border-radius: 50%;
            background-color: #fff9e6;
            border: 15px solid #ffcc00;
            position: relative;
            margin: 20px 0;
            box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.1);
            cursor: pointer;
        }
        
        .hour-hand, .minute-hand, .second-hand {
            position: absolute;
            transform-origin: bottom center;
            border-radius: 10px;
            left: 50%;
            bottom: 50%;
            transition: none;
        }
        
        .hour-hand {
            width: 8px;
            height: 80px;
            background-color: #ff6b6b;
            margin-left: -4px;
            z-index: 3;
            cursor: grab;
        }
        
        .minute-hand {
            width: 6px;
            height: 110px;
            background-color: #4d96ff;
            margin-left: -3px;
            z-index: 2;
            cursor: grab;
        }
        
        .second-hand {
            width: 2px;
            height: 130px;
            background-color: #ffcc00;
            margin-left: -1px;
            z-index: 1;
            cursor: grab;
        }
        
        .center-circle {
            position: absolute;
            width: 20px;
            height: 20px;
            background-color: #333;
            border-radius: 50%;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            z-index: 4;
        }
        
        .hour-mark {
            position: absolute;
            width: 4px;
            height: 20px;
            background-color: #333;
            left: 50%;
            top: 0;
            margin-left: -2px;
            transform-origin: 50% 135px;
        }
        
        .minute-mark {
            position: absolute;
            width: 2px;
            height: 10px;
            background-color: #999;
            left: 50%;
            top: 0;
            margin-left: -1px;
            transform-origin: 50% 135px;
        }
        
        .hour-text {
            position: absolute;
            font-size: 24px;
            font-weight: bold;
            color: #333;
            transform: translate(-50%, -50%);
            user-select: none;
            pointer-events: none;
        }
        
        .digital-clock {
            font-size: 2.5rem;
            font-weight: bold;
            color: #ff6b6b;
            background-color: #fff;
            padding: 15px 30px;
            border-radius: 15px;
            margin: 20px 0;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
            text-align: center;
            transition: opacity 0.3s ease;
        }
        
        .digital-clock.hidden {
            opacity: 0;
        }
        
        .controls {
            display: flex;
            flex-direction: column;
            gap: 15px;
            width: 100%;
            margin-top: 20px;
        }
        
        .time-input-section {
            display: flex;
            flex-direction: column;
            gap: 10px;
            width: 100%;
        }
        
        .time-input {
            display: flex;
            gap: 10px;
            align-items: center;
            justify-content: center;
        }
        
        input[type="number"] {
            width: 60px;
            padding: 10px;
            border: 2px solid #4d96ff;
            border-radius: 10px;
            font-size: 1.1rem;
            text-align: center;
        }
        
        button {
            color: white;
            border: none;
            padding: 12px 20px;
            border-radius: 50px;
            font-size: 1rem;
            cursor: pointer;
            transition: all 0.3s;
            width: 100%;
            position: relative;
            overflow: hidden;
        }
        
        button::after {
            content: '';
            position: absolute;
            top: 50%;
            left: 50%;
            width: 5px;
            height: 5px;
            background: rgba(255, 255, 255, 0.5);
            opacity: 0;
            border-radius: 100%;
            transform: scale(1, 1) translate(-50%);
            transform-origin: 50% 50%;
        }
        
        button:focus:not(:active)::after {
            animation: ripple 1s ease-out;
        }
        
        @keyframes ripple {
            0% {
                transform: scale(0, 0);
                opacity: 0.5;
            }
            100% {
                transform: scale(20, 20);
                opacity: 0;
            }
        }
        
        button:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 0 rgba(0, 0, 0, 0.2);
        }
        
        button:active {
            transform: translateY(2px);
            box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2);
        }
        
        .button-row {
            display: flex;
            gap: 10px;
            width: 100%;
        }
        
        .quarter-width {
            width: 25%;
        }
        
        .set-time-btn {
            background-color: #FF6B6B;
            box-shadow: 0 4px 0 #E74C3C;
        }
        
        .set-time-btn:hover {
            background-color: #FF8E8E;
        }
        
        .show-time-btn {
            background-color: #4D96FF;
            box-shadow: 0 4px 0 #2D6BC2;
        }
        
        .show-time-btn:hover {
            background-color: #6AA8FF;
        }
        
        .toggle-minute-marks {
            background-color: #6C5CE7;
            box-shadow: 0 4px 0 #4834D4;
        }
        
        .toggle-minute-marks:hover {
            background-color: #7D6FF0;
        }
        
        .toggle-minute-marks.active {
            background-color: #FF9F43;
            box-shadow: 0 4px 0 #E67E22;
        }
        
        .toggle-minute-marks.active:hover {
            background-color: #FFAF60;
        }
        
        .toggle-digital-clock {
            background-color: #00B894;
            box-shadow: 0 4px 0 #009975;
        }
        
        .toggle-digital-clock:hover {
            background-color: #26C9A8;
        }
        
        .toggle-digital-clock.active {
            background-color: #FD79A8;
            box-shadow: 0 4px 0 #E84393;
        }
        
        .toggle-digital-clock.active:hover {
            background-color: #FF94BE;
        }
        
        .explanation {
            background-color: rgba(255, 255, 255, 0.8);
            border-radius: 20px;
            padding: 25px;
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
            flex: 1;
            min-width: 300px;
            max-width: 500px;
        }
        
        .explanation h2 {
            color: #ff6b6b;
            margin-bottom: 15px;
            text-align: center;
        }
        
        .explanation p {
            margin-bottom: 15px;
            line-height: 1.6;
            font-size: 1.1rem;
        }
        
        .pointer-info {
            display: flex;
            flex-direction: column;
            gap: 15px;
            margin-top: 20px;
        }
        
        .pointer-item {
            display: flex;
            align-items: center;
            gap: 15px;
            padding: 10px;
            border-radius: 10px;
            background-color: rgba(255, 255, 255, 0.7);
        }
        
        .pointer-color {
            width: 30px;
            height: 8px;
            border-radius: 4px;
        }
        
        .hour-color {
            background-color: #ff6b6b;
        }
        
        .minute-color {
            background-color: #4d96ff;
        }
        
        .second-color {
            background-color: #ffcc00;
        }
        
        .highlight {
            background-color: #ffeb3b;
            padding: 3px 6px;
            border-radius: 5px;
            font-weight: bold;
        }
        
        .instructions {
            margin-top: 20px;
            padding: 15px;
            background-color: #e6f7ff;
            border-radius: 10px;
            border-left: 5px solid #4d96ff;
        }
        
        footer {
            margin-top: 30px;
            text-align: center;
            color: #666;
            font-size: 0.9rem;
        }
        
        @media (max-width: 768px) {
            .container {
                flex-direction: column;
                align-items: center;
            }
            
            .clock-section, .explanation {
                width: 100%;
            }
            
            .button-row {
                flex-wrap: wrap;
            }
            
            .quarter-width {
                width: 48%;
            }
        }
    </style>
</head>
<body>
    <header>
        <h1>幼儿时钟学习应用</h1>
        <p>帮助小朋友认识时钟,了解时针、分针和秒针的关系</p>
    </header>
    
    <div>
        <div>
            <div id="clock">
                <!-- 时钟刻度将通过JavaScript生成 -->
            </div>
            
            <div id="digitalClock">
                00:00:00
            </div>
            
            <div>
                <div>
                    <div>
                        <input type="number" id="hourInput" min="0" max="23" placeholder="时" value="12">
                        <span>:</span>
                        <input type="number" id="minuteInput" min="0" max="59" placeholder="分" value="0">
                        <span>:</span>
                        <input type="number" id="secondInput" min="0" max="59" placeholder="秒" value="0">
                    </div>
                </div>
                
                <div>
                    <button id="setTime" class="set-time-btn quarter-width">设置时间</button>
                    <button id="showTime" class="show-time-btn quarter-width">显示当前时间</button>
                    <button id="toggleMinuteMarks" class="toggle-minute-marks quarter-width">显示分钟刻度</button>
                    <button id="toggleDigitalClock" class="toggle-digital-clock quarter-width">隐藏数字时间</button>
                </div>
            </div>
        </div>
        
        <div>
            <h2>时钟小知识</h2>
            <p>时钟帮助我们了解一天中的时间。时钟有三根指针:</p>
            
            <div>
                <div>
                    <div class="pointer-color hour-color"></div>
                    <div>
                        <strong>时针</strong> - 最短最粗的指针,走得最慢,表示小时
                    </div>
                </div>
                
                <div>
                    <div class="pointer-color minute-color"></div>
                    <div>
                        <strong>分针</strong> - 中等长度的指针,表示分钟
                    </div>
                </div>
                
                <div>
                    <div class="pointer-color second-color"></div>
                    <div>
                        <strong>秒针</strong> - 最长最细的指针,走得最快,表示秒钟
                    </div>
                </div>
            </div>
            <p>当时针走完一圈(12小时),分针需要走<span>12圈</span>!</p>
            <p>当分针走完一圈(60分钟),秒针需要走<span>60圈</span>!</p>
            <p>所以,秒针走得最快,时针走得最慢!</p>
            <p>试试拖动指针或输入时间,看看时钟的变化!</p>
            <div>
                <p><strong>小提示:</strong> 你可以拖动时针、分针或秒针来调整时间!</p>
                <p><strong>教学建议:</strong> 使用"隐藏数字时间"按钮,让小朋友专注于表盘学习!</p>
            </div>
        </div>
    </div>
    
    <footer>
        <p>设计用于帮助幼儿认识时钟和时间概念</p>
    </footer>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const clock = document.getElementById('clock');
            const digitalClock = document.getElementById('digitalClock');
            const hourInput = document.getElementById('hourInput');
            const minuteInput = document.getElementById('minuteInput');
            const secondInput = document.getElementById('secondInput');
            const setTimeBtn = document.getElementById('setTime');
            const showTimeBtn = document.getElementById('showTime');
            const toggleMinuteMarksBtn = document.getElementById('toggleMinuteMarks');
            const toggleDigitalClockBtn = document.getElementById('toggleDigitalClock');
            
            let isDragging = false;
            let draggedHand = null;
            let currentHours = 12;
            let currentMinutes = 0;
            let currentSeconds = 0;
            let autoUpdate = true;
            let showMinuteMarks = false;
            let showDigitalClock = true;
            
            // 创建时钟刻度
            for (let i = 1; i <= 12; i++) {
                // 小时刻度 - 包括12点
                const hourMark = document.createElement('div');
                hourMark.className = 'hour-mark';
                hourMark.style.transform = `rotate(${i * 30}deg)`;
                clock.appendChild(hourMark);
                
                // 小时数字 - 垂直显示,不旋转
                const hourText = document.createElement('div');
                hourText.className = 'hour-text';
                hourText.textContent = i;
                
                // 计算数字位置
                const angle = (i * 30) * Math.PI / 180;
                const radius = 100;
                const x = 135 + Math.sin(angle) * radius;
                const y = 135 - Math.cos(angle) * radius;
                
                hourText.style.left = `${x}px`;
                hourText.style.top = `${y}px`;
                
                clock.appendChild(hourText);
            }
            
            // 创建分钟刻度
            for (let i = 1; i <= 60; i++) {
                const minuteMark = document.createElement('div');
                minuteMark.className = 'minute-mark';
                minuteMark.style.transform = `rotate(${i * 6}deg)`;
                minuteMark.style.display = 'none';
                clock.appendChild(minuteMark);
            }
            
            // 创建指针
            const hourHand = document.createElement('div');
            hourHand.className = 'hour-hand';
            clock.appendChild(hourHand);
            
            const minuteHand = document.createElement('div');
            minuteHand.className = 'minute-hand';
            clock.appendChild(minuteHand);
            
            const secondHand = document.createElement('div');
            secondHand.className = 'second-hand';
            clock.appendChild(secondHand);
            
            const centerCircle = document.createElement('div');
            centerCircle.className = 'center-circle';
            clock.appendChild(centerCircle);
            
            // 更新时钟函数
            function updateClock(hours, minutes, seconds) {
                // 计算角度
                const secondAngle = seconds * 6;
                const minuteAngle = minutes * 6 + seconds * 0.1;
                const hourAngle = hours * 30 + minutes * 0.5;
                
                // 应用旋转 - 没有过渡效果
                secondHand.style.transform = `rotate(${secondAngle}deg)`;
                minuteHand.style.transform = `rotate(${minuteAngle}deg)`;
                hourHand.style.transform = `rotate(${hourAngle}deg)`;
                
                // 更新数字时钟
                const formattedHours = String(hours).padStart(2, '0');
                const formattedMinutes = String(minutes).padStart(2, '0');
                const formattedSeconds = String(seconds).padStart(2, '0');
                digitalClock.textContent = `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
                
                // 更新输入框
                hourInput.value = hours;
                minuteInput.value = minutes;
                secondInput.value = seconds;
                
                // 更新当前时间变量
                currentHours = hours;
                currentMinutes = minutes;
                currentSeconds = seconds;
            }
            
            // 显示当前时间
            function showCurrentTime() {
                const now = new Date();
                const hours = now.getHours();
                const minutes = now.getMinutes();
                const seconds = now.getSeconds();
                
                updateClock(hours, minutes, seconds);
                autoUpdate = true;
            }
            
            // 设置自定义时间
            function setCustomTime() {
                let hours = parseInt(hourInput.value) || 0;
                let minutes = parseInt(minuteInput.value) || 0;
                let seconds = parseInt(secondInput.value) || 0;
                
                // 验证输入范围
                hours = Math.max(0, Math.min(23, hours));
                minutes = Math.max(0, Math.min(59, minutes));
                seconds = Math.max(0, Math.min(59, seconds));
                
                updateClock(hours, minutes, seconds);
                autoUpdate = false;
            }
            
            // 切换分钟刻度显示
            function toggleMinuteMarks() {
                showMinuteMarks = !showMinuteMarks;
                const minuteMarks = document.querySelectorAll('.minute-mark');
                
                minuteMarks.forEach(mark => {
                    mark.style.display = showMinuteMarks ? 'block' : 'none';
                });
                
                // 更新按钮文本和样式
                toggleMinuteMarksBtn.textContent = showMinuteMarks ? '隐藏分钟刻度' : '显示分钟刻度';
                toggleMinuteMarksBtn.classList.toggle('active', showMinuteMarks);
            }
            
            // 切换数字时钟显示
            function toggleDigitalClock() {
                showDigitalClock = !showDigitalClock;
                
                if (showDigitalClock) {
                    digitalClock.classList.remove('hidden');
                    toggleDigitalClockBtn.textContent = '隐藏数字时间';
                    toggleDigitalClockBtn.classList.remove('active');
                } else {
                    digitalClock.classList.add('hidden');
                    toggleDigitalClockBtn.textContent = '显示数字时间';
                    toggleDigitalClockBtn.classList.add('active');
                }
            }
            
            // 计算指针角度
            function calculateAngleFromCenter(event) {
                const rect = clock.getBoundingClientRect();
                const centerX = rect.left + rect.width / 2;
                const centerY = rect.top + rect.height / 2;
                
                const mouseX = event.clientX;
                const mouseY = event.clientY;
                
                const deltaX = mouseX - centerX;
                const deltaY = mouseY - centerY;
                
                // 计算角度(从12点方向开始,顺时针)
                let angle = Math.atan2(deltaX, -deltaY) * (180 / Math.PI);
                if (angle < 0) angle += 360;
                
                return angle;
            }
            
            // 处理鼠标按下事件
            function handleMouseDown(event) {
                isDragging = true;
                
                // 确定拖动的指针
                const angle = calculateAngleFromCenter(event);
                
                // 简单判断:根据角度判断拖动的是哪个指针
                draggedHand = 'minute'; // 默认拖动分针
                
                document.addEventListener('mousemove', handleMouseMove);
                document.addEventListener('mouseup', handleMouseUp);
            }
            
            // 处理鼠标移动事件
            function handleMouseMove(event) {
                if (!isDragging) return;
                
                const angle = calculateAngleFromCenter(event);
                
                if (draggedHand === 'hour') {
                    // 拖动时针
                    const hours = Math.floor(angle / 30) % 12;
                    updateClock(hours, currentMinutes, currentSeconds);
                } else if (draggedHand === 'minute') {
                    // 拖动分针
                    const minutes = Math.floor(angle / 6) % 60;
                    updateClock(currentHours, minutes, currentSeconds);
                } else if (draggedHand === 'second') {
                    // 拖动秒针
                    const seconds = Math.floor(angle / 6) % 60;
                    updateClock(currentHours, currentMinutes, seconds);
                }
                
                autoUpdate = false;
            }
            
            // 处理鼠标释放事件
            function handleMouseUp() {
                isDragging = false;
                draggedHand = null;
                
                document.removeEventListener('mousemove', handleMouseMove);
                document.removeEventListener('mouseup', handleMouseUp);
            }
            
            // 初始显示当前时间
            showCurrentTime();
            
            // 每秒更新一次(仅在自动更新模式下)
            setInterval(function() {
                if (autoUpdate) {
                    const now = new Date();
                    const hours = now.getHours();
                    const minutes = now.getMinutes();
                    const seconds = now.getSeconds();
                    
                    // 计算角度
                    const secondAngle = seconds * 6;
                    const minuteAngle = minutes * 6 + seconds * 0.1;
                    const hourAngle = hours * 30 + minutes * 0.5;
                    
                    // 应用旋转 - 没有过渡效果
                    secondHand.style.transform = `rotate(${secondAngle}deg)`;
                    minuteHand.style.transform = `rotate(${minuteAngle}deg)`;
                    hourHand.style.transform = `rotate(${hourAngle}deg)`;
                    
                    // 更新数字时钟
                    const formattedHours = String(hours).padStart(2, '0');
                    const formattedMinutes = String(minutes).padStart(2, '0');
                    const formattedSeconds = String(seconds).padStart(2, '0');
                    digitalClock.textContent = `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
                    
                    // 更新输入框
                    hourInput.value = hours;
                    minuteInput.value = minutes;
                    secondInput.value = seconds;
                    
                    // 更新当前时间变量
                    currentHours = hours;
                    currentMinutes = minutes;
                    currentSeconds = seconds;
                }
            }, 1000);
            
            // 事件监听
            clock.addEventListener('mousedown', handleMouseDown);
            setTimeBtn.addEventListener('click', setCustomTime);
            showTimeBtn.addEventListener('click', showCurrentTime);
            toggleMinuteMarksBtn.addEventListener('click', toggleMinuteMarks);
            toggleDigitalClockBtn.addEventListener('click', toggleDigitalClock);
            
            // 为指针添加单独的拖动事件
            hourHand.addEventListener('mousedown', (e) => {
                e.stopPropagation();
                isDragging = true;
                draggedHand = 'hour';
                document.addEventListener('mousemove', handleMouseMove);
                document.addEventListener('mouseup', handleMouseUp);
            });
            
            minuteHand.addEventListener('mousedown', (e) => {
                e.stopPropagation();
                isDragging = true;
                draggedHand = 'minute';
                document.addEventListener('mousemove', handleMouseMove);
                document.addEventListener('mouseup', handleMouseUp);
            });
            
            secondHand.addEventListener('mousedown', (e) => {
                e.stopPropagation();
                isDragging = true;
                draggedHand = 'second';
                document.addEventListener('mousemove', handleMouseMove);
                document.addEventListener('mouseup', handleMouseUp);
            });
        });
    </script>
</body>
</html>

幼儿时钟学习应用.html

浏览84
返回
目录
返回
首页
傅里叶变换互动演示HTML实现 光的折射实验模拟器HTML代码