零CSS3筆記 | transition | transform

延遲執行:

transition: 1s width,2s 3s height; /*3s表示延遲3s後執行*/

效果:

ease:(逐渐变慢)默认值
linear:(匀速)
ease-in:(加速)
ease-out:(减速)
ease-in-out:(先加速后减速)
cubic-bezier 贝塞尔曲线( x1, y1, x2, y2 ) http://matthewlein.com/ceaser/

transition结束后执行,函数封装

function addEnd(obj, fn)
{
  obj.addEventListener('WebkitTransitionEnd', fn, false);
  obj.addEventListener('transitionend', fn, false);
}
function removeEnd(obj, fn)
{
  obj.removeEventListener('WebkitTransitionEnd', fn, false);
  obj.removeEventListener('transitionend', fn, false);
}



1、2D變換transform 旋轉 -- rotate

/*以XY軸中心點旋轉*/
.box:hover{-webkit-transform: rotate(360deg)}

/*以X軸中心點旋轉*/
.box:hover{-webkit-transform: rotateX(360deg)}

/*以X軸中心點旋轉*/
.box:hover{-webkit-transform: rotateY(360deg)}

/*自定義位置旋轉,變換旋轉焦點,父元素設定*/
.box{-webkit-transform-origin: 10px 10px;}  /*right top;*/
.box:hover{-webkit-transform: rotate(360deg)}

2、transform斜切 -- skew
注:倾斜函数 必須是block塊才可設置生效

/*沿X軸,即橫向平行四邊行*/
.box:hover{-webkit-transform: skewX(60deg)}

/*沿Y軸,即豎向平行四邊行*/
.box:hover{-webkit-transform: skewY(60deg)}

/*同時設定*/
.box:hover{-webkit-transform: skew(15deg,30deg)}

3、transform縮放 -- scale
注:缩放函数 取值 正数、负数和小数

.box:hover{-webkit-transform: scale(2,3);}

/*
-webkit-transform: scaleX(2);
-webkit-transform: scaleY(3);
*/

4、transform位移 -- translate

-webkit-transform: translate(100px,200px)

/*
-webkit-transform: translateX(100px);
-webkit-transform: translateY(100px);
*/

注意:transform執行順序,後寫的先執行:

.box:hover{-webkit-transform: translateX(100px) scale(0.5)  /*注意,后写的先执行*/}

ex1鐘表:
思路:60條秒鐘線使用li自動生成,一圈360deg,每秒rotate(6deg),時線、分線、秒線分別定位居中,使用-webkit-transform-origin: bottom 使用變換焦點在底部,每隔5分鐘,為一長條,所以選擇器是5n+1;

<div id="wrap">
    <ul id="list">
        
    </ul>
    <div id="hour"></div>
    <div id="min"></div>
    <div id="sec"></div>
    <div class="ico"></div>
