国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

CSS3實(shí)現(xiàn)柱狀圖的3D立體動(dòng)畫(huà)效果

dongfangyiyu / 1190人閱讀

摘要:一開(kāi)始的難點(diǎn)在于創(chuàng)建一個(gè)六面半透明的立方體,而后面的難點(diǎn)在于如何創(chuàng)建一個(gè)完整的帶有動(dòng)畫(huà)效果的柱狀圖。和一起使用可以實(shí)現(xiàn)背景的部分填充可以實(shí)現(xiàn)具有透明度的顏色屬性可以創(chuàng)建三角形形狀最后,要獲取柱狀圖的立體動(dòng)畫(huà)效果源碼可以

首先,我們看一看要實(shí)現(xiàn)的效果:

這篇文章所實(shí)現(xiàn)的動(dòng)畫(huà)效果起源于一個(gè)小小的想法,這個(gè)想法來(lái)自于另一個(gè)網(wǎng)站的一篇文章,它介紹了如何在網(wǎng)頁(yè)中使用CSS、圖片和JavaScript創(chuàng)建立體的柱狀圖。在閱讀了那篇文章之后,我想挑戰(zhàn)一下,嘗試使用純CSS來(lái)實(shí)現(xiàn)相同的效果。一開(kāi)始的難點(diǎn)在于創(chuàng)建一個(gè)六面半透明的立方體,而后面的難點(diǎn)在于如何創(chuàng)建一個(gè)完整的帶有動(dòng)畫(huà)效果的3D柱狀圖。下面,我們就一起來(lái)看一下如何解決這些難點(diǎn)。

讓我們先列舉一些要實(shí)現(xiàn)的要求,我們所實(shí)現(xiàn)的柱狀圖應(yīng)該是:

背景獨(dú)立(即柱狀圖與背景互不影響)

自適應(yīng)的(柱子數(shù)量的多少不會(huì)影響布局)

可縮放(如矢量圖一樣)

易于定制(顏色、尺寸和比例)

計(jì)劃是任何項(xiàng)目中最重要的一個(gè)部分。所以我們要先制定一個(gè)計(jì)劃。

在實(shí)際編碼之前,我通常會(huì)列出項(xiàng)目中我會(huì)遇到的潛在挑戰(zhàn)和解決這些挑戰(zhàn)的方案,然后重復(fù)這個(gè)過(guò)程,直到我得到一個(gè)看起來(lái)可以執(zhí)行的策略的東西。下面是我為這個(gè)項(xiàng)目提出的挑戰(zhàn)列表和解決方案:

挑戰(zhàn)1 - 帶有可伸縮內(nèi)核的柱子

我們知道:

一個(gè)柱狀圖是由6個(gè)面組成的立體圖形

這個(gè)柱狀圖的內(nèi)核是可以垂直伸縮的,并且有一個(gè)選項(xiàng)可以隱藏它

所以,我們需要:

一個(gè)div,生成柱狀圖的三個(gè)面(背部、底部、左側(cè))

一個(gè)div,生成柱狀圖的另三個(gè)面(正面、頂部、右側(cè))

一個(gè)div,生成內(nèi)核柱體的三個(gè)面,與上面的第二個(gè)div類似,但是它的z-index值要小

一個(gè)div,作為容器,用于定位以上的三個(gè)組件,并且在右下角實(shí)現(xiàn)一個(gè)實(shí)色的背景

一個(gè)div,帶有overflow: hidden的容器,用于內(nèi)核柱體的高度為0時(shí),隱藏它。

總共有五個(gè)div。

你可能想知道為什么我們需要兩個(gè)容器?嗯,這是一個(gè)不好解釋的問(wèn)題,但我會(huì)嘗試著說(shuō)明清楚。

每個(gè)柱體我們需要至少一個(gè)容器(以保證前三個(gè)div的位置),由于我們的柱體內(nèi)核是可伸縮的,所以我們使用百分比來(lái)操縱內(nèi)核的高度,這就要求容器的高度等于條形圖Y軸的高度。

