الگو:متن متحرک: تفاوت میان نسخهها
بدون خلاصۀ ویرایش |
بدون خلاصۀ ویرایش |
||
| خط ۱: | خط ۱: | ||
<html> | <html lang="fa" dir="rtl"> | ||
< | <head> | ||
< | <meta charset="UTF-8"> | ||
<title>متن تایپشونده با صدا</title> | |||
.sanjab- | <style> | ||
.sanjab-box { | |||
direction: rtl; | |||
text-align: center; | |||
font-family: iransans, Tahoma, sans-serif; | |||
font-size: 30px; | |||
} | font-weight: bold; | ||
line-height: 1.6; | |||
color: #1a202c; | |||
margin: 20px 0; | |||
min-height: 80px; | |||
} | |||
.sanjab- | .sanjab-txt { | ||
border-left: 3px solid #ff7a00; | |||
} | padding-left: 5px; | ||
text-shadow: 2px 3px 4px #000000; | |||
color: #00cccc; | |||
display: inline; | |||
} | |||
.sanjab-cursor-blink { | |||
animation: sj-blink 0.8s infinite; | |||
} | |||
} | |||
@keyframes sj-blink { | |||
0%, 100% { | |||
border-color: #ff7a00; | |||
} | |||
50% { | |||
border-color: transparent; | |||
} | } | ||
} | } | ||
function | /* پیام فعالسازی صدا */ | ||
if ( | #sound-notice { | ||
if ( | display: none; | ||
target. | margin: 10px auto; | ||
padding: 8px 14px; | |||
width: fit-content; | |||
border-radius: 8px; | |||
background: #fff3e8; | |||
color: #b94f00; | |||
font-family: Tahoma, sans-serif; | |||
font-size: 13px; | |||
cursor: pointer; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="sanjab-box"> | |||
<span id="sanjab-target" class="sanjab-txt sanjab-cursor-blink"></span> | |||
</div> | |||
<div id="sound-notice"> | |||
برای فعال شدن صدای تایپ، اینجا کلیک کنید | |||
</div> | |||
<script> | |||
(function () { | |||
const text = "پذیرش اهدا کننده و گیرنده درمان نوبت دهی، پزشک، بیمارستان"; | |||
const target = document.getElementById("sanjab-target"); | |||
const soundNotice = document.getElementById("sound-notice"); | |||
const typingSpeed = 70; // سرعت ظاهر شدن هر کاراکتر (میلیثانیه) | |||
const restartDelay = 2500; // مکث بعد از کامل شدن متن | |||
let i = 0; | |||
let audioContext = null; | |||
let soundEnabled = false; | |||
/* | |||
* ساخت صدای کوتاه تایپ با Web Audio API | |||
*/ | |||
function playTypingSound() { | |||
if (!soundEnabled || !audioContext) return; | |||
try { | |||
const oscillator = audioContext.createOscillator(); | |||
const gainNode = audioContext.createGain(); | |||
oscillator.type = "square"; | |||
oscillator.frequency.setValueAtTime( | |||
650 + Math.random() * 250, | |||
audioContext.currentTime | |||
); | |||
// صدای بسیار کوتاه و ملایم | |||
gainNode.gain.setValueAtTime(0.025, audioContext.currentTime); | |||
gainNode.gain.exponentialRampToValueAtTime( | |||
0.001, | |||
audioContext.currentTime + 0.035 | |||
); | |||
oscillator.connect(gainNode); | |||
gainNode.connect(audioContext.destination); | |||
oscillator.start(); | |||
oscillator.stop(audioContext.currentTime + 0.04); | |||
} catch (error) { | |||
console.log("صدای تایپ اجرا نشد:", error); | |||
} | |||
} | |||
/* | |||
* فعالسازی صدا پس از تعامل کاربر | |||
*/ | |||
function enableSound() { | |||
try { | |||
if (!audioContext) { | |||
audioContext = new (window.AudioContext || window.webkitAudioContext)(); | |||
} | |||
if (audioContext.state === "suspended") { | |||
audioContext.resume(); | |||
} | |||
soundEnabled = true; | |||
soundNotice.style.display = "none"; | |||
} catch (error) { | |||
soundEnabled = false; | |||
console.log("مرورگر از پخش صدا پشتیبانی نمیکند."); | |||
} | |||
} | |||
/* | |||
* نوشتن کاراکترها | |||
*/ | |||
function typeText() { | |||
if (i < text.length) { | |||
const character = text[i]; | |||
target.textContent += character; | |||
// فقط برای حروف و علائم صدا پخش شود؛ نه فاصلهها | |||
if (character.trim() !== "") { | |||
playTypingSound(); | |||
} | |||
i++; | |||
setTimeout(typeText, typingSpeed); | |||
} else { | } else { | ||
target. | // مکث، پاکسازی و شروع مجدد | ||
setTimeout(function () { | |||
target.textContent = ""; | |||
i = 0; | |||
typeText(); | |||
}, restartDelay); | |||
} | } | ||
} | } | ||
/* | |||
* تلاش برای فعال کردن صدا با اولین کلیک، لمس یا فشردن کلید | |||
*/ | |||
document.addEventListener("click", enableSound, { once: true }); | |||
document.addEventListener("touchstart", enableSound, { once: true }); | |||
document.addEventListener("keydown", enableSound, { once: true }); | |||
// اگر مرورگر اجازه ندهد، پیام فعالسازی نمایش داده میشود | |||
soundNotice.style.display = "block"; | |||
soundNotice.addEventListener("click", enableSound); | |||
// شروع انیمیشن متن | |||
setTimeout(typeText, 500); | |||
})(); | |||
</script> | |||
</body> | |||
</html> | </html> | ||