</div>
#wrap{width:200px;height:200px;border:2px solid #000;margin:100px auto;border-radius:50%;position:relative}
#wrap ul{margin:0;padding:0;height:200px;position:relative;list-style:none}
#wrap ul li{width:2px;height:6px;background:#000;position:absolute;top:0;left:99px;-webkit-transform-origin:center 100px}
#wrap ul li:nth-of-type(5n+1){width:2px;height:12px}
#hour{width:6px;height:45px;background:#000;position:absolute;left:97px;top:55px;-webkit-transform-origin:bottom}
#min{width:4px;height:65px;background:#999;position:absolute;left:98px;top:35px;-webkit-transform-origin:bottom}
#sec{width:2px;height:85px;background:red;position:absolute;left:99px;top:20px;-webkit-transform-origin:bottom}
.ico{width:20px;height:20px;background:#000;border-radius:50%;position:absolute;left:90px;top:90px}
var wrap = document.getElementById('wrap')
var list = document.getElementById('list')
var css = document.getElementById('css') //給style加id
var hour = document.getElementById('hour')
var min = document.getElementById('min')
var sec = document.getElementById('sec')
var li = ''; //創建li
var ccss = '' // 動態創建css

for (var i = 0; i < 60; i++) {
  li += '<li></li>'
  ccss += '#wrap ul li:nth-of-type(' + (i + 1) + '){-webkit-transform: rotate(' + i * 6 + 'deg);}'   //#wrap ul li:nth-last-of-type(1){-webkit-transform: rotate(0);}
}
list.innerHTML = li;
css.innerHTML += ccss;
toTime()
setInterval(toTime, 1000)
function toTime() {
  var _date = new Date()
  var isec = _date.getSeconds();
  var imin = _date.getMinutes() + isec / 60;
  var ihour = _date.getHours() + imin / 60;
  sec.style.WebkitTransform = 'rotate(' + isec * 6 + 'deg)' //每秒走6deg
  min.style.WebkitTransform = 'rotate(' + imin * 6 + 'deg)' //每分钟走6deg
  hour.style.WebkitTransform = 'rotate(' + ihour * 30 + 'deg)' //每小时走30deg
}

4、transform矩阵函数 -- matrix

/*未完,待更*/

matrix(a,b,c,d,e,f)
a    c    e        x        ax    cy    e
b    d    f    *   y    =   bx    dy    f
0    0    1                 0     0     1

所以,變換後水平座標: ax + cy + e
          垂直座標: bx + dy + f

默認下公式 :  transform: matrix( scaleX(),0,0,scaleY(),translateX(),translateY() );

縮放:scale
x轴缩放 a=x*a    c=x*c     e=x*e;
y轴缩放 b=y*b   d=y*d     f=y*f;

位移:translate()
x轴位移: e=e+x
y轴位移: f=f+y

旋轉:rotate():
matrix(cosθ,sinθ,-sinθ,cosθ,0,0)

斜切:skew():
matrix(1,tan(θy),tan(θx),1,0,0)
x轴倾斜: c=Math.tan(xDeg/180*Math.PI)
y轴倾斜: b=Math.tan(yDeg/180*Math.PI)

matrix(a,b,c,d,e,f) 矩阵函数
通过矩阵实现旋转
a=Math.cos(deg/180*Math.PI); 
b=Math.sin(deg/180*Math.PI);
c=-Math.sin(deg/180*Math.PI);
d=Math.cos(deg/180*Math.PI);
变换兼容IE9以下IE版本只能通过矩阵来实现
filter: progid:DXImageTransform.Microsoft.Matrix( M11= 1, M12= 0, M21= 0 , M22=1,SizingMethod='auto expand');
IE下的矩阵没有E和F两个参数 M11==a; M12==c; M21==b; M22==d

CSS3扇形導航

See the Pen WQbqeR by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

零CSS3筆記 | 盒模型

伸缩盒模型flex【新】
搞清主軸、側軸

主轴的方向主要是用来确定flex的主方向,所以你子元素要么放置在一行,要么放置在一列。侧轴主要垂直于主轴运行,如下图所示:

1、flex-grow:定義擴展比率,默認0,不允許負值

.ul1{width:900px}

/*子元素*/
.ul1 li:nth-child(1){width:200px}
.ul1 li:nth-child(2){-webkit-flex-grow:1;width:50px}
.ul1 li:nth-child(3){-webkit-flex-grow:3;width:50px}

/*計算方法
剩餘空間:900-200-50-50 = 600
分4份:600/4 = 150
1、200 + 600/4 * 0 = 200
2、50 + 600/4 * 1 = 200
3、50 + 600/4 * 3 = 500 
*/

2、flex-shrink:定義收縮比率,默認1,不允許負值

.ul2{width:400px}

/*子元素*/
.ul2 li:nth-child(1){width:200px}
.ul2 li:nth-child(2){width:200px;flex-shrink:3}
.ul2 li:nth-child(3){width:200px;flex-shrink:1}

/*計算方法
超出空間:400-200-200-200 = 200
分5份:200/5 = 40
1、200 - 40 * 1 = 160
2、200 - 40 * 3 = 80
3、200 - 40 * 1 = 160
*/

3、flex-basis:定義基準伸縮剩餘空間,默認auto

/* 當flex-grow:0;flex-shrink:1;時,flex-basis = max-width */

.ul3{width:400px}
.ul3 li{width:200px}

/*子元素*/
.ul3 li:nth-child(3){flex-basis:600px}

/*計算方法
li總空間:200+200+600 = 1000  即把flex-basis = width
所以比率為:200/1000、200/1000、600/1000
1、400 * 0.2 = 80
2、400 * 0.2 = 80
3、400 * 0.6 = 240
*/

/* 當 flex-shrink != 1 ,待續*/
flex:none | <' flex-grow '> <' flex-shrink >'? || <' flex-basis '>
4、flex-direction:定義書寫模式,默認row flex-direction:row | row-reverse | column | column-reverse flex-direction: 左對齊 | 右對齊 | 頂對齊 | 底對齊
/*父元素設置*/
.ul4{flex-direction: row;}

/*
    1 2 3  row          3 2 1 row-reverse

    1                   3
    2                   2
    3                   1
    column              column-reverse
*/

5、flex-wrap:控制flex容器單行或多行,默認nowrap
flex-wrap:nowrap | wrap | wrap-reverse

/*父元素設置*/
.ul5{width:220px;flex-wrap:wrap}

.ul5 li{width:100px;height:100px}
flex-flow:<' flex-direction '> || <' flex-wrap '>

6、align-content:控制子元素在flex容器中的位置,多行,左右上下居中;默認stretch

如:flex-start各行向flex容器的超始位置堆疊,第一行緊靠側軸,第二行堅靠前一行;

align-content:flex-start | flex-end | center | space-between | space-around | stretch

/*父元素設置*/

.ul6{-webkit-flex-flow: row wrap;} /*演示多行*/

.ul6.flex-start{-webkit-align-content: flex-start} /*第一行側軸 靠 父級側軸起始邊界*/
.ul6.flex-end{-webkit-align-content: flex-end}/*最尾行側軸,靠 父級側軸結束邊界*/
.ul6.center{-webkit-align-content: center}/**/
.ul6.space-between{-webkit-align-content: space-between} /*第一行=flex-start 尾行=flex-end*/
.ul6.space-around{-webkit-align-content: space-around} /*兩行兩兩間空間相等*/
.ul6.stretch{-webkit-align-content: stretch}/**/

7、align-items:控制子元素在flex容器中的位置,調整伸縮項目在側軸的對齊方式;;默認stretch;
如: flex-start 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。
align-items:flex-start | flex-end | center | baseline | stretch

/*父元素設置*/
.ul7{-webkit-flex-flow:row wrap}

.ul7.flex-start{-webkit-align-items:flex-start;align-items:flex-start}
.ul7.flex-end{-webkit-align-items:flex-end;align-items:flex-end}
.ul7.center{-webkit-align-items:center;align-items:center}
.ul7.baseline{-webkit-align-items:baseline;align-items:center}
.ul7.stretch{-webkit-align-items:stretch;align-items:stretch}
align-content與align-items相似,但有區別
align-content:對齊伸縮行;
align-items:對齊伸縮項目
如:當=flex-start/flex-end/center,有多行時,align-content行與行之間無間隙,而align-items行與行之間均分flex容器的高!

8、justify-content:一般為向行調整,設置伸縮項目沿主軸的對齊方式,調整項目之間的間距。
---在主軸方向上設置任何margin都不會生效
justify-content:flex-start | flex-end | center | space-between | space-around

/*父元素設置*/

.ul9.flex-start{justify-content:flex-start} /*左對齊*/
.ul9.center{justify-content:center} /*居中對齊*/
.ul9.space-between{justify-content:space-between}  /*兩端對齊*/
.ul9.space-around{justify-content:space-around}  /*兩端對齊基礎上左右兩邊會有一半間隙縮進 */

9、order:用整数值来定义排列顺序,数值小的排在前面。可以为负值。

/*子元素*/
.ul10 li:nth-child(1){order: 4}
.ul10 li:nth-child(3){order: -1}
.ul10 li:nth-child(1){order: 2}

10、可能較少用~align-self默認值为「auto」,則计算值为父元素的 <' align-items '> 值,否则为指定值。
align-self:auto | flex-start | flex-end | center | baseline | stretch

/*子元素*/
.ul8.flex-end li{-webkit-align-self:flex-end;align-self:flex-end}
.ul8.center li{-webkit-align-self:center;align-self:center}

See the Pen VvYyvp by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>


以下佈局都須在父元素display:box 或 display:inline-box
1)彈性盒模型-佈局方向-子元素設置