這看起來(lái)很好,但是,有另外一個(gè)問(wèn)題,應(yīng)該有一個(gè)選項(xiàng)可以隱藏移動(dòng)中的內(nèi)核,這意味著它應(yīng)該“低于柱體”并且隱藏。你可能會(huì)說(shuō)有一個(gè)解決方法 - overflow: hidden,是的,但是它不適用于這里的容器,因?yàn)樗母叨纫葘?shí)際的柱體高度短,這就是我們?yōu)槭裁匆砑恿硪粋€(gè)容器的原因。

希望我說(shuō)清楚了,下面我們繼續(xù)。

挑戰(zhàn)2 - 坐標(biāo)軸

坐標(biāo)軸應(yīng)該:

是一個(gè)三維立體坐標(biāo)軸,它包含3個(gè)面(背景面,X軸面,Y軸面)

背景獨(dú)立

自適應(yīng)柱體的數(shù)量和屬性(width,height等)

外側(cè)有X軸與Y軸的文字標(biāo)簽

所以,我們需要:

一個(gè)無(wú)序列表

X軸標(biāo)簽的每個(gè)列表項(xiàng)內(nèi)有一個(gè)span元素

每個(gè)列表項(xiàng)中有一個(gè)柱體

Y軸標(biāo)簽內(nèi)包含一個(gè)無(wú)序列表

實(shí)現(xiàn)

現(xiàn)在我們有了一個(gè)總體的計(jì)劃,讓我們把它轉(zhuǎn)換成代碼。

請(qǐng)注意,文章中的代碼沒(méi)有寫(xiě)瀏覽器前綴。在實(shí)際的項(xiàng)目中請(qǐng)不要省略。

挑戰(zhàn)1 - 帶有可伸縮內(nèi)核的柱子

50

讓我們?cè)俅位仡櫭總€(gè)元素的用途:

bar-wrapper – 當(dāng).bar-inner滑動(dòng)到柱體的下方時(shí)隱藏它

bar-container – 作為.bar-foreground, .bar-inner, .bar-foreground定位的參考元素,并設(shè)置底角的背景顏色

bar-background – 生成柱狀圖的三個(gè)面(背部、底部、左側(cè))

bar-inner – 最重要的部分 – 柱子內(nèi)核

bar-foreground – 生成柱狀圖的另三個(gè)面(正面、頂部、右側(cè))

首先,讓我們?cè)O(shè)置容器的樣式。

/* Bar wrapper容器 - 當(dāng)內(nèi)核低于柱體高度時(shí)隱藏內(nèi)核,必需的 */
.bar-wrapper {
  overflow: hidden;
}
/* Bar container容器 - 這家伙是柱形圖里真正的家長(zhǎng)——子元素都是相對(duì)于它定位的。 */
.bar-container {
  position: relative;
  margin-top: 2.5em;
  width: 12.5em;
}
/* 右下角的小塊 - 確保內(nèi)核向下滑動(dòng)時(shí)右下角被“切割” */
.bar-container:before {
  content: "";
  position: absolute;
  z-index: 3;

  bottom: 0;
  right: 0;

  width: 0;
  height: 0;
  border-style: solid;
  border-width: 0 0 2.5em 2.5em;
  border-color: transparent transparent rgba(183,183,183,1);
}

請(qǐng)注意,我們將.bar-container的寬度設(shè)置為12.5em。這個(gè)數(shù)字是柱體的正面和右側(cè)寬度的總和-在我們的示例中,它是10+2.5=12.5。

我們還使用border屬性來(lái)創(chuàng)建三角形,并將其放置在 .bar-container的右下角,以確保內(nèi)核的側(cè)邊在垂直移動(dòng)時(shí)能被“切割”。我們使用:before偽類來(lái)生成這個(gè)元素。

