Membuat Jam Analog & Digital JavaScript CSS

21 November 2022
Membuat Jam Analog & Digital JavaScript HTML CSS

Sharing Teknologi – Membuat Jam Analog & Digital JavaScript HTML CSS Di WordPress. Apakah Sobat teknologi[dot]visitklaten[dot]com ingin Membuat Jam Analog & Digital menggunakan JavaScript HTML CSS Di WordPress. 

Membuat Jam Analog & Digital JavaScript HTML CSS

CSS adalah singkatan dari Cascading Style Sheets dan merupakan suatu aturan untuk mengatur beberapa komponen di dalam sebuah web sehingga membuat lebih terstruktur dan seragam.

CSS sangat membantu untuk mempercantik tampilan website seperti dengan memberi warna, box shadow, padding, margin, align, posisi, dan efek pengetikan atau typing effect .

HTML (Hypertext markup language) adalah sebuah bahasa markah (markup language) yang paling mendominasi saat ini dalam hal pembuatan sebuah website.

Dengan adanya HTML, maka sebuah website bisa dikreasikan sedemikian rupa menjadi lebih interaktif dan menarik. Karena HTML memadukan berbagai elemen seperti teks, multimedia, dan link, dan juga elemen pendukung lainnya menjadi sebuah kesatuan.

JavaScript adalah suatu bahasa pemrograman level tinggi yang pada awalnya didesain untuk membuat efek interaktif pada browser. Dahulu bahasa pemrograman ini sebagian besar hanya digunakan untuk program-program front-end. Akan tetapi sekarang ruang lingkupnya sudah lebih luas dan menjadi favorit Pengembang sepanjang masa.

Tanpa plugin dengan bermodalkan HTML dan style CSS  yang cukup sederhana dan simple dan sedikit javascript maka rekan-rekan bisa Membuat Jam Analog & Digital.

Sebelumnya kami mengucapkan banyak terima kasih kepada para pengunjung teknologi[dot]visitklaten[dot]com yang rela meluangkan waktu untuk mengunjungi ataupun sekedar melihat-lihat web kami yang masih banyak kekurangan ini. Kami menerima segala masukkan dan kritikan agar web dan diri kami menjadi lebih baik lagi..

Di kesempatan kali ini, kami akan berbagi tutorial Membuat Jam Analog & Digital Menggunakan HTML CSS JavaScript. 

NB: kami menggunakan tambahan CSS dari bootstrap.

Membuat Jam Analog & Digital

Silakan Copas kode dibawah ini. Rekan-rekan bisa mengubahnya sesuai kebutuhan. Silakan nanti bisa disesuaikan dengan kebutuhan.

HTML

<div class="bg-light position-relative px-3 py-5 overflow-auto jamanalog-frame">
  <div id="analogclock">
    <div id="minmarkers" class="minmarks"></div>
    <div id="clocknumbers"></div>
    <div id="clocknumbers24"></div>
    <div id="brand">Visit Klaten</div>
    <button type="button" id="soundtoggle" class="speaker speaker--off" aria-label="sound toggle">
    <span class="speakertriangle"></span>
    <span class="speakerbar"></span>
    <span class="speakerwave speakerwave--1"></span>
    <span class="speakerwave speakerwave--2"></span>
    <span class="speakerwave speakerwave--3"></span>
  </button>
    <div id="hourscircle"><div id="hourshand"></div></div>
    <div id="minutescircle"><div id="minuteshand"></div></div>
    <div id="secondscircle"><div id="secondshand"></div></div>
    <div id="nut"></div>
  </div>
  <div id="digitalclock"></div>
    <p class="comment">Klik tombol speaker pada jam analog untuk memulai dan menghentikan suara detak.</p>
</div>

 

CSS

