#javascript
#javascript
Вопрос:
Я пытаюсь создать часы на javascript. Я не могу понять, как установить значение rotate () равным градусу текущего времени.
Я перепробовал несколько методов. Я просмотрел эти руководства:
- https://cssanimation.rocks/clocks/
- https://medium.com/@abhi95.saxena/make-an-analog-clock-using-javascript-7c07580ea91b
Это то, что у меня есть прямо сейчас, и я считаю, что это должно работать следующим образом.
HTML:
<div class="analogClock">
<div class="hours-container" id="pointer">
<div class="hours"></div>
</div>
<div class="minutes-container" id="pointer">
<div class="minutes"></div>
</div>
<div class="second-container" id="pointer">
<div class="seconds"></div>
</div>
</div>
CSS:
.analogClock{
border-radius: 50%;
background-color: #11052B;
height: 20em;
width: 20em;
position: relative;
}
.second-container, .minutes-container, .hours-container{
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.hours{
background-color: #E83063;
height: 20%;
left: 50%;
position: absolute;
top: 50%;
transform-origin: 50% 100%;
width: 2.5%;
border-radius: 50px;
}
.minutes{
background-color: #6CE4FF;
height: 30%;
left: 50%;
position: absolute;
top: 50%;
transform-origin: 50% 100%;
width: 2%;
border-radius: 50px;
}
.seconds{
background-color: #59FF8C;
height: 40%;
left: 50%;
position: absolute;
top: 50%;
transform-origin: 50% 100%;
width: 1%;
z-index: 8;
border-radius: 50px;
}
.hours-container{
animation: rotate 43200s infinite steps(12);
}
.minutes-container{
animation: rotate 3600s infinite steps(60);
}
.second-container{
animation: rotate 60s infinite steps(60);
}
@keyframes rotate {
100% { transform: rotateZ(360deg); }
}
JS:
//Analog clock
const hourPointer = document.querySelector('.hours-container');
const minutePointer = document.querySelector('.minutes-container');
const secondPointer = document.querySelector('.second-container');
function analogClock(){
var date = new Date();
var seconds = date.getSeconds();
var minutes = date.getMinutes();
var hours = date.getHours();
let hrPosition = hours*360/12 ((minutes * 360/60)/12) ;
let minPosition = (minutes * 360/60) (seconds* 360/60)/60;
let secPosition = seconds * 360/60;
hourPointer.getElementsByClassName.transform = 'rotate(' hrPosition 'deg)';
minutePointer.getElementsByClassName.transform = 'rotate(' minPosition 'deg)';
secondPointer.getElementsByClassName.transform = 'rotate(' secPosition 'deg)';
}
var interval = setInterval(analogClock, 500)
Я хочу, чтобы стрелки указывали на текущее время, но они начинаются снизу, независимо от того, какое сейчас время.
Спасибо за ваше время!
Комментарии:
1. Пожалуйста, могу я получить css и html для этого? Я работаю над исправлением для вас, но хочу дать вам правильный, проверенный ответ.
2. Конечно! Я обновлю сообщение через секунду.
3. не следует
hours*360/12
менять наhours * (360/12)
?4. Сделайте id=»pointer» классом.
Ответ №1:
Я попытался рассказать вам здесь как можно больше, вы должны увидеть полностью работающие часы. Это сделано не слишком отличается от вашей текущей версии.
(function ($) {
var secondHand = $('.second-hand');
var minuteHand = $('.minute-hand');
var hourHand = $('.hour-hand');
function analogClock(){
var date = new Date();
var seconds = date.getSeconds();
var minutes = date.getMinutes();
var hours = date.getHours();
//console.log(date);
//console.log(seconds);
//console.log(minutes);
//console.log(hours);
seconds = (360 / 100) * ((seconds / 60) * 100);
minutes = (360 / 100) * ((minutes / 60) * 100);
hours = (360 / 100) * ((hours / 12) * 100);
var secondsAngle = seconds;
var minutesAngle = minutes;
var hoursAngle = hours;
//console.log(secondsAngle);
//console.log(minutesAngle);
//console.log(hoursAngle);
secondHand.css({
'-webkit-transform' : 'rotate(' secondsAngle 'deg)',
'-moz-transform' : 'rotate(' secondsAngle 'deg)',
'-ms-transform' : 'rotate(' secondsAngle 'deg)',
'transform' : 'rotate(' secondsAngle 'deg)'
});
minuteHand.css({
'-webkit-transform' : 'rotate(' minutesAngle 'deg)',
'-moz-transform' : 'rotate(' minutesAngle 'deg)',
'-ms-transform' : 'rotate(' minutesAngle 'deg)',
'transform' : 'rotate(' minutesAngle 'deg)'
});
hourHand.css({
'-webkit-transform' : 'rotate(' hoursAngle 'deg)',
'-moz-transform' : 'rotate(' hoursAngle 'deg)',
'-ms-transform' : 'rotate(' hoursAngle 'deg)',
'transform' : 'rotate(' hoursAngle 'deg)'
});
}
setInterval(function() {
analogClock();
}, 1000);
})(jQuery);
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.clock {
width: 300px;
height: 300px;
margin: 0 auto;
padding: 50px;
position: relative;
background-color: purple;
}
.clock-face {
width: 100%;
height: 100%;
margin: 0 auto;
position: relative;
}
.hand {
height: 100px;
position: absolute;
left: 50%;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
transform-origin: 50% 100%;
display: block;
}
.second-hand {
width: 5px;
z-index: 3;
}
.sec-hand {
height: 100px;
background-color: red;
}
.minute-hand {
width: 6px;
z-index: 2;
}
.min-hand {
height: 80px;
margin-top: 20px;
background-color: green;
}
.hour-hand {
width: 7px;
z-index: 1;
}
.hr-hand {
height: 60px;
margin-top: 40px;
background-color: black;
}
.single-hand {
width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="clock">
<div class="clock-face">
<div class="second-hand hand">
<div class="sec-hand single-hand"></div>
</div>
<div class="minute-hand hand">
<div class="min-hand single-hand"></div>
</div>
<div class="hour-hand hand">
<div class="hr-hand single-hand"></div>
</div>
</div>
</div>
- Только что обновлено, чтобы упорядочить стрелки (z-индекс) и изменить их длину…
Математика:
seconds = (360 / 100) * ((seconds / 60) * 100);
minutes = (360 / 100) * ((minutes / 60) * 100);
hours = (360 / 100) * ((hours / 12) * 100);s
(360 / 100): Таким образом, для всех переменных времени возможен поворот на 360 градусов.
Мы делим на 100, чтобы получить один процент циферблата.
a * b: Теперь мы можем умножить это на процент от времени (математика выше), чтобы представить, на какое расстояние в градусах нам нужно повернуть стрелку.
((секунды / 60) * 100): Затем нам нужно создать значение, представляющее собой процент от пройденного полного поворота.
Это можно сделать, взяв количество секунд, минут, часов, заданное новой датой (); разделив его на общее количество возможных 60 секунд, 60 минут, 12 часов. Затем мы должны умножить его на 100%, чтобы получить процент.
Весь результат: вращение на одну секунду * процент прохождения одного полного оборота.
например: вращение на 1 секунду * 50% пути в течение полной минуты = 180 градусов / 30 секунд
Надеюсь, это имеет смысл…
Комментарии:
1. Я идиот, я запустил часы в 3: 15: 15. Позвольте мне это исправить.
2. Спасибо, что потратил время на создание такого комплексного решения, Джейсон! Я многому научился из этого! У меня есть точки зрения, которые я не понимаю, и если это не доставит особых хлопот, я хотел бы получить больше информации о том, как работает математика, которую вы использовали для получения правильного угла, и не могли бы вы указать мне источник, где я могу увидеть, как работает код ajax и jquery, который вы использовали, работает. Вы, вероятно, занятой человек, поэтому, пожалуйста, не чувствуйте себя обязанным отвечать на мои вопросы.
3. Без проблем, @Jeroen, рад, что тебе это нравится. Вы можете увидеть математическое объяснение в конце моего ответа.
4. Спасибо, Джейсон! Я действительно ценю это! Последний вопрос о математике. Разве (секунды / 60 * 100) не совпадают с ((секунды / 60) * 100). Или внутренняя скобка что-то меняет?
5. Поскольку вы умножаете первое значение на второе значение, вам нужно содержать два уравнения отдельно друг от друга. секунды = (360 / 100) * ((секунды / 60) * 100); вернет другое значение, равное секундам = (360 / 100) * (секунды / 60) * 100;. Я также заметил опечатку в своем css — пожалуйста, измените ваше правило css .clock-face на position: relative; не display: relative;