下面我們來(lái)設(shè)置.bar-background:

/* 背面 */
.bar-background {
  width: 10em;
  height: 100%;
  position: absolute;
  top: -2.5em;
  left: 2.5em;
  z-index: 1;
}

.bar-background:before,
.bar-background:after {
  content: "";
  position: absolute;
}

/* 底面 */
.bar-background:before {
  bottom: -2.5em;
  right: 1.25em;
  width: 10em;
  height: 2.5em;
  transform: skew(-45deg);
}

/* 左后面 */
.bar-background:after {
  top: 1.25em;
  right: 10em;
  width: 2.5em;
  height: 100%;

  /* 僅傾斜Y軸 */
  transform: skew(0deg, -45deg);
}

如你所見(jiàn),我們將.bar-background向上和向右移動(dòng)2.5em。當(dāng)然,我們把左后面和底面傾斜45度。請(qǐng)注意,:after偽元素中將第一個(gè)傾斜值設(shè)置為0deg,第二個(gè)設(shè)置為-45度,這樣只傾斜元素的Y軸。

接著來(lái)設(shè)置.bar-foreground:

/* 前面 */
.bar-foreground {
    z-index: 3; /* 在 .bar-background 和.bar-inner 之上 */
}
.bar-foreground,
.bar-inner {
  position: absolute;
  width: 10em;
  height: 100%;
  top: 0;
  left: 0;
}

.bar-foreground:before,
.bar-foreground:after,
.bar-inner:before,
.bar-inner:after {
  content: "";
  position: absolute;
}

/* 右前面 */
.bar-foreground:before,
.bar-inner:before {
  top: -1.25em;
  right: -2.5em;
  width: 2.5em;
  height: 100%;
  background-color: rgba(160, 160, 160, .27);

  transform: skew(0deg, -45deg);
}

/* 前面 */
.bar-foreground:after,
.bar-inner:after {
  top: -2.5em;
  right: -1.25em;
  width: 100%;
  height: 2.5em;
  background-color: rgba(160, 160, 160, .2);

  transform: skew(-45deg);
}

這里沒(méi)什么新鮮的,一切都和.bar-background的樣式一樣,只是方向不同。

其中,部分的樣式同時(shí)應(yīng)用在了.bar-foreground和.bar-inner元素上,因?yàn)樗鼈兊臉幼邮峭耆嗤摹?/p>

好了,下面我們繼續(xù)設(shè)置內(nèi)核的樣式。

.bar-inner {
  z-index: 2; /* 在.bar-background的上面 */
  top: auto; /* 重置 top屬性 */
  background-color: rgba(5, 62, 123, .6);
  height: 0;
  bottom: -2.5em;
  color: transparent; /* 隱藏文字 */

  transition: height 1s linear, bottom 1s linear;
}

/* 右面 */
.bar-inner:before {
  background-color: rgba(5, 62, 123, .6);
}

/* 上面 */
.bar-inner:after {
  background-color: rgba(47, 83, 122, .7);
}

好了,柱體的樣式就設(shè)置好了,接下來(lái)我們來(lái)看坐標(biāo)軸。

挑戰(zhàn)2 - 坐標(biāo)軸

  • 2011 <-- 此處顯示柱狀圖圖的HTML標(biāo)記 -->
  • 2012 <-- 此處顯示柱狀圖圖的HTML標(biāo)記 -->
    • 25%
    • 50%
    • 75%
    • 100%

如您所見(jiàn),我們?cè)陧?xiàng)目中使用無(wú)序列表和span元素來(lái)定位X軸和Y軸標(biāo)簽。

/** 坐標(biāo)軸容器 **/
.graph-container {
  position: relative; 
  display: inline-block; 
  padding: 0; 
  list-style: none; /* 去除列表元素自帶的小黑點(diǎn) */

  /* 背景 */
  background-image: linear-gradient(left , rgba(255, 255, 255, .3) 100%, transparent 100%);
  background-repeat: no-repeat;
  background-position: 0 -2.5em;
}