/* Styles for this pen */
.jamanalog-frame #analogclock {
  font-size:10px;
  --size:50em;
  margin:0 auto;
  padding:0;
  width:var(--size);
  height:var(--size);
  border:2em solid #123;
  border-radius:50%;
  display:block;
  position:relative;
  text-align:center;
  background:#fff;
  box-shadow:inset 0 0 0.8em 0.8em #ffe, 
    0 0 0 0.5em #def, 
    0 0 0 0.7em #456;
}
.jamanalog-frame .minmarks {
  display:inline-block;
  position:relative;width:100%;height:100%;
  top:0;
  border:0.2em solid #000;
  border-radius:50%;
  box-shadow:0 0 0.5em 0.5em #89a;
}
.jamanalog-frame #brand {
  display:inline-block;
  position:absolute;
  width:100%;height:auto;
  top:65%;left:0;
  text-align:center;
  font-family:"Great Vibes", cursive;
  font-size:300%;
  color:#345;
}
.jamanalog-frame #clocknumbers, .jamanalog-frame #clocknumbers24 {
  display:inline-block;
  position:absolute;
  border:0 none;
  border-radius:50%;
}
.jamanalog-frame #clocknumbers {
  width:84%;height:84%;
  top:8%;left:8%;
}
.jamanalog-frame #clocknumbers24 {
  width:72%;height:72%;
  top:14%;left:14%;
  border:0 none;
}
.jamanalog-frame .clockdigits, .jamanalog-frame .clockdigits24 {
  position:absolute;
  padding:0;margin:0;
  width:4em;height:1em;
  text-align:center;
  font-family:"Times New Roman", serif;
  font-weight:bold;
}
.jamanalog-frame .clockdigits{
  font-size:400%;
  color:#345;
}
.jamanalog-frame .clockdigits24 {
  color:#666;
  font-size:100%;
}

.jamanalog-frame #nut {
  display:inline-block;
  position:absolute;width:2.4em;height:2.4em;
  top:calc(50% - 1.2em);left:calc(50% - 1.2em);
  border:0.2em solid #333;
  background:radial-gradient(#ccc,#000, #ccc);
  border-radius:50%;
  box-shadow:inset 0 0 0 0.1em #333,
    0 0 0 0.1em #000;
}
.jamanalog-frame .guide {
  position:absolute;
  background:transparent;
  height:100%;width:1px;
  left:50%;top:0;
  transform:rotate(var(--angle));
  font-family:"Times New Roman",serif;
  font-weight:bold;
  font-size:1em;
}
.jamanalog-frame .guide::before {
  content:'';
  width:0.5em;height:1em;
  background:#000;
  position:absolute;left:0;top:0;
}
.jamanalog-frame .guide::after {
  content:'';
  width:0.5em;height:1em;
  background:#000;
  position:absolute;left:0;top:calc(100% - 1em);
}
.jamanalog-frame .guidedot {
  position:absolute;
  background:transparent;
  height:100%;width:1px;
  left:50%;top:0;
  transform:rotate(var(--angle));
}
.jamanalog-frame .guidedot::before {
  content:'';
  width:0.25em;height:0.5em;
  background:#000;
  position:absolute;left:0;top:0;
}
.jamanalog-frame .guidedot::after {
  content:'';
  width:0.25em;height:0.5em;
  background:#000;
  position:absolute;left:0;top:calc(100% - 0.5em);
}
.jamanalog-frame #secondscircle {
  position:absolute;
  width:94%;height:94%;
  left:3%;top:3%;
  border-radius:50%;
}
.jamanalog-frame #secondshand {
  position:absolute;
  background:#c00;
  width:0.2em;
  height:50%;
  left:50%;
  top:0;
  transform-origin: bottom center;
  box-shadow:0 0 0.3em 0.1em #ccc,
    0 4em 0 0 #c00;
}
.jamanalog-frame #secondshand:after {
  position:absolute;
  content:'';
  width: 1em; 
  height: 3em; 
  background:linear-gradient(to right, #fcc, #c00,#fcc);
  left:-0.4em;top:calc(100% + 2em);
  border-radius:0.5em;
  box-shadow:0 0 1em 0.1em #ccc;
}
.jamanalog-frame #minutescircle {
  position:absolute;
  width:74%;height:74%;
/*   border:1px solid green; */
  left:13%;top:13%;
  border-radius:50%;
}
.jamanalog-frame #minuteshand {
  position:absolute;
  width:0.8em;
  left:calc(50% - 0.4em);
  background:linear-gradient(#345 0%, #234 100%);
  box-shadow:0 0 0.8em 0.1em #999;
}
.jamanalog-frame #hourscircle {
  position:absolute;
  width:50%;height:50%;
  border:0 none;
  left:25%;top:25%;
  border-radius:50%;
}
.jamanalog-frame #hourscircle, .jamanalog-frame #minutescircle, .jamanalog-frame #secondscircle {
  pointer-events:none;
}
.jamanalog-frame #hourshand {
  position:absolute;
  width:1.2em;
  left:calc(50% - 0.6em);top:0;
  background:linear-gradient(#234 0%, #123 100%);
  box-shadow:0 0 1.2em 0.1em #999;
}
.jamanalog-frame #minuteshand, .jamanalog-frame #hourshand {
  top:0;
  height:50%;
  border-radius:50% 50% 0 0;
  transform-origin: bottom center;
  pointer-events:none;
}