Box-orient 定义盒模型的布局方向
:Horizontal 水平显示 //默認可不寫
:vertical 垂直方向
box-direction 元素排列顺序
:Normal 正
:Reverse 反
box-ordinal-group 设置元素的具体位置

/*I:父元素設置*/
.box{
    display:-webkit-box;
}
/*II:以下子元素設置*/
.box div{
    -webkit-box-orient:Horizontal /*水平默認可不寫*/
}

.box div:nth-of-type(1){
    -webkit-box-ordinal-group: 2 /*第1塊元素排第二位置*/
}

2)彈性盒模型-空間管理,子元素設置Box-flex ,即寬度width設置,加宽度:-固定宽度后再平分

/*I:父元素設置*/
.box{
    display:-webkit-box;
}
/*II:以下子元素設置*/
.box div:nth-of-type(1){
    -webkit-box-flex: 2; /*表示第1塊元素寬度點總寬的2份*/
}

3) 彈性盒模型-對齊,父元素設置box-pack,可理解為子元素左對齊,右對齊,居中,兩端對齊,
Start 子元素左
End 子元素右
Center 子元素居中
Justify 兩端對齊
相對應:
父元素設置 box-align,頂部Start 底部End 居中Center

另:未知宽度垂直居中: html{height:100%}body{height:100%}box{height:100%}

