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