.jamanalog-frame #digitalclock {
  text-align:center;
  margin:40px auto 20px auto;
  font-family: 'Roboto Mono', monaco, monospace;
  font-size:4rem;
  color:#0f0;
  padding:0.75em;
  background:#000;
  width:10em;
  border:4px solid silver;
  border-radius:8px;
  box-shadow:inset 0 0 0 0.5em #234;
}

.jamanalog-frame .comment {
  margin:2rem auto 2rem auto;
  width:80%;text-align:center;
}


.jamanalog-frame #soundtoggle {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  border: 0 none;
  border-radius: 0;
  background-color: transparent;
  position:absolute;
  left:47%;
  top:75%;
  cursor:pointer;
}

.jamanalog-frame .speaker {
  --color:#000;
  --size:3rem;
  width:var(--size);
  height:var(--size);
  position:relative;
  background:transparent;
  display:inline-block;
  opacity:0.9;
}
.jamanalog-frame .speaker:hover {
  opacity:1;
}
.jamanalog-frame .speakertriangle {
  display:inline-block;
  width: 0; 
  height: 0; 
  border-top: calc(var(--size) * 0.4) solid transparent;
  border-bottom: calc(var(--size) * 0.4) solid transparent;
  border-right: calc(var(--size) * 0.5) solid var(--color);
  position:absolute;
  left: calc(var(--size) * 0.05);
  top: calc(var(--size) * 0.1);
}
.jamanalog-frame .speakerbar {
  display:inline-block;
  width: calc(var(--size) * 0.333); 
  height: calc(var(--size) * 0.333);
  background: var(--color);
  position:absolute;
  left: 0;
  top:calc(var(--size) * 0.333);
}
.jamanalog-frame .speaker--off {
  opacity:0.6;
}
.jamanalog-frame .speaker--off .speakertriangle {
   left: calc(var(--size) * 0.25);
}
.jamanalog-frame .speaker--off .speakerbar{
  left: calc(var(--size) * 0.2)
}

.jamanalog-frame .speakerwave {
  display:inline-block;
  border:2px solid var(--color);
  border-left-color:transparent;
  border-top-color:transparent;
  border-bottom-color:transparent;
  border-radius:50%;
  position:absolute; 
}
.jamanalog-frame .speaker--off .speakerwave {
  display:none;
}
.jamanalog-frame .speakerwave--1 {
  width:calc(var(--size) * 0.35); 
  height:calc(var(--size) * 0.5);  
  right: calc(var(--size) * 0.3);
  top:calc(var(--size) * 0.25);
  opacity:0.4;
}
.jamanalog-frame .speakerwave--2 {
  width:calc(var(--size) * 0.5); 
  height:calc(var(--size) * 0.8);  
  right: calc(var(--size) * 0.15);
  top:calc(var(--size) * 0.1);
  opacity:0.6;
}
.jamanalog-frame .speakerwave--3 {
  width:calc(var(--size) * 0.5); 
  height:calc(var(--size) * 1);  
  right: calc(var(--size) * 0);
  top:calc(var(--size) * 0);
  opacity:0.8;
}

 

JavaScript

let analogclock,digitalclock,secondshand,minuteshand,hourshand, soundtoggle,context;
let tickURL = 'https://teknologi.visitklaten.com/wp-content/uploads/2022/07/ticksingle.wav';
let audioinfo = {"url":tickURL,"buffer":null};
let now, h, m, s, timerid;
let ticking = false;

document.addEventListener('DOMContentLoaded', function (e) {
  try {init();} catch (error){
    console.log("Data didn't load", error);}
});
function init(){
  secondshand = gid("secondshand");
  minuteshand = gid("minuteshand");
  hourshand = gid("hourshand");
  analogclock = gid("analogclock");
  digitalclock = gid("digitalclock");
  soundtoggle = gid("soundtoggle");
  makeMinMarkers();
  makeClockNumbers();
  //timerid = requestAnimationFrame(update);
  timerid = setInterval(update,1000);
  soundtoggle.addEventListener("click",toggleTick,false);
}
function getAudio(audioObject,callback){
  context = new (window.AudioContext || window.webkitAudioContext)();
  let req = new XMLHttpRequest();
    req.audioObject = audioObject;
		req.open("GET",audioObject.url,true); 
		req.responseType = "arraybuffer"; 
		req.addEventListener("progress", updateAudioProgress, false);
		req.onload = function() { 
			//decode the loaded data 
			context.decodeAudioData(req.response, function(buffer) { 
				audioObject.buffer = buffer;
        if (callback){
          callback(audioObject);
        }
			}); 
		};
		req.send();
}
function updateAudioProgress (oEvent) {
	  if (oEvent.lengthComputable) {
		let pc = oEvent.loaded / oEvent.total;
    //console.log(event.target);
    //console.log("Percent loaded is " + pc + "%.");
		if (pc >= 1){
			//console.log("Track loaded.");
		}
	}
}
function tickLoadChecker(audioObject){
  console.log("tick audio loaded from " + audioObject.url);
}

