小小時鐘帶給我大大的思考-製作個時鐘插件

来源:http://www.cnblogs.com/liu-fei-fei/archive/2017/07/25/7235037.html
-Advertisement-
Play Games

【來源】由於自己非電腦出身,所以對於底層的一些常識的認識不夠;近期開始自修《網易雲課堂》的大學四年電腦,碰到了一個通過三角函數計算角度的問題;為了讓自己重溫三角函數知識,引出了之後一些列的實踐和思考,而且最後我用的非三角函數知識; 【思考】對於時鐘這種插件,《慕課網》上有很多講解,也看了一些,怎 ...


【來源】由於自己非電腦出身,所以對於底層的一些常識的認識不夠;近期開始自修《網易雲課堂》的大學四年電腦,碰到了一個通過三角函數計算角度的問題;為了讓自己重溫三角函數知識,引出了之後一些列的實踐和思考,而且最後我用的非三角函數知識;

【思考】對於時鐘這種插件,《慕課網》上有很多講解,也看了一些,怎麼說呢,對於我這種好久動不動搖三角函數的同學來說,確實需要一些時間;實踐才是檢驗真理的王道,因此,我直接開戰

【遇到的問題】對於CSS的運用這裡就不說了,後面有完整的代碼;就說說實際遇到的問題吧,我自己的思路是通過,獲取當前系統,hour/minute/second來顯示時針、分針、秒針的,最後遇到的問題就是,角度都是整數,也就是說:現在如果是3:30,時針的指向還是3的位置,而不是3下麵的位置;最初我也很苦惱,觀看教程,發現思路完全不一樣,教程的思路是通過三角函數來計算角度,而我是通過數值來計算角度,完全沒有可借鑒性;

這可怎麼辦,溜達溜達,重點不在於我用的是什麼知識,重點在於角度的計算沒有引入小數;

好了到這思路通了,然後就是把分鐘轉化成小時的小數(秒在小時的面前忽略不計),秒數轉化成分鐘的小數,毫秒計算秒數的小數(這塊除以999,因為毫秒最大值999)

【今天的獲得】這次之所以寫下來,是由於我想把在大腦中懸著的感悟,使其落地;讓我受益終身;

最初就是認為這事只能用三角函數來計算,最終自己的思路才發現,其實解決問題的辦法很多,但從自身的角度來看待問題,我們首先要做的就是用自己最擅長的能力去解決,這樣做是為了讓自己不懼怕任何問題;

同時,我們也要不斷的學習,這樣做是為了我們解決問題的思路和角度不斷的得到優化;

還有就是不因為提前知道答案而影響自己的思路(這個叫做沉沒成本)

【好了上代碼,估計感悟差不多落地了】

