使用CSS构建复杂的形状

时间:2012-03-18 08:13:47

标签: jquery html css html5

我正在开发一个针对iphone和android浏览器的项目,要求我构建一个类似温度计的进度表,它可以对浏览器调整大小做出反应,并且可以轻松地改变进度。它需要尽可能地像设计。也就是说,它需要花哨的渐变,嵌入突出显示,边框。

仪表:

enter image description here

注意白色插入阴影和边框

进展应延伸到圆形部分,并继续产生奇特的效果。

我继续前进,得到了一个粗略的原型(用铬测试)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,直到出现所需的形状。然后我使用一堆阴影来添加填充和仪表周围的插图。

我的问题:你会做什么?我的意思是,我可以稍微优化这个解决方案。我可以添加更多标记以使设计恰到好处,但感觉非常脏。而且我觉得跨浏览器测试并不容易。我考虑过使用canvas,但是如果浏览器调整大小,则不得不重新绘制形状。

我想避免尽可能多地使用图片,但如果可以使用它们,我肯定会使用它。

虽然能够改变进度条的颜色并不是实现的要求,但我想要一个具有这种能力的解决方案。

2 个答案:

答案 0 :(得分:3)

你的小提琴在firefox(Aurora)或IE中不起作用。

我知道你不喜欢不使用图像,但我认为如果只使用图像,这在代码中会更清晰。

为什么呢?因为你可以创建一个包含3个部分的精灵: 第一部分是仪表的外部部分,条形部分是透明的,第二部分是“条形”,第三部分是白色以隐藏条形并给出百分比的印象。

然后你做了一个简单的javascript代码,用于隐藏从右边开始的栏的百分比(比如用户有24%然后位置-76px)。

我会完全按照显示的方式绘制条形图并使用z-index将仪表放在顶部,然后使用白色部分来伪造进度。 一开始就是一个大圈子。

圆圈将在最后填充圆形部分(我不知道当前的仪表在那里是什么样的,如果你有直线那么那么就用方形而不是圆形)。

画了草图:

enter image description here

这个版本比纯CSS更容易,并且在所有浏览器上看起来都很相似。 调整大小也适用于流体div和流体图像大小的一些脚本。

一旦你想要使用其他比例,其余的就是简单的。

答案 1 :(得分:2)

你必须准备好放弃一些视觉糖果以实现完全跨浏览器的兼容性,但是,鉴于你正在寻找iPhone / Android市场,我会愚弄自己并说“你会”没关系“

看看shapes of css - 可能是我发现的唯一有趣且有用的css-tricks文章 - 用于创造性的灵感,即使用css属性来完成你所追求的目标。做好准备,通过花哨的渐变,你会遇到在不同形状之间匹配“针脚”的问题。

语义标记可能是不可能的,所以你需要所有元素(但是请尝试利用:在假元素之前和之后:以便不完全污染HTML)。如果它取决于我,我可能会作弊并使温度计尖端固定,即始终完全填充或空,并将“进展”放入具有圆形TL和BL角的div中。

回想起来,你的例子已经更好了,但无论如何这里都是小提琴:) http://jsfiddle.net/8dbjw/

相关问题