function update(){
  now = new Date();
  let oldsecond = s;
  h = now.getHours();
  m = now.getMinutes();
  s = now.getSeconds();
  secondshand.style.transform = `rotate(${s * 6}deg)`;
  minuteshand.style.transform = `rotate(${m * 6}deg)`;
  hourshand.style.transform = `rotate(${(h * 30) + ((m/60) * 30)}deg)`;
  digitalclock.innerHTML = now.toLocaleTimeString();
  //timerid = requestAnimationFrame(update);
  if (ticking){
    if (oldsecond !== s){
      if (audioinfo.buffer){
        playTick(audioinfo.buffer);
      }
    }
  }
}
function toggleTick(){
  if (!audioinfo.buffer){
    getAudio(audioinfo,tickLoadChecker);
  }
  ticking = !ticking;
  if (ticking){
    playTick(audioinfo.buffer);
    soundtoggle.classList.remove("speaker--off");
    soundtoggle.classList.add("speaker--on");
  }else{
    soundtoggle.classList.remove("speaker--on");
    soundtoggle.classList.add("speaker--off");
  }
}

function playTick(audioBuffer) {
  if (context.state === "suspended") {
    context.resume();
  }
  let source = context.createBufferSource();
  source.buffer = audioBuffer;
  source.connect(context.destination);
  source.start();
}
function gid(idstring){
  //saves lots of typing for those who eschew Jquery
  return document.getElementById(idstring);
}
function makeMinMarkers(){
  let minmarkers = gid("minmarkers");
  let code = "";
  for (let i=0;i<30;i++){
    let classname = i % 5 === 0 ? "guide" : "guidedot";
    let angle = i * 6;
    code += `<div class="${classname}" style="--angle:${angle}deg;"></div>`;
  }
  minmarkers.innerHTML = code;
}
function makeClockNumbers(){
  let clocknumbers = gid("clocknumbers");
  let clocknumbers24 = gid("clocknumbers24");
  let nums = [3,4,5,6,7,8,9,10,11,12,1,2];
  let code = "";
  for (let i=0;i<12;i++){
    code += `<div class="clockdigits">${nums[i]}</div>`;
  }
  clocknumbers.innerHTML = code;
  code = ``;
  for (let i=0;i<12;i++){
    let mil = (nums[i] + 12).toString();
    code += `<div class="clockdigits24">${mil}</div>`;
  }
  clocknumbers24.innerHTML = code;
  let cns = document.querySelectorAll(".clockdigits");
  for (let i=0;i<12;i++){
    let p = getCirclePoint(50,(i * 30),50,50);
    cns[i].style.left = `calc(${p.x}% - 2em)`;
    cns[i].style.top = `calc(${p.y}% - 0.75em)`;
  }
  let cns24 = document.querySelectorAll(".clockdigits24");
  for (let i=0;i<12;i++){
    let p = getCirclePoint(50,(i * 30),50,50);
    cns24[i].style.left = `calc(${p.x}% - 2em)`;
    cns24[i].style.top = `calc(${p.y}% - 0.75em)`;
  }
}
function getCirclePoint(r,degrees,cx,cy){
  let angleInRadians = degrees * (Math.PI / 180);
  let x = cx + r * Math.cos(angleInRadians);
  let y = cy + r * Math.sin(angleInRadians);
  return {x,y};
}

 

Hasil

Tampilannya kurang lebih bisa dilihat dibawah ini. 

Visit Klaten

Klik tombol speaker pada jam analog untuk memulai dan menghentikan suara detak.

 

Terima kasih telah mengunjungi website kami.

Share jika bermanfaat, jika ada kritik, tambahan, pertanyaan atau saran silakan hubungi kami atau silakan isi di kolom komentar.

Referensi :
codepen.io/sgestrella/pen/oRooLN

Postingan Terkait

Komentar

Leave a Comment

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.

Scroll to Top