2012-03-18 183 views
6

我正在爲iPhone和Android瀏覽器開發一個項目,這需要我構建一個類似溫度計的進度表,它可以對瀏覽器大小進行調整並輕鬆地更改進度。它需要儘可能地像設計一樣。也就是說,它需要花哨的漸變,插圖突出顯示和邊框。使用CSS構建複雜形狀

儀表:

enter image description here

通知白色插圖陰影和邊界

的進展應該延伸到圓形部分,以及繼續有奇特的效果。

我繼續有一個粗略的原型工作(在Chrome測試)http://jsfiddle.net/xduQ9/3/

html, 
 
body { 
 
    padding: 25px; 
 
} 
 

 
.circle { 
 
    margin-left: -6px; 
 
    width: 48px; 
 
    height: 48px; 
 
    border-radius: 25px 25px 25px 24px; 
 
    border: solid rgba(178, 181, 188, 0.8) 1px; 
 
    box-shadow: inset 1px 2px 0 #fff, inset 1px -2px 0 #fff, inset -2px 0 0 #fff, inset -2px -2px 0 #fff, inset 0 3px 0 rgba(255, 255, 255, 0.35), -20px -20px 0 #fff, 20px -20px 0 #fff, 20px 20px 0 #fff, -20px 20px 0 #fff; 
 
} 
 

 
.circle-wrap { 
 
    overflow: hidden; 
 
    width: 48px; 
 
    height: 51px; 
 
    position: absolute; 
 
    right: 0; 
 
} 
 

 
.wrap { 
 
    display: -webkit-box; 
 
    width: 100%; 
 
    position: relative; 
 
    height: 51px; 
 
    overflow: hidden; 
 
} 
 

 
.progress { 
 
    position: absolute; 
 
    z-index: 0; 
 
    height: 100%; 
 
    width: 70%; 
 
    background: url("http://dl.dropbox.com/u/905197/white-stripe-diagonal.png"), -webkit-linear-gradient(top, rgba(183, 237, 21, 1) 0%, rgba(140, 186, 24, 1) 28%, rgba(78, 126, 11, 1) 65%, rgba(59, 86, 0, 1) 99%); 
 
} 
 

 
.meter.complete .progress { 
 
    width: 100%; 
 
    -webkit-animation: progress-slide 0.6s linear infinite; 
 
} 
 

 
@-webkit-keyframes progress-slide { 
 
    0% { 
 
    background-position: 0 0; 
 
    } 
 
    100% { 
 
    background-position: 25px 25px; 
 
    } 
 
} 
 

 
.progress-cover { 
 
    position: absolute; 
 
    top: 19px; 
 
    width: 70%; 
 
    height: 12px; 
 
    border-radius: 9px 0 0 9px; 
 
    border: solid #70901b 1px; 
 
    border-right: 0; 
 
    z-index: 2; 
 
} 
 

 
.top-mask { 
 
    position: absolute; 
 
    box-sizing: border-box; 
 
    width: 100%; 
 
    height: 18px; 
 
    padding-left: 45px; 
 
    margin-left: -45px; 
 
    background: white; 
 
    border-bottom: solid #b2b5bc 1px; 
 
    border-radius: 0 0 33px 0; 
 
    box-shadow: 1px 2px 0 #fff, 0 3px 0 rgba(255, 255, 255, 0.35); 
 
} 
 

 
.bottom-mask { 
 
    position: absolute; 
 
    bottom: 0; 
 
    box-sizing: border-box; 
 
    width: 100%; 
 
    height: 17px; 
 
    padding-left: 45px; 
 
    margin-left: -45px; 
 
    background: white; 
 
    border-top: solid #b2b5bc 1px; 
 
    border-radius: 0 19px 0 0; 
 
    box-shadow: 1px -2px 0 #fff; 
 
} 
 

 
.inner { 
 
    position: absolute; 
 
    top: 0; 
 
    left: 2px; 
 
    width: 3px; 
 
    height: 12px; 
 
    border: solid 3px #fff; 
 
    border-right: none; 
 
    border-radius: 5px 0 0 5px; 
 
} 
 

 
.meter { 
 
    position: relative; 
 
} 
 

 
.left-border { 
 
    position: absolute; 
 
    top: 17px; 
 
    left: -4px; 
 
    width: 10px; 
 
    height: 16px; 
 
    border-radius: 12px 0 0 12px; 
 
    border: solid 1px #b2b5bc; 
 
    border-right: none; 
 
    z-index: 3; 
 
}
<div class="meter complete"> 
 
    <!-- Remove .complete to stop animation --> 
 
    <div class="left-border"> 
 
    <div class="inner"></div> 
 
    </div> 
 
    <div class="wrap"> 
 
    <div class="progress"></div> 
 
    <div class="top-mask"></div> 
 
    <div class="bottom-mask"></div> 
 
    <div class="circle-wrap"> 
 
     <div class="circle"></div> 
 
    </div> 
 
    </div> 
 