【註】這個是基於jQuery的所以需要引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<style>
body{background:black;}
.box{width:400px;height:400px;background:rgba(255,255,255,.2);margin:100px auto;position:relative;border-radius:50%;box-shadow:0 0 0 20px rgba(255,255,255,.2);}
.outer .item{width:2px;height:200px;transform-origin:bottom center;color:#fff;position:absolute;bottom:200px;left:200px;margin-left:-1px;}
.outer .item::before{content:'';width:2px;height:12px;background:#fff;position:absolute;top:-12px;right:0;}
.outer .item span{display:block;width:20px;text-align:center;margin-left:-9px;font-size:14px;color:rgba(255,255,255,.6);}
.inner .item{width:2px;height:200px;transform-origin:bottom center;color:#fff;position:absolute;bottom:200px;left:200px;margin-left:-1px;}
.inner .item::before{content:'';width:2px;height:6px;background:rgba(255,255,255,.4);position:absolute;top:-12px;right:0;}
.hour{display:none;width:4px;height:100px;transform-origin:bottom center;color:#fff;position:absolute;bottom:200px;left:200px;background:rgba(255,0,255,.6);margin-left:-2px;border-radius:50% 50% 4px 4px;}
.minuter{display:none;width:3px;height:140px;transform-origin:bottom center;color:#fff;position:absolute;bottom:200px;left:200px;background:rgba(255,0,0,.6);margin-left:-1.5px;border-radius:50% 50% 2px 2px;}
.second{display:none;width:2px;height:180px;transform-origin:bottom center;color:#fff;position:absolute;bottom:200px;left:200px;background:rgba(255,255,0,.6);margin-left:-1px;border-radius:50% 50% 2px 2px;}
</style>
<div class="box">
    <div class="outer"></div>
    <div class="inner"></div>
    <div class="needle">
        <div class="hour"></div>
        <div class="minuter"></div>
        <div class="second"></div>
    </div>
</div>
<script src="jq.js"></script>
<script>
$(function(){
    // 刻度初始化
    pointerNum();
    // 時鐘初始化
    time();
    // 指針轉動
    setInterval(function(){
        time();
    },20);
    // 刻度
    function pointerNum(){
        // 整點指示點
        var sum = 360/12;
        var res = '';
        for(var i=1;i<13;i++){
            res += '<div class="item" style="transform:rotate('+sum*i+'deg);"><span style="transform:rotate(-'+sum*i+'deg);">'+i+'</span></div>';
        }
        $('.outer').html(res);
        // 指示點
        var inner_sum = 360/60;
        var inner_res = '';
        for(var i=0;i<60;i++){
            inner_res += '<div class="item" style="transform:rotate('+inner_sum*i+'deg);"></div>';
        }
        $('.inner').html(inner_res);
    }
    // 時分秒指針
    function time(){
        var sum = 360/12;
        var inner_sum = 360/60;
        var date = new Date();
        var hour = date.getHours();
        var minuter = date.getMinutes();
        var second = date.getSeconds();
        var millisecond = date.getMilliseconds()/999;
        document.title = evenFn(hour)+':'+evenFn(minuter)+':'+evenFn(second);
        $('.hour').css('transform','rotate('+(hour+minuter/60)*sum+'deg)').show();
        $('.minuter').css('transform','rotate('+(minuter+second/60)*inner_sum+'deg)').show();
        $('.second').css('transform','rotate('+(second+millisecond)*inner_sum+'deg)').show();
    }
    // 雙數顯示
    function evenFn(n){
        return n<10?'0'+n:''+n;
    }
});
</script>
</body>
</html>

【對自己說】一直以為自己能力還不夠,還沒資格寫博客,其實寫了這麼多,完全就是為了讓自己更好的學會想學的知識,然後更好的記憶下來


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝 API 可以通過body-parser 對象創建中間件,當接收到客戶端請求時所有的中間件都會給req.body 添加屬性,請求體為空,則解析為空{} (或者出現錯誤)。 bodyParser.json(options) 中間件只會解析 json ,允許請求提任意Unicode編碼支持 gzip ...
  • <canvas>標簽定義了一塊畫布,畫布可以在網頁中繪製2D和3D圖象,現在先學習如何繪製2D圖象,繪製3D圖象屬於WebGL的內容(也就是網頁版的OpenGL,3D圖形介面)。 屬性 <canvas>只有width和height兩個屬性。如果沒有設置width和height屬性,canvas的預設 ...
  • Layout Controls Auto Layout Ext JS4中的容器的預設佈局是自動佈局。這個佈局管理器會自動地將組件放在一個容器中。 Fit Layout Fit佈局安排了容器的內容完全占據空間,它適合於容器的大小。Fit佈局通常用於具有單個項目的容器。Fit佈局是Card佈局的基類 A ...
  • //settime($("#getPhoneCode"),60); function settime($obj, time) { if (time == 0) { $obj.attr("disabled", false); $obj.css("background", "#f38401").css(... ...
  • jquery table 元素操作-創建|數據填充|重置|隱藏行 ...
  • [1]基本用法 [2]多行字元串 [3]變數占位符 [4]標簽模板 [5]raw() ...
  • /* 此文不斷更新中 */ 使用 .col-md-offset-* 類可以將列向右側偏移 ...
  • 倒計時主要用到的知識點:1、設置時間間隔的setInterval可以被clearInterval取消 2、毫秒轉換為時分格式 這個是效果圖 下麵是js中的函數 第二個是html資源,為了方便我css直接寫在html中了 需要代碼的小伙伴可以自行下載 鏈接:http://pan.baidu.com/s ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...