1. 程式人生 > >CSS3形變——transform與transform-origin畫時鐘

CSS3形變——transform與transform-origin畫時鐘

css3屬性transform和transform-origin“畫”時鐘

效果圖

  前言

八哥:哈嘍,大家好!好攻城獅就是我就是你們的小八,歡迎收聽你的月亮。。。哦不,是很高興與你們共享知識,誒呀呀,現在夜黑風髙好做事呀,嘿~嘿~嘿,你們懂的!哈哈^_^  哎喲。喲。喲!九兒你輕點。。。

小九:大晚上的不睡覺發什麼騷呢!

八哥捂著耳朵:你看看你看看,不單純了吧!本著學無止境,不分時段,我這是跟學友們探討技術上的交流呢!

小九:還技術交流,我看你耍流氓吧!哼!今晚罰你睡沙發。。。

八哥:額。。。

一、廢話不多說,下面先聊聊變形

  變形分為2D和3D變形。今天主要講,如果通過指定的角度引數對原元素指定一個2D rotation(即2D旋轉),這個時候需要用到transform-origin屬性。假設我直接對物件元素進行設定rotate(45deg),它只會以元素本身中心點旋轉45度,達不到我們設計時鐘時元素(刻線、時針)圍繞圓心轉。那麼這個時候,重點來了!使用transform-origin來對元素進行基點位置改變,使元素基點不在是中心位置,以達到你需要的基點位置。

二、關於元素基點的那些事

下面有三種方法幫你層層理解到位就是啦!

  (1)transform-origin他有自己的語法,多數是拿來配合transform:rotate()用。語法表示:transform-origin(X,Y),它是用來設定元素的運動的基點(參照點)。預設點是元素的中心點。其中X和Y這兩值可以是百分值,em,px,其中X也可以是字元引數值left,center,right;Y和X一樣除了百分值外還可以設定字元值top,center,bottom

transform-origin接受兩個引數,它們可以是百分比,em,px等具體的值,也可以是left,center,right,或者 top,center,bottom等描述性引數 ;
top left | left top 等價於 0 0;
top | top center | center top 等價於 50% 0
right top | top right 等價於 100% 0
left | left center | center left 等價於 0 50%
center | center center 等價於 50% 50%(預設值)


right | right center | center right 等價於 100% 50%
bottom left | left bottom 等價於 0 100%
bottom | bottom center | center bottom 等價於 50% 100%
bottom right | right bottom 等價於 100% 100%

  其中,left,center right是水平方向取值,對應的百分值為left=0%;center=50%;right=100%而top,center,bottom是垂直方向取值left=0%;center=50%;right=100%。

拿圖說話:請看大螢幕(針對以上亂七八糟的數值進行小結)

 1 <html>
 2 <head>
 3 <title>transform-origin屬性</title>
 4 <style>
 5 .testBox{
 6     position: relative;
 7     left:20px;
 8     width: 100px;
 9     height:100px;
10     border:1px solid black;
11 }
12 .subBox{
13     position: absolute;
14     top:25px;
15     left:25px;
16     width: 50px;
17     height:50px;
18     background-color: blue;
19     /*預設值*/
20     transform-origin:50% 50%;
21     /*左上角*/
22     /*transform-origin:top left;*/
23     /*右上角*/
24     /*transform-origin:right top;*/
25     /*右下角*/
26     /*transform-origin:right bottom;*/
27     /*左下角*/
28     /*transform-origin:bottom left;*/
29     transform:rotate(45deg);
30 }    
31 </style>   
32 </head>
33 <body>
34     <div class="testBox">
35       <div class="subBox"></div>
36     </div>
37 </body>
38 </html>

效果圖:第一張不變;第二張以元素中心點為基點旋轉;第三左上角基點旋轉,第四右下角基點旋轉。(通常以百分比、字元值作為基點引數)

(2)當基點設在元素之外時,引數值單位可以用em或者px,下面以px為例,如圖所示:

transform-origin基點的數值我是以px為例的,我在接下去的畫時針的例項中也會真正使用到。

  假設時鐘的刻線寬高分別為4px、10px,那麼好,在沒有使用transform-origin改變元素基點之前,元素的基點在元素的中心位置,即(2px,5px);為什麼是這兩個數呢?視線移到第一種方法上的紅色標記,預設值,也就是——transform-origin:center center或者transform-origin:50% 50%;再把視線迴歸分析圖,2px和5px的取值是從圖上的x和y軸的(0,0)點到“基點”也就是元素的左上角到“基點”的x軸和y軸距離,搞懂了這個就好辦啦!如果我想把元素基點移到圓的中點位置呢?這個時候我怎麼獲取transform-origin的值?同理的,我只需要獲得新基點的“位置”就行了,元素左上角到圓心的x、y,即(2px,150px),兄弟姐妹們,懂了吧!

這時候小九就問啦:你懂得了那個叫什麼新基點有什麼用呢?

八哥敲她小腦袋道:小笨蛋,叫你不好好聽我說,我說了畫時鐘嘛!你懂得了畫一條刻線,在配合transform:rorate()角度旋轉後,時鐘的刻線不都出來咯!

(3)不懂就要問是對滴!但在問之前,其實,度娘什麼的才是第一選擇!

  如果還是覺得抽象不懂的學友,請上w3cSchool或者菜鳥教程等等查閱資料喲!

  如果這樣了還是不清楚的,我只能祝你幸運了喲!嘿嘿。。。

