2012-03-18 140 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