</div>

的技術基本上剪輯有條紋綠色背景與圓角的幾個div的矩形直到出現所需的形狀。然後,我使用一束陰影來添加填充和米周圍的插圖。

我的問題:你會怎麼做?我的意思是,我可以稍微優化這個解決方案。我可以添加更多標記來使設計恰到好處,但它感覺太髒了。我有一種感覺,跨瀏覽器測試並不容易。我想過使用畫布,但如果瀏覽器調整大小,必須重新繪製形狀,這很糟糕。

我想避免儘可能地使用圖片,但如果一個優雅的解決方案是可能的,我一定會使用它。

儘管能夠更改進度條的顏色並不是實現的要求,但我想要一個具有該能力的解決方案。

+0

更新撥弄'-moz-'廠商Firefox的前綴。它看起來不如在Chrome中:http://jsfiddle.net/xduQ9/8/ – 2012-03-18 11:10:52

回答

3

你的小提琴在Firefox(Aurora)或IE中無法使用。

我知道你不喜歡使用圖像,但我認爲這將是更清潔的代碼,如果你只使用圖像。

爲什麼?因爲你可以創建一個包含3部分的精靈: 第一部分是米的外部部分,其中部分是透明的,第二部分是「酒吧」,第三部分是白色的,用來隱藏酒吧並給人一種印象百分比。

然後你做一個簡單的JavaScript代碼來隱藏開始右邊的百分比(如果用戶有24%,然後位置-76px)。

我會完全按照顯示完整的方式繪製條形圖,並使用z-index將流量計放在頂部,然後用白色部分來僞造進度。 開始時是一個大圈。

這個圓圈最後會填滿圓的部分(我不知道當前的米是什麼樣子,如果你有直線,那麼用一個正方形代替圓)。

油漆難道草圖:

enter image description here

這個版本會比純CSS更容易,將都看在所有瀏覽器。 調整大小也適用於流體div和流體圖像大小的一些腳本。

一旦你有一個比例,你想與其餘的工作是簡單的。

+0

我喜歡上圖!但是,我明白了。我想到了一開始就走這條路,但我的瘋狂科學家決定把它CSS出來。另外,我們的設計師在Fireworks工作,所以每次我必須編輯他的東西時,我都想打個小寶寶。 – 2012-03-18 10:45:24

+0

哈哈一手拉?我注意到你有圓形的邊框,所以一個正方形不會。 :)我也編輯過這個帖子,所以你可以做動畫(起初不知道有一個)。但只是動畫吧,並與隱藏的白色部分做百分比。 – justanotherhobbyist 2012-03-18 10:52:33

+0

看起來,我必須走這條路,以確保它在所有瀏覽器版本中保持一致。不開心的一天。我只希望我能用CSS改變進度條的顏色。哦,很好 – 2012-03-18 22:20:46

2

你必須準備放棄一些視覺糖果來實現完全的跨瀏覽器兼容性,但考慮到你正在尋找iPhone/Android市場,我會讓自己變傻,並說「你」將會好起來的「

看看shapes of css - 可能是唯一的css-tricks文章,我會發現有趣和有用的 - 使用CSS屬性來實現你所追求的創意靈感。做好準備,花哨的漸變,你會有不同的形狀之間匹配「針」的問題。

語義標記可能不會出現問題,所以您可以隨意使用所有您需要的元素(但要儘量利用:之前和之後:僞元素以免污染HTML)。如果這取決於我,我可能會欺騙一下,使溫度計尖端固定,即總是完全填滿或空着,並將「進度」變成帶有圓角TL和BL角的div。

回想起來,你的例子已經是較好的,但這裏是無論如何小提琴:) http://jsfiddle.net/8dbjw/

+0

非常好。但是這個版本的進展是錯誤的。 – 2012-03-18 22:13:45

+0

@JohnFawcett:哈哈,我想我太專注於從底部填充的「物理」溫度計。如果你將float更改爲「left」,並且只有在100%時才填充泡泡,那麼這將起作用。祝你好運! :) – 2012-03-18 22:32:45