整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML使用Canvas繪制動畫時鐘

          么是Canvas

          <canvas> 是HTML中的一個元素,它可被用來通過 JavaScript(Canvas API 或 WebGL API)繪制圖形及圖形動畫。

          Canvas API 提供了一個通過 JavaScriptHTML<canvas> 元素來繪制圖形的方式。它可以用于動畫、游戲畫面、數據可視化、圖片編輯以及實時視頻處理等方面。

          <canvas>標簽本身沒有繪圖能力,它僅僅是圖形的容器。在HTML,一般通過Javascript語言來完成實際的操作。

          創建HTML頁面并添加繪圖容器

          本文通過Javascript操作Canvas制作一個簡單的顯示當前時間的動畫時鐘,了解和學習簡單的canvas用法,僅以拋磚引玉。

          首先創建一個HTML文件,為了方便管理,使用一個div標簽包裹兩個canvas標簽,并加上一些簡單的css樣式。

          <!doctype html>
          <html lang="zh-cn">
          <head><title>Canvas繪制動畫時鐘</title>
          <style>
          html,body{margin:0;padding:0}
          #clockWrap {
          	position: relative;
          }
          canvas {
          	position: absolute;
          }
          #clock-ui {
          	z-index: 2;
          }
          #clock-plate {
          	z-index: 1;
          }
          </style>
          </head>
          <body>
            <div id="clockWrap">
            <canvas id="clock-plate"></canvas>
            <canvas id="clock-ui"></canvas>
          </div>
          <script></script>
          </body></html>

          本示例中使用了兩個canvas標簽(為什么使用兩個,一個不是更簡單嗎?),一個用于繪制鐘面,一個根據當前時間實時顯示和更新時針、分針和秒針的動態指向。好了,話不多說,開干。

          繪制鐘面刻度

          一個簡單的時鐘,可以分為鐘面上的刻度和指針。其中刻度和12個數字是固定的,我們可以將它們繪制在當作背景的canvas上(示例中id為clock-plate的canvas)。

          (1)要使用canvas,首先必須通過容器獲取渲染上下文:

          var $=function(id){return document.querySelector(id);}//這個函數只是為了方便獲取dom元素
          const canvasbg=$("#clock-plate"),
                canvas=$("#clock-ui"),
                ctx = canvasbg.getContext("2d"),//背景容器上下文
                ctxUI = canvas.getContext("2d");//指針容器上下文,后面代碼要用
          //定義畫布寬度和高度,時鐘圓直徑,并設置畫布大小
          const oW=1000,oH=800,cW=400,r=cW/2,oX=oW/2,oY=oH/2;
          canvas.width=oW;
          canvas.height=oH;
          canvasbg.width=oW;
          canvasbg.height=oH;

          (2)畫鐘的邊框,為了好看,這里畫兩個圈:

           //畫出時鐘外圓框
            ctx.lineWidth = 12;
          	ctx.beginPath();
          	ctx.arc(oX, oY, r+14, 0, 2 * Math.PI);
          	ctx.stroke();
          	ctx.closePath();
          	ctx.lineWidth = 8;
          	//畫出時鐘內圓框(刻度圈)
          	ctx.beginPath();
          	ctx.arc(oX, oY, r, 0, 2 * Math.PI);
          	ctx.stroke();
          	ctx.closePath();
          	ctx.beginPath();

          邊框效果圖

          (3)繪制刻度線和數字,可以利用三角函數計算出每個刻度的坐標:

          利用三角函數計算刻度線的坐標位置

          鐘面上有12個大格,從正上方12開始,它們的度數分別是270,300,330,0,30,60,90,120,150,180,210,240。然后利用JS的Math.sin和Math.cos分別計算出各大格的坐標。注意:js中Math.sin()和Math.cos()的參數不是角度數弧度??梢允褂肕ath.PI/180*角度來轉化,比如將30度轉換成弧度=Math.PI/180*30

          //繪制鐘表中心點
          	ctx.beginPath();
          	ctx.arc(oX, oY, 8, 0, 2 * Math.PI);//圓心
          	ctx.fill();
          	ctx.closePath();
          	//設置刻度線粗細度
          	ctx.lineWidth = 3;
          	//設置鐘面12個數字的字體、大小和對齊方式
          	ctx.font = "30px serif";
          	ctx.textAlign="center";
          	ctx.textBaseline="middle";
          	var kdx,kdy;
          	//繪制12個大刻度和12個數字
          	//為方便計算,先定義了0-11這12個刻度對應的度數,也可以直接定義對應的弧度。
          	const hd=Math.PI/180,degr=[270,300,330,0,30,60,90,120,150,180,210,240];
          	for(var i=0;i<12;i++){
          		kdx=oX+Math.cos(hd*degr[i])*(r-3);
          		kdy=oY+Math.sin(hd*degr[i])*(r-3);
          		ctx.beginPath();
          		ctx.arc(kdx, kdy, 6, 0, 2 * Math.PI);//畫圓形大刻度
          		ctx.fill();
              //繪制刻度對應的數字
          		ctx.strokeText(i==0? 12 : i,oX+Math.cos(hd*degr[i])*(r-24),oY+Math.sin(hd*degr[i])*(r-24));
          		ctx.closePath();
          	}
          	
          	//繪制小刻度
          	ctx.lineWidth = 2;
          	for(var i=0;i<60;i++){
          		if(i % 5 == 0) continue;//跳過與刻度重疊的刻度
          		x0=Math.cos(hd*i*6);
          		y0=Math.sin(hd*i*6);
          		ctx.beginPath();
          		ctx.moveTo(oX+x0*(r-10), oY+y0*(r-10)); 
          		ctx.lineTo(oX+x0*r, oY+y0*r); //畫短刻度線
          		ctx.stroke(); 
          		ctx.closePath();
          	}

          效果如圖:

          鐘面效果圖

          (4)根據當前時間繪制指針

          習慣上,時針粗短,分針略粗而長,秒針細長。為加大區別,示例中秒針細長并且繪制成紅色。

          function drawHp(i){//繪制時針
          	const x0=Math.cos(hd*i*30),y0=Math.sin(hd*i*30);
          	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
          }
          function drawMp(i){//繪制分針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
          }
          function drawSp(i){//繪制秒針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
          }
          //抽取出繪制三種指針時共同的部分,注意指針繪制在渲染上下文ctxUI中
          function drawPointer(ox,oy,tx,ty,width,color){
          	ctxUI.strokeStyle = color;
          	ctxUI.lineCap = "round";
          	ctxUI.lineWidth = width;
          	ctxUI.beginPath();
          	ctxUI.moveTo(ox, oy);
          	ctxUI.lineTo(tx,ty);
          	ctxUI.stroke();
          	ctxUI.closePath();
          }

          現在已經有了繪制三種指針的方法,參數是當前時間的時、分和秒,將根據它們的值確定指針的坐標。不過,因為使用的是默認的convas坐標體系,0值實際指向3的位置,需要小小的修正一下。

          window.requestAnimationFrame(function fn(){
          		var d = new Date();
          		ctxUI.clearRect(0,0,oW,oH);
          		//度數從0開始,而0在3刻度(15分/秒位置),修正為全值減15,如果小于0則修正回來
              var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;
          		hour=hour>11? hour-15 : hour-3;
          		drawHp(hour>=0? hour : 12+hour);
          		drawMp(minute>=0? minute : 60+minute);
          		drawSp(second>=0? second : 60+second);
          		window.requestAnimationFrame(fn);
          });

          接下來,調用window.requestAnimationFrame,在其中繪制并更新指標的位置??纯葱Ч绾危?/p>

          指針繪制情況與實際時間相符

          貌似效果有了,截圖時電腦上的時間是10時17分,指針繪制上,時針指向10時,分針指向17。嗯,感覺有點別扭?對了,時針和分針怎么是端端正正地指向它們的整時整分刻度上呢?實際鐘表上時針和分針是展示動態進度的,此時時針應該越過10時的位置才對。沒關系,我們在繪制時針和分針時別點東西,讓它的角度值加上分針和秒針的值試試。

          //修改后的繪制三種指針的方法
          function drawHp(i,f,m){//繪制時針,參數:時,分,秒
          	const x0=Math.cos(hd*(i+(f/60)+(m/600))*30),y0=Math.sin(hd*(i+(f/60)+(m/600))*30);
          	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
          }
          function drawMp(i,f){//繪制分針,參數,分,秒
          	const x0=Math.cos(hd*(i+(f/60))*6),y0=Math.sin(hd*(i+(f/60))*6);
          	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
          }
          function drawSp(i){//繪制秒針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
          }

          再來看看效果,嗯,立竿見影呀:

          指針指向更合理了

          到此為止,canvas繪制一個簡易時鐘就完成了。下面繼續優化一下。剛才使用requestAnimationFrame方法即時更新繪制情況。這個方法與刷新率有關,看看mdn上面怎么說的:

          window.requestAnimationFrame() 方法會告訴瀏覽器你希望執行一個動畫。它要求瀏覽器在下一次重繪之前,調用用戶提供的回調函數。

          對回調函數的調用頻率通常與顯示器的刷新率相匹配。雖然 75hz、120hz 和 144hz 也被廣泛使用,但是最常見的刷新率還是 60hz(每秒 60 個周期/幀)。為了提高性能和電池壽命,大多數瀏覽器都會暫停在后臺選項卡或者隱藏的 <iframe> 中運行的 requestAnimationFrame()。

          本示例中,更新指針的位置并不需要很高的刷新頻率,可以通過節流進行一下優化:

          var fps = 5, fpsInterval = 1000 / fps,lastTime = new Date().getTime(); //記錄上次執行的時間
          function runStep() {
              requestAnimationFrame(runStep);
              var d=new Date(),now = d.getTime()
              var elapsed = now - lastTime;
              if (elapsed > fpsInterval) {
          				ctxUI.clearRect(0,0,oW,oH);
                  lastTime = now - (elapsed % fpsInterval); 
          			//度數從0開始,而0在3刻度(15分/秒位置),修正為全值-15,如果小于0則用60減回
                  var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;//console.log(d.getSeconds(),second);
                  hour=hour>11? hour-15 : hour-3;
                  drawHp(hour>=0? hour : 12+hour,minute+15,second+15);
                  drawMp(minute>=0? minute : 60+minute,second+15);
                  drawSp(second>=0? second : 60+second);
              }
          }
          runStep();

          當然,實現時鐘的方法是很多,比如可以使用畫布的旋轉(rotate方法)來實現指針的動態轉動等等。

          完整HTML+JS源碼:

          看最終效果:

          制作思路:

          在timeline里每一行使用dl標簽布局;每行(dl)左側的邊框使用border-left繪制。左側圓形使用dt布局,我們可以使用border給dt加邊框,使用border-radius繪制圓形效果,右側文字使用dd排列。

          html布局代碼如下:

          <div class="timeline">

          <dl>

          <dt class="on"></dt>

          <dd>

          <h3>管家接單中</h3>

          <p>2021-04-21 14:47:56.0</p>

          </dd>

          </dl>

          <dl>

          <dt></dt>

          <dd>

          <h3>已派單</h3>

          <p></p>

          </dd>

          </dl>

          <dl>

          <dt></dt>

          <dd>

          <h3>已完成</h3>

          <p></p>

          </dd>

          </dl>

          </div>

          css樣式代碼:

          .timeline{ padding: 1rem 0;}

          .timeline dl{border-left:1px solid #eee; position:relative; margin:0 0 0 .5rem; height: 5rem;}

          .timeline dl dt{ position: absolute; left: -.5rem; top:0rem; width:.5rem; height: .5rem; border-radius: .5rem; border:2px solid #eee; background-color: #fff;}

          .timeline dl dt.on{border:2px solid #FF8800;}

          .timeline dl dd{ position: absolute; left: 1rem; top:0rem;}

          .timeline dl dd h3{font-size:1.1rem; font-weight:600; padding:0 0 .5rem 0; color: #333333;}

          .timeline dl dd p{ color: #949494;}

          .timeline dl:last-child{border-left:none; }

          說明:定義dl樣式的時候position一定要使用relative。因為后面我們需要給里面的dt和dd使用絕對定位。

          dt標簽里,position:absolute代表使用絕對定位。left位置為-.5rem代表向左負的0.5rem(這里我使用的rem單位 ,你們使用px的話,就寫具體的px 值)。寬和高也同時是.5rem。然后為了繪制圓形設置border-radius也是.5rem。邊框使用border屬性設置寬度為2px。

          dd標簽里,同樣設置position:absolute使用絕對定位。設置left為1rem(代表距離左邊界1rem)。

          然后我們看到最后一個dl左邊是沒有邊框的,如下圖箭頭所示:

          這個是通過:.timeline dl:last-child{border-left:none; }設定的。

          如果沒有這行,效果就是這邊的樣子了:

          好了,介紹就這些,代碼不多,實現了效果:)

          天我們學習的內容有:過渡,動畫,轉換,伸縮盒子。

          可以說今天學習的內容都是重量級的大佬,學好了,使用css3做出酷炫的效果 So Easy!~~

          1.過渡

          在css3中,有一個屬性可以設置過渡效果。

          它就是transition,所謂的過渡效果,指的就是以動畫的形式慢慢演化樣式屬性變化的過程。

          A.案例:通過transition設置焦點過渡效果

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>div{width: 200px;height: 200px;margin:200px;background: url(girl.jpg);border-radius:50%;transition:all 1s linear 0.3s;cursor: pointer;}div:hover{box-shadow: 0px 0px 20px blue;}</style></head><body><div></div></body></html>

          注意頁面中的代碼:

          第一,我們給div添加了一個hover偽類樣式,當我們鼠標懸停在div上方的時候,會給div盒子添加一個藍色的盒子陰影。

          第二,我們給div盒子添加了一個transition樣式,設置的值為:all 1s linear 0.3s;

          這四個數據分別對應

          transition-property(需要過渡的屬性):如果設置為all表示所有樣式屬性都需要過渡。

          transition-duration(過渡的時間):以秒作為單位,設置過渡的時間

          transition-timing-function(過渡的方式):常用的有linear(勻速),ease(先慢后快),ease-in,ease-out,ease-in-out等

          transition-delay(延遲的時間):以秒作為單位進行延遲,延遲之后開始進行過渡效果。

          所以,我們通過transition這個復合屬性設置的過渡效果為:

          all:需要過渡所有的屬性

          1s:過渡的時間為1秒

          linear:勻速過渡

          0.3s:在延遲0.3秒之后開始過渡動畫。

          如果大家理解了上面的描述,那么也就不難理解咱們鼠標放到div上之后,為啥會慢慢出現藍色的光暈了,就是因為咱們添加了過渡,所以,慢慢的就會給盒子添加陰影效果。

          2.動畫:

          在學習完了過渡之后,發現咱們可以使用transition去以動畫的形式展示樣式的改變以及變化的過程,這可以幫助我們來實現一些過渡的動畫。

          但是,有的時候,我們的需求會更加的復雜,要求會更加的多變,那么,transition可能就無法滿足我們的需要了,我們需要有更加炫酷,復雜的效果呈現。

          那么,動畫animation就可以滿足我們的需要。

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>@keyframes moveAndChange{0%{left:0px;top:0px;}25%{left:200px;top:200px;background:green;border-radius: 0;}50%{left:400px;top:200px;background:blue;border-radius: 50%;}75%{left:400px;top:0px;background:#ccc;border-radius: 0;}100%{left:0px;top:0px;background:red;border-radius: 50%;}}div{margin:200px;width: 200px;height: 200px;position: absolute;background:red;border-radius:50%;animation: moveAndChange 5s linear 0.5s infinite normal;}</style></head><body><div></div></body></html>

          代碼效果如下:

          同樣,讓我們來關注編寫的代碼:

          1.在樣式中,首先我們使用@keyframes 來定義了一個復雜的動畫,在css3中,新增了@keyframes可以來幫助我們添加動畫。代碼如下:

          /*動畫的名字叫做moveAndChange*/

          @keyframes moveAndChange{

          /*動畫最初的時候,將left設置為0px,top設置為0px*/

          0%{

          left:0px;

          top:0px;

          }

          /*當動畫進行到25%的時候,使用動畫將left過渡到200px,top過渡到200px,

          背景顏色過渡為綠色,圓角過渡為0(無圓角)*/

          25%{

          left:200px;

          top:200px;

          background:green;

          border-radius: 0;

          }

          /*當動畫進行到50%的時候,使用動畫將left過渡到400px,top過渡到200px,

          背景顏色過渡為藍色,圓角過渡為50%(正圓)*/

          50%{

          left:400px;

          top:200px;

          background:blue;

          border-radius: 50%;

          }

          /*當動畫進行到75%的時候,使用動畫將left過渡到400px,top過渡到0,

          背景顏色過渡為灰色,圓角過渡為0(無圓角)*/

          75%{

          left:400px;

          top:0px;

          background:#ccc;

          border-radius: 0;

          }

          /*當動畫結束的時候,使用動畫將left過渡到0x,top過渡到0px,

          背景顏色過渡為紅色,圓角過渡為50%(正圓)*/

          100%{

          left:0px;

          top:0px;

          background:red;

          border-radius: 50%;

          }

          }

          這是一個比較復雜的動畫效果,可以發現,它通過百分比的形式將一個完整的動畫拆分成了5個部分,每個部分都有不同的樣式效果,而當我們采用該動畫的元素就會按照設置的順序和樣式效果進行動畫的過渡和展示。

          2.上面我們只是通過@keyframes創建了一個動畫,我們還需要通過特定的語法來使用這個動畫。

          就是下面這句代碼了:

          animation: moveAndChange 5s linear 0.5s infinite normal;

          它是一個復合屬性,設置了6個值,分別對應:

          animation-name(設置動畫的名稱):用來設置動畫的名字,我們這里寫的是moveAndChange ,也就是說我們就是要使用我們剛剛創建的動畫。

          animation-duration(設置整個動畫的時間):以秒作為單位,我們這里寫的是5s,表示整個動畫的時間為5秒

          animation-timing-function(設置播放動畫的方式):播放動畫的方式,常用的有linear(勻速),ease(先慢后快),ease-in,ease-out,ease-in-out等,我們使用的是linear勻速播放動畫。

          animation-delay(設置動畫的延遲):以秒作為單位,我們寫的是0.5s,表示延遲0.5秒之后開始播放動畫。

          animation-iteration-count(設置動畫播放的次數):播放動畫的次數,我們這里寫的是infinite ,表示動畫將會被播放無限次,如果寫數字,那么就會播放數字對應的次數。

          animation-direction(設置是否反向播放動畫):我們寫的是normal,表示正常播放動畫,如果寫的是

          alternate則表示要反向播放動畫,大家也可以自己試一試這個效果。

          最終,我們通過@keyframes創建動畫,通過animation設置動畫,成功完成了這個復雜的動畫效果。

          3.轉換

          在css3中,我們通過transform屬性可以設置元素的轉換效果,具體的效果如下:

          A.平移

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>body{background:pink;}div{width: 200px;height: 200px;position: absolute;background: green;left:0px;top:0px;transform: translate(300px,300px);}</style></head><body><div></div></body></html>

          代碼效果如下:

          如上圖所示,本來div盒子的位置是left:0,top:0;

          但是我們通過transform: translate(300px,300px);將盒子進行了偏移,所以,盒子的位置發生了改變。

          B.旋轉

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>body {background: pink;}div {width: 200px;height: 200px;margin: 200px;position: absolute;background: green;left: 0px;top: 0px;transform: rotate(45deg);}</style></head><body><div></div></body></html>

          代碼效果如下:

          如上圖所示,本來div盒子應該是四四方方的。

          但是,經過我們的代碼transform: rotate(45deg); //deg為單位,表示度數。

          進行了45度的旋轉之后,呈現出來的就是一個菱形的盒子了,旋轉的正方向為順時針,負方向為逆時針。

          C.縮放

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>body {background: pink;}div {width: 200px;height: 200px;margin: 200px;position: absolute;background: green;left: 0px;top: 0px;transform: scale(0.5,0.25);}</style></head><body><div></div></body></html>

          代碼效果如下:

          如上圖所示,本來盒子的寬高為200*200,而我們通過transform: scale(0.5,0.25);進行的縮放

          scale的第一個參數為0.5,表示橫向縮小為0.5倍

          scale的第二個參數為0.25,表示縱向縮小為0.25倍。

          scale的參數如果為1,則表示不進行任何縮放,小于1就是做縮小,而大于1表示做放大。

          小結:transform轉換中其實還包含了skew(傾斜),matrix(矩陣轉換),相對來說用到的不是特別多,所以在本文中我們便不再做介紹。

          4.flex布局

          Flex布局,可以簡便、完整、響應式地實現各種頁面布局。

          Flex是Flexible Box的縮寫,翻譯成中文就是“彈性盒子”,用來為盒裝模型提供最大的靈活性。任何一個容器都可以指定為Flex布局。

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>div{box-sizing: border-box;}.parent {width: 600px;height: 200px;margin: 100px;position: absolute;background: green;left: 0px;top: 0px;display: flex;justify-content: flex-start}.parent div{width: 20%;border:1px solid #ccc;background:pink;}</style></head><body><div><div>1</div><div>2</div><div>3</div><div>4</div></div></body></html>

          代碼效果如下:

          如圖所示,咱們通過display:flex將.parent元素設置為了flex盒子,那么子元素將會按照justify-content設置的方式進行元素的排列,目前看來,和我們沒有設置flex盒子的效果是一致的。

          接下來我們更改一下,將justify-content設置為flex-end,效果如下圖所示:

          所以我們就應該發現,flex-start是讓所有的子元素從父元素的左側開始排列

          而flex-end是讓所有的子元素從元素的右側開始排列。

          我們再來更改一下,將justify-content設置為center,效果如下圖所示:

          更厲害了,子元素在父盒子的中央位置排列顯示了。

          然后,我們再將justify-content設置為space-around,效果如下圖所示:

          它是平均分配的形式為每一個子元素設置了間距,但是看起來有點變扭。

          所以我們推薦將justify-content設置為space-between,效果如下圖:

          我們還可以通過flex-wrap來設置子元素是否換行顯示,以及flex-direction設置子元素排列的順序。

          這兩個屬性可以設置的值如下:

          flex-wrap: nowrap;//不換行,會自動收縮

          flex-wrap: warp;//換行,會自動收縮

          flex-wrap: warp-reverse;//反轉,從默認的從上到下排列反轉為從下到上。

          flex-direction:row; //從左至右一行一行進行子元素的排列

          flex-direction:column; //從上到下一列一列進行子元素的排列

          flex-direction:row-reverse; //從右至左一行一行進行子元素的排列

          flex-direction:column-reverse; //從下到上一列一列進行子元素的排列

          案例代碼如下:

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>div{box-sizing: border-box;}.parent {width: 600px;height: 200px;margin: 100px;position: absolute;background: green;left: 0px;top: 0px;display: flex;justify-content: space-between;flex-wrap: nowrap;flex-direction: row-reverse;}.parent div{width: 20%;border:1px solid #ccc;background:pink;}</style></head><body><div><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></div></body></html>

          我們設置了flex-wrap: nowrap;(不換行,壓縮所有的子元素在一行中顯示),以及flex-direction: row-reverse;(反向排列)

          代碼效果如下:

          如果設置為flex-wrap: warp(換行顯示無法在一行顯示的子元素),則效果如下:

          如果將flex-direction: column;,則會縱向排列元素,效果如下圖:

          除了上面的這些給伸縮盒子父元素設置的樣式之外,我們還可以可以伸縮盒子的子元素設置flex屬性,用來設置平均分配整個父盒子的空間。

          代碼如下:

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>div{box-sizing: border-box;}.parent {width: 600px;height: 200px;margin: 100px;position: absolute;background: green;left: 0px;top: 0px;display: flex;justify-content: space-between;}.parent div{flex:1;width: 20%;border:1px solid #ccc;background:pink;}</style></head><body><div><div>1</div><div>2</div><div>3</div><div>4</div></div></body></html>

          效果如下:

          如上圖所示,每個盒子平均分配了父盒子的空間,原本寬度為20%,現在被拉伸了。

          除此之外,咱們還可以使用flex屬性進行進一步的設置,代碼如下:

          <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document</title><style>div{box-sizing: border-box;}.parent {width: 600px;height: 200px;margin: 100px;position: absolute;background: green;left: 0px;top: 0px;display: flex;justify-content: space-between;}.parent div:nth-of-type(1){flex:1;border:1px solid #ccc;background:red;}.parent div:nth-of-type(2){flex:2;border:1px solid #ccc;background:green;}.parent div:nth-of-type(3){flex:2;border:1px solid #ccc;background:blue;}.parent div:nth-of-type(4){flex:1;border:1px solid #ccc;background:pink;}</style></head><body><div><div>1</div><div>2</div><div>3</div><div>4</div></div></body></html>

          效果如下圖:

          我們分別給四個子盒子設置了flex:1 , flex:2, flex:2 ,flex:1.

          這是什么意思呢?

          四個flex加起來一共是6.那么第一個盒子就占據整個父盒子的1/6寬度。

          同理,另外三個盒子分別占據2/6,2/6,1/6的寬度,所以就形成了我們現在看到的效果。

          原文來源于:黑馬程序員社區


          學習資源:

          想學習css,可以關注:黑馬程序員頭條號,后臺回復:css


          主站蜘蛛池模板: 亚洲一区二区三区免费观看| 亚洲天堂一区二区| 精品视频一区二区三区在线观看| 国产在线精品一区免费香蕉| 日韩人妻无码一区二区三区久久 | 中文无码AV一区二区三区| 在线播放一区二区| 久久久久国产一区二区| 又紧又大又爽精品一区二区| 精品人妻一区二区三区浪潮在线| 国产一区二区精品久久91| 国产日韩精品视频一区二区三区| 精品无码一区二区三区爱欲九九 | 无码精品人妻一区二区三区免费看 | 无码乱人伦一区二区亚洲| 无码人妻精品一区二区三区夜夜嗨| 国产一区二区在线观看麻豆| 无码少妇一区二区浪潮免费| 亚洲av福利无码无一区二区| 久久精品亚洲一区二区| 国产成人av一区二区三区在线| 精品少妇一区二区三区在线| 日本精品一区二区三本中文| 中文字幕精品一区二区| 大帝AV在线一区二区三区| 日本免费一区二区三区最新vr| 色噜噜狠狠一区二区三区| 精品亚洲A∨无码一区二区三区| 久久久无码精品国产一区| 久久99精品波多结衣一区| 久久精品一区二区三区资源网| 一区二区三区精品视频| 亚洲国模精品一区| 无码人妻精品一区二区在线视频| 中文字幕精品亚洲无线码一区应用| 中文字幕色AV一区二区三区| 国精品无码A区一区二区| 成人午夜视频精品一区| 国产亚洲情侣一区二区无码AV| 精品视频一区二区三区四区五区| 毛片一区二区三区|