這里有一個(gè)小點(diǎn),我們使用線性漸變填充容器背景并將其提升2.5em,為什么?因?yàn)樽鴺?biāo)軸的底端(我們將在下一個(gè)樣式中設(shè)置)高度是2.5em。而且坐標(biāo)軸傾斜了45度,所以右下角有一個(gè)空白區(qū)域。

坐標(biāo)軸的X軸樣式:

/* X軸 */
.graph-container:before {
  position: absolute;
  content: "";

  bottom: 0;
  left: -1.25em; /* 傾斜會(huì)將它向左推,所以我們將它向相反的方向移動(dòng)一點(diǎn)。 */

  width: 100%; /* 確保它和整個(gè)組件一樣寬 */

  height: 2.5em;
  background-color: rgba(183, 183, 183, 1);

  transform: skew(-45deg);
}

我們把它傾斜45度,然后向左移動(dòng)一點(diǎn),以確保它的位置正確。

坐標(biāo)軸的Y軸樣式:

/* Y軸 */
.graph-container:after {
  position: absolute;
  content: "";

  top: 1.25em; /* 傾斜會(huì)將其向上推,因此我們將其向下移動(dòng)一點(diǎn)。 */
  left: 0em;

  width: 2.5em;
  background-color: rgba(28, 29, 30, .4);

  transform: skew(0deg, -45deg);
}

這里沒(méi)什么特別的。一樣將元素傾斜45度,然后向下推一點(diǎn),以便正確定位。

坐標(biāo)軸的基本設(shè)置就是這些,接下來(lái)我們繼續(xù)設(shè)置列表項(xiàng)里面的樣式:

.graph-container > li {
  float: left; /* 水平排列 */
  position: relative; 
}
.graph-container > li:nth-last-child(2) {
  margin-right: 2.5em;
}
/* X軸的文字標(biāo)簽 */
.graph-container > li > span {
  position: absolute;
  left: 0;
  bottom: -2em;
  width: 80%; 
  text-align: center;

  font-size: 1.5em;
  color: rgba(200, 200, 200, .4);
}

這里有兩個(gè)要注意的點(diǎn)。首先,我們使用浮動(dòng)將柱體水平排列。通常情況下都應(yīng)該非常小心地使用浮動(dòng),它會(huì)帶來(lái)高度塌陷等布局問(wèn)題。所以,在這里你可以嘗試變?yōu)樵O(shè)置display:inline-block來(lái)實(shí)現(xiàn)。

第二,我們?cè)谧詈笠粋€(gè)柱體上添加了一些右邊距。這樣我們就可以確保給坐標(biāo)軸底部留出足夠的空間,試著去掉它,你就會(huì)明白我的意思。

OK,我們就快完成了。最后要做的是添加Y軸的文字標(biāo)記。

/* 文字標(biāo)記的容器 */
.graph-container > li:last-child {
  width: 100%;
  position: absolute;
  left: 0;
  bottom: 0;
}

/* Y軸文字標(biāo)記列表 */
.graph-marker-container > li {
  position: absolute;
  left: -2.5em;
  bottom: 0;
  width: 100%;
  margin-bottom: 2.5em;
  list-style: none;
}

/* Y軸線條常規(guī)樣式 */
.graph-marker-container > li:before,
.graph-marker-container > li:after {
  content: "";
  position: absolute;
  border-style: none none dotted;
  border-color: rgba(100, 100, 100, .15);
  border-width: 0 0 .15em;
  background: rgba(133, 133, 133, .15);
}

/* Y軸側(cè)線 */
.graph-marker-container > li:before {
  width: 3.55em;
  height: 0;
  bottom: -1.22em;
  left: -.55em;
  z-index: 2; 
  transform: rotate(-45deg);
}

