いくつかの基本的な CSS プロパティを使用して、アナログの 12 時間時計を作成してみることにしました。まず、500px の正方形の div を作成します。次に、border-radius を 250px に設定し、見栄えの良い円を取得します。この後、12 個の目盛りを追加し、それらを絶対位置に配置して、対応する位置を取得します。
各目盛りの角度はこれに基づいています (単純な計算を綴って申し訳ありません)。
- 12の目盛り
- 私たちのサークルで360°
- 360 / 12 = 30° の角度
各目盛りの位置は、いくつかの基本的な三角法を使用して計算できます。θ (0°、30°、60°など) と半径 (250) を知っているので、 と を使用cos
しsin
て、関連する上下左右の値を計算できます。左または右の値 (x) を取得するには、次を使用するだけですr * sin θ
。上位または下位の値 (y) を取得するには、次を使用できますr - (r * cos θ)
。下の画像 (MS Paint のスキル不足をお許しください) が、私がやろうとしていることを明確にするのに役立つことを願っています。
これらの方程式が得られると、それぞれの x 値と y 値を取得するのがはるかに簡単になります。
θ (angle) | 250 * sin θ [x] | 250 - (250 * cos θ) [y]
--------------------------------------------------------------
30° (1:00) | right: 125px | top: 33.5px
60° (2:00) | right: 33.5px | top: 125px
90° (3:00) | right: 0px | top: 250px
120° (4:00) | right: 33.5px | bottom: 125px
150° (5:00) | right: 125px | bottom: 33.5px
180° (6:00) | right: 250px | bottom: 0px
210° (7:00) | left: 125px | bottom: 33.5px
240° (8:00) | left: 33.5px | bottom: 125px
270° (9:00) | left: 0px | bottom: 250px
300° (10:00) | left: 33.5px | top: 125px
330° (11:00) | left: 125px | top: 33.5px
360° (12:00) | left: 250px | top: 0px
あまりにも長い間質問を引きずっていたので...私の質問は、2、3、4、8、9、および10の目盛りがすべて少しずれているのはなぜですか? 私の計算に基づくと (私は常にそう言いたかったのですが)、これらの問題は発生しないはずです。確かに、いくつかの丸めを行い、いくつかの sig fig を省略しましたが、それらはポジショニングが不安定に見えるほど重要ではありません。これが私のコードです:
HTML
<body>
<div id="clock">
<div id="one" class="oneEleven tick"></div>
<div id="two" class="twoTen tick"></div>
<div id="three" class="threeNine tick"></div>
<div id="four" class="fourEight tick"></div>
<div id="five" class="fiveSeven tick"></div>
<div id="six" class="sixTwelve tick"></div>
<div id="seven" class="fiveSeven tick"></div>
<div id="eight" class="fourEight tick"></div>
<div id="nine" class="threeNine tick"></div>
<div id="ten" class="twoTen tick"></div>
<div id="eleven" class="oneEleven tick"></div>
<div id="twelve" class="sixTwelve tick"></div>
</div>
</body>
CSS
#clock {
height: 500px;
width: 500px;
border-radius: 50%;
border: 1px solid black;
position: relative;
}
.tick {
background-color: black;
height: 20px;
width: 5px;
position: absolute;
}
.oneEleven {
/* ~6.7% */
top: 33.5px;
}
.twoTen {
/* 25% */
top: 125px;
}
.threeNine {
/* 50% */
top: 250px;
}
.fourEight {
/* 25% */
bottom: 125px;
}
.fiveSeven {
/* ~6.7% */
bottom: 33.5px;
}
#one {
right: 125px;
transform: rotate(30deg);
}
#two {
/* ~93.3% */
right: 33.5px;
transform: rotate(60deg);
}
#three {
right: 0px;
transform: rotate(90deg);
}
#four {
right: 33.5px;
transform: rotate(120deg);
}
#five {
right: 125px;
transform: rotate(150deg);
}
#six {
left: 250px;
bottom: 0px;
}
#seven {
left: 125px;
transform: rotate(-150deg);
}
#eight {
left: 33.5px;
transform: rotate(-120deg);
}
#nine {
left: 0px;
transform: rotate(-90deg);
}
#ten {
left: 33.5px;
transform: rotate(-60deg);
}
#eleven {
left: 125px;
transform: rotate(-30deg);
}
#twelve {
left: 250px;
top: 0px;
}
jsFiddle。_ 一見すると完全にはわかりませんが、私が参照した目盛りを見ると、それらが円の上に並んでいないことがわかります. 最終的にパーセンテージに移行する予定ですが、なぜオフになっているのかを知りたいのですが、スタイルを追加したいサークルを作成するには、これが最善の方法ですか? HTML5 の canvas タグがあることは理解していますが、それを使用するのは難しすぎて、実行する必要がある以上の処理を行っているように感じます...
どんな助けでも大歓迎です!