2012-03-18 4 views
6

저는 브라우저 크기 조정에 반응 할 수 있고 진행 상황을 쉽게 변경할 수있는 온도계와 같은 진행률계를 작성해야하는 iPhone 및 Android 브라우저 용 프로젝트를 진행하고 있습니다. 가능한 한 디자인과 같아야합니다. 즉, 멋진 그라디언트, 강조 표시 삽입, 테두리가 필요합니다.복잡한 모양을 CSS로 작성하기

미터 :

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의와 줄무늬 녹색 배경으로 사각형을 얻었다 원하는 모양이 나올 때까지 그런 다음 나는 그림자를 사용하여 패딩과 미터 주위의 삽입을 추가합니다.

내 질문 : 당신은 무엇을 할 생각입니까? 내 말은, 나는이 솔루션을 약간 최적화 할 수있다. 디자인을 올바르게하기 위해 마크 업을 추가 할 수는 있지만 너무 더러워 보입니다. 브라우저 간 테스트에는 쉽지 않을 것 같은 느낌이 들었습니다. 나는 캔버스를 사용하는 것에 대해 생각했다. 그러나 브라우저가 크기를 재조정하면 모양을 다시 그리는 데는 짜증이 난다.

이미지를 가능한 한 많이 사용하지 않는 것이 좋습니다. 그렇다면 세련된 솔루션을 사용할 수 있다면 확실히 사용하겠습니다.

진행률 표시 줄의 색상을 변경할 수있는 기능은 구현 요구 사항이 아니지만 그 기능을 갖춘 솔루션을 원합니다.

+0

업데이트 바이올린입니다. 크롬처럼 보이지 않습니다. http://jsfiddle.net/xduQ9/8/ –

답변

3

귀하의 바이올린은 firefox (Aurora) 또는 IE에서 작동하지 않습니다.

나는 당신이 이미지를 사용하지 않는 것을 알고 있지만 이것이 단지 이미지 만 사용한다면 코드에서 더 깨끗하게 될 것이라고 생각한다.

왜? 당신은 3 부분으로 스프라이트를 만들 수 있기 때문에 : 첫 번째 부분은 바의 부분이 투명하고 두 번째 부분은 "바"를 가지고 세 번째 부분은 바를 감추고 하얀 느낌을줍니다 비율.

그런 다음 바로 시작하는 막대의 백분율을 숨기기위한 간단한 자바 스크립트 코드를 작성합니다 (사용자가 24 퍼센트, 그 다음 위치는 -76 픽셀).

막대를 꽉 채우고 z- 색인을 사용하여 미터를 맨 위에 놓은 다음 흰색 부분을 가짜로 만들었습니다. 처음에는 커다란 원이었습니다.

원형은 마지막 부분에 둥근 부분을 채 웁니다 (현재 미터가 원 모양 대신에 직선으로 나타나면 그 모양이 어떤지 알 수 없습니다).

페인트에 스케치나요 :

enter image description here

이 버전은 순수 CSS보다 더 쉬울 것입니다 및 모든 브라우저에서 비슷하게 보일 것이다. 크기 조정은 유체 div 및 유체 이미지 크기에서 일부 스크립팅으로 수행 할 수도 있습니다.

나머지 비율로 작업하고 싶다면 간단히 말해야합니다.

+0

이전 다이어그램이 마음에 들었습니다! 하지만 그래, 알았다. 나는이 길을 처음부터 생각해 봤지만 내 안에있는 미친 과학자가 CSS로 결정했다. 또한 디자이너는 Fireworks에서 작업하므로 그의 물건을 편집 할 때마다 아기를 펀치하고 싶습니다. –

+0

하하 handdrawn 하나? 나는 네가 국경을 둥글게해서 사각형이 그렇게하지 못한다는 것을 알아 차렸다. :) 나는 또한 당신이 애니메이션을 할 수 있도록 포스트를 편집했다. 그러나 막대에 애니메이션 효과를 적용하고 숨어있는 흰색 부분에 백분율을 적용하면됩니다. – justanotherhobbyist

+0

모든 브라우저 버전에서 일관성을 유지하려면이 경로를 따라야 할 것 같습니다. 슬픈 날. CSS로 진행 막대의 색상을 바꿀 수 있었으면 좋겠습니다. 오 잘. –

2

완전한 크로스 브라우저 호환성을 위해 비주얼 캔디를 포기할 준비가되어 있어야하지만, 아이폰/안드로이드 마켓을 볼 때 나는 자신을 바보로 만들고 "너 ' 괜찮을거야. "

shapes of css - 아마도 내가 흥미롭고 유용하게 사용할 수있는 유일한 CSS 트릭 문서 - CSS 속성을 사용하여 창의적으로 영감을 얻은 것. 멋진 그라디언트를 사용하면 별도의 모양 사이에 "스티치"를 매칭하는 데 문제가있을 수 있습니다.

의미 론적 마크 업은 의문의 여지가 있기 때문에 필요한 모든 요소를 ​​사용하여 거칠게 나타납니다 (그러나 HTML을 완전히 오염시키지 않도록하기 위해 : before 및 : after pseudoelements를 사용해보십시오). 그것이 내게 달린 것이라면, 아마도 약간의 속임수를 썼을 것이고, 온도계 팁을 고정시켜야합니다. 즉, 항상 완전히 채워지거나 비어 있거나 둥근 TL 및 BL 모서리가있는 div에 "진행"이 있습니다. 돌이켜

, 당신의 예는 이미 더 나은,하지만 여기 어쨌든 바이올린 : 파이어 폭스의`-moz-`공급 업체 접두사 http://jsfiddle.net/8dbjw/

+0

아주 좋네. 그러나이 버전은 진전이 잘못되었습니다. –

+0

@JohnFawcett : 하하, 나는 바닥에서 채우는 "물리적 인"온도계에 너무 집중했다고 생각합니다. float를 "left"로 변경하고 거품이 100 % 일 때 채우면 작동합니다. 행운을 빕니다! :) –