三、例項(不要問我為甚老是喜歡“畫”鍾,上篇也是畫鍾,煩不煩哈!——嘿嘿,就愛畫啦,你打我啊!O(∩_∩)O哈哈~)

  首先呢,來簡單介紹一下用到的知識:引入jQuery、指令碼化文件(通俗就是js控制html)、指令碼化css(同理在js裡控制css樣式)、最關鍵transform-origin、還有setInterval迴圈函式。

1.隨便給個div元素。設寬高各為300px,把它變成圓,然後在裡邊新增刻線、數字、時針、分鐘、秒針等。

2.學以致用,關鍵點還是獲取到目標元素的基點,以及配合transform的rotate屬性旋轉,什麼時分秒針、數字都是小意思!

3.大家都是正常人,我說多了,你們把我當智障怎麼辦喲O(∩_∩)O哈哈哈~嚴重嚴重啦!

4.關鍵不是這個很low的時鐘,而是transform-origin的理解。好啦!時鐘程式碼在此,想要不~~官人我要。。。。。。

HTML:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title> mouseenter </title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    <div class="clock">
        <div id="clockBox" class="clockBox">
            <div id="hour" class="hour"></div>
            <div id="minute" class="minute"></div>
            <div id="second" class="second"></div>
        </div>
    </div>
    <script type="text/javascript" src="js/jquery-3.1.0.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
</body>
</html>

CSS:

 1 html,body{
 2     width: 100%;
 3     height:100%;
 4     margin: 0px;
 5     padding: 0px;
 6 }
 7 .clock{
 8     width: 400px;
 9     height:400px;
10     border:1px solid black;
11     position: relative;
12     top: 50px;
13     left: 50px;
14 }
15 .clockBox{
16     position: relative;
17     width: 300px;
18     height:300px;
19     border:4px solid black;
20     border-radius:50%;
21     margin: 50px;
22 }
23 .lattice{
24     position:absolute;
25     width: 4px;
26     height:10px;
27     background-color:#000;
28     left: 148px;
29     -webkit-transform-origin:2px 150px;
30     /*transform:rotate(180deg);*/
31 }
32 .latticeLG{
33     height: 20px;
34 }
35 .mun{
36     position: absolute;
37     width:20px;
38     height:20px;
39     left:140px;
40     top:20px;
41     font-family:"微軟雅黑";
42     text-align: center;
43     -webkit-transform-origin:10px 130px;
44 }
45 .hour{
46     position: absolute;
47     width: 10px;
48     height: 100px;
49     border-radius: 6px;
50     background-color:#000;
51     left: 145px;
52     top:60px;
53     -webkit-transform-origin:5px 90px;
54     /*transform:rotate(180deg);*/
55 }
56 .minute{
57     position: absolute;
58     width: 6px;
59     height: 120px;
60     border-radius: 6px;
61     background-color:#000;
62     left: 147px;
63     top:45px;
64     -webkit-transform-origin:3px 105px;
65     /*transform:rotate(180deg);*/
66 }
67 .second{
68     position: absolute;
69     width: 4px;
70     height: 130px;
71     border-radius: 6px;
72     background-color:red;
73     left: 148px;
74     top:35px;
75     -webkit-transform-origin:2px 115px;
76     /*transform:rotate(180deg);*/
77 }

JS程式碼:

 1 jQuery(function($){
 2     var html = '<div class="lattice"></div>';
 3     //刻線
 4     for(var i=0; i<60;i++){
 5         var $html = $(html);
 6         if(!(i%5)){
 7             $html.addClass("latticeLG");
 8         }
 9         $html.css('-webkit-transform','rotate('+i*6+'deg)');
10         $("#clockBox").append($html);
11     }
12     
13     //數字
14     for (var i = 1; i < 13; i++) {
15         var $munHtml = $('<div class="mun"><div>'+i+'</div></div>');
16         $munHtml.css('-webkit-transform','rotate('+i*30+'deg)');
17         $munHtml.find("div").css('-webkit-transform','rotate('+(-i*30)+'deg)');
18         $("#clockBox").append($munHtml);
19 
20     };
21     //時分秒針
22     function setTime(){
23         var date = new Date;
24         var hour = date.getHours();
25         var minute = date.getMinutes();
26         var second = date.getSeconds();
27         $("#hour").css('-webkit-transform','rotate('+(hour/12*360+ (minute/60/12*360))+'deg)');
28         $("#minute").css('-webkit-transform','rotate('+(minute/60*360+ (second/60/60*360))+'deg)');
29         $("#second").css('-webkit-transform','rotate('+second/60*360+'deg)');
30     }
31     setInterval(setTime,1000);//一秒迴圈一次
32 });

  總結,其實transform還有其他屬性值,在css3中也值得我們去探討,例如matrix、translate、scale、rotate、skew等,但是呢,專案中若遇到的話就小解怡情,深入傷身哈!阿彌陀佛!!切記切記呀!特麼的~~寫著寫著為什麼總是能令人想到其他方面去呢!它奶奶的。。。嘿嘿嘿嘿。。(撫下巴)

  引用到知識的小夥伴網站——http://blog.sina.com.cn/s/blog_780a942701014xl8.html

本文為原創,因此轉載請保留原出處——本文地址:http://www.cnblogs.com/beyond-utf-8/p/css3.html