/* Y軸背景線 */
.graph-marker-container li:after {
  width: 100%;
  bottom: 0;
  left: 2.5em;
}

/* Y軸文本標(biāo)簽 */
.graph-marker-container span {
  color: rgba(200, 200, 200, .4);
  position: absolute;

  top: 1em;
  left: -3.5em; 
  width: 3.5em; 

  font-size: 1.5em;
}

如您所見(jiàn),我們將文字標(biāo)記容器的寬度設(shè)置為100%,使得背景線能夠覆蓋整個(gè)坐標(biāo)軸,使用虛線邊框設(shè)置Y軸線條的樣式并定位span元素,使文字標(biāo)簽位于坐標(biāo)軸的外側(cè)。使用:before和:after偽元素,可以減少HTML的代碼量,讓頁(yè)面保持干凈。

到這里,我們已經(jīng)完成了柱狀圖的所有樣式設(shè)置,但是我們?nèi)鄙僖恍┲匾淖兞俊笮?、顏色和條形填充值!上面說(shuō)過(guò)我們的圖表是可定制的,所以,我決定不把變量和其他代碼混合在一起,這樣你就可以更方便的自定義它們了。

/****************
 * 尺寸        *
 ****************/
 /* 圖表的整體大小 */
.graph-container,
.bar-container {
  font-size: 8px;
}
/* 柱體的高度 */
.bar-container,
.graph-container:after,
.graph-container > li:last-child {
  height: 40em;
}

/****************
 * 間距      *
 ****************/
/* 柱體的間距 */
.graph-container > li .bar-container {
  margin-right: 1.5em;
}
/* 第一個(gè)柱體的左邊距 */
.graph-container > li:first-child {
  margin-left: 1.5em;
}
/* 最后一個(gè)柱體的右邊距 */
.graph-container > li:nth-last-child(2) .bar-container {
  margin-right: 1.5em;
}

/****************
 *    顏色    *
 ****************/
/* 柱體的背面顏色 */
.bar-background {
  background-color: rgba(160, 160, 160, .1);
}
/* 柱體的底面顏色 */
.bar-background:before {
  background-color: rgba(160, 160, 160, .2);
}
/* 柱體的左后面顏色 */
.bar-background:after {
  background-color: rgba(160, 160, 160, .05);
}
/* 柱體的正面顏色 */
.bar-foreground {
  background-color: rgba(160, 160, 160, .1);
}
/* 內(nèi)核的顏色 */
.bar-inner,
.bar-inner:before { background-color: rgba(5, 62, 123, .6); }
.bar-inner:after { background-color: rgba(47, 83, 122, .7); }

/*************************************
 *   內(nèi)核的高度                      *
 *************************************/
.graph-container > li:nth-child(1) .bar-inner { height: 25%; bottom: 0; }
.graph-container > li:nth-child(2) .bar-inner { height: 50%; bottom: 0; }
.graph-container > li:nth-child(3) .bar-inner { height: 75%; bottom: 0; }

在下載的源碼中,您將無(wú)法找到這一部分代碼,因?yàn)槲以谀抢镒隽艘恍└腥さ氖虑椤沂褂昧藛芜x按鈕讓您在不修改代碼的情況下使用變量。但是,如果您只需要定制一個(gè)靜態(tài)圖形,那么就從上面獲取代碼片段,并根據(jù)您的喜好對(duì)其進(jìn)行定制。

總結(jié)
讓我們回顧一下文章中介紹的一些CSS規(guī)范/技術(shù)。

transform:skew()和transform:rotate()用于傾斜和旋轉(zhuǎn)元素,它們組合起來(lái)使元素模擬產(chǎn)生三維立體的效果。

:before和:after偽元素可以保持HTML標(biāo)記相對(duì)干凈

:nth-last-child()和:not是針對(duì)特定列表項(xiàng)的偽類,可以避免向HTML中添加額外的類/id。