/*父元素*/
.box{
    -webkit-box-pack:Center;-webkit-box-align: center
}

<pre>.box,.box2,.box3{ font-size: 20px; text-align: center; color: #ffffff;height: 200px;border: 10px solid #000; padding: 10px;
display:-webkit-box;}
.box div,.box2 div,.box3 div{ width: 100px; height: 100px; background: peru;border:1px solid #ffffff}

.box div:nth-of-type(1){-webkit-box-ordinal-group: 2}
.box div:nth-of-type(2){-webkit-box-ordinal-group: 4}
.box div:nth-of-type(3){-webkit-box-ordinal-group: 2}
.box div:nth-of-type(4){-webkit-box-ordinal-group: 5}
.box div:nth-of-type(5){-webkit-box-ordinal-group: 1}
/寬度設置/
.box2 div:nth-of-type(1){width: 300px;}
.box2 div:nth-of-type(2){-webkit-box-flex: 1;}
.box2 div:nth-of-type(3){-webkit-box-flex: 3;}
.box2 div:nth-of-type(4){-webkit-box-flex: 4;}
.box2 div:nth-of-type(5){-webkit-box-flex: 5;}
/子元素 左對齊,右對齊,居中,兩端對齊/
.box3{ -webkit-box-pack:Center;-webkit-box-align: center }
</pre>

See the Pen YyKmPY by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>


伸缩盒模型【旧】



See the Pen zvYMNX by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>



盒模型陰影

box-shadow:[inset] x y blur [spread] color

盒模型倒影--只支持webkit below above left right

box-reflect direction 方向

    img { display: block; 
-webkit-box-reflect: below 5px 
-webkit-linear-gradient(right, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0) 100%); 
}

resize 自由缩放

Both 水平垂直都缩放
Horizontal 只水平方向缩放
Vertical 只垂直方向缩放
注意:一定要配合overflow:auto 一块使用只有水平方向可以缩放

.box{ width: 100px; height: 100px; border: 5px solid #000;background: url("../c2.jpg");
    resize: both; 
    overflow: auto; 
}

box-sizing:content-box | border-box
Content-box 标准盒模型 width/height=border+padding+content
Border-box 怪异盒模型 width/height=content



父元素設置column,:

column-width 宽度 column-count 列数 column-gap 距离 column-rule 栏目间隔线
<div class="wrap">
    <p>中国看不起说大话的人。而在我看来大话并无甚,好比古代妇女缠惯了小脚,碰上正常的脚就称“大脚”;中国人说惯了“小话”,碰上正常的话,理所当然就叫“大话”了。</p>
    <p>敢说大话的人得不到好下场,吓得后人从不说大话变成不说话。幸亏胡适病死了,否则看到这情景也会气死。结果不说大话的人被社会接受了。</p>
</div>
.wrap{width:900px;border:1px solid #000;font:14px/28px '宋体';color:#000;text-indent:2em;-webkit-column-count:4;//分為四欄
-webkit-column-gap:20px;//每欄間距為20px,即padding
-webkit-column-rule:1px solid peru;//欄線顏色粗細
-moz-column-count:4;-mox-column-gap:20px;-moz-column-rule:1px solid peru}

See the Pen avvyLo by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

.box{ columns:200px 3; }

/*或*/

.box{ columns:200px; }