linear-gradient和background-position一起使用可以實(shí)現(xiàn)背景的部分填充

rgba()可以實(shí)現(xiàn)具有透明度的顏色

border屬性可以創(chuàng)建三角形形狀

最后,要獲取柱狀圖的立體動(dòng)畫(huà)效果源碼可以:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/53970.html

相關(guān)文章

  • CSS3實(shí)現(xiàn)柱狀圖的3D立體動(dòng)畫(huà)效果

    摘要:一開(kāi)始的難點(diǎn)在于創(chuàng)建一個(gè)六面半透明的立方體,而后面的難點(diǎn)在于如何創(chuàng)建一個(gè)完整的帶有動(dòng)畫(huà)效果的柱狀圖。和一起使用可以實(shí)現(xiàn)背景的部分填充可以實(shí)現(xiàn)具有透明度的顏色屬性可以創(chuàng)建三角形形狀最后,要獲取柱狀圖的立體動(dòng)畫(huà)效果源碼可以 首先,我們看一看要實(shí)現(xiàn)的效果: showImg(https://segmentfault.com/img/bVbtkYc?w=981&h=512); 這篇文章所實(shí)現(xiàn)的...

    YorkChen 評(píng)論0 收藏0
  • CSS3實(shí)現(xiàn)柱狀圖的3D立體動(dòng)畫(huà)效果

    摘要:一開(kāi)始的難點(diǎn)在于創(chuàng)建一個(gè)六面半透明的立方體,而后面的難點(diǎn)在于如何創(chuàng)建一個(gè)完整的帶有動(dòng)畫(huà)效果的柱狀圖。和一起使用可以實(shí)現(xiàn)背景的部分填充可以實(shí)現(xiàn)具有透明度的顏色屬性可以創(chuàng)建三角形形狀最后,要獲取柱狀圖的立體動(dòng)畫(huà)效果源碼可以 首先,我們看一看要實(shí)現(xiàn)的效果: showImg(https://segmentfault.com/img/bVbtkYc?w=981&h=512); 這篇文章所實(shí)現(xiàn)的...

    CNZPH 評(píng)論0 收藏0
  • 不會(huì)做動(dòng)畫(huà)的程序猿不是好的動(dòng)畫(huà)師(如何用css3動(dòng)畫(huà)動(dòng)畫(huà)

    摘要:一過(guò)渡一的作用二的屬性二和動(dòng)畫(huà)一動(dòng)畫(huà)序列書(shū)寫(xiě)簡(jiǎn)例二書(shū)寫(xiě)簡(jiǎn)例常用屬性簡(jiǎn)寫(xiě)屬性三完整動(dòng)畫(huà)簡(jiǎn)例代碼三轉(zhuǎn)換一轉(zhuǎn)換縮放移動(dòng)旋轉(zhuǎn)設(shè)置元素轉(zhuǎn)換的中心點(diǎn)綜合性寫(xiě)法二轉(zhuǎn)換三維坐標(biāo)系透視呈現(xiàn)位移旋轉(zhuǎn)一過(guò)渡一的作用如果你有一個(gè)盒子,他的體內(nèi)也有個(gè)小盒子。 ...

    xeblog 評(píng)論0 收藏0
  • CSS 3D Panorama(全景) - 淘寶造物節(jié)技術(shù)剖析

    摘要:淘寶造物節(jié)的活動(dòng)頁(yè)就是全景的一個(gè)很贊的頁(yè)面,它將全景圖分割成等份,相鄰的元素構(gòu)成的夾角,相鄰兩側(cè)面相對(duì)于棱柱中心所構(gòu)成的夾角。 本文轉(zhuǎn)自凹凸實(shí)驗(yàn)室:https://aotu.io/notes/2016/08... showImg(https://segmentfault.com/img/remote/1460000011381045); 前言 3D 全景并不是什么新鮮事物了,但以前...

    LiuRhoRamen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<