순수 CSS를 사용하여 "툴팁 꼬리"를 어떻게 만들 수 있습니까?


89

방금 깔끔한 CSS 트릭을 발견했습니다. 바이올린을 확인하십시오 ...

.tooltiptail {
  display: block;
  border-color: #ffffff #a0c7ff #ffffff #ffffff;
  border-style: solid;
  border-width: 20px;
  width: 0px;
  height: 0px;
}
.anothertail {
  background-image: url(http://static.jqueryfordesigners.com/demo/images/coda/bubble-tail2.png);
  display: block;
  height: 29px;
  width: 30px;
}
<div>Cool Trick:
  <br />
  <div class="tooltiptail"></div>
</div>
<br />

<div>How do I get this effect with only CSS?
  <br />
  <div class="anothertail"></div>
</div>

이렇게하면 "도구 설명 꼬리"라는 작은 화살표 / 삼각형 효과가 생성됩니다. 이것은 내 마음을 날려 버린다! 이게 어떻게 작동하는지 정말 궁금 해요?!

또한이 CSS 트릭을 확장하여 다음과 같은 효과를 만드는 방법이 있습니까?

여기에 이미지 설명 입력

이것은 흥미로운 문제입니다. 지금은 그림자를 무시하고 CSS 만 사용하여이 작업을 수행 할 수 있습니까?


업데이트 1

나는 내 초기 질문에 대한 해결책을 찾았습니다. 여기 바이올린이 있습니다 ...

http://jsfiddle.net/duZAx/7/

HTML

<div style="position: relative;">Cool Trick:<br />
    <div class="tooltiptail"></div>
    <div class="tooltiptail2"></div>
</div>

CSS

.tooltiptail {
    display: block;
    border-color: #ffffff #a0c7ff #ffffff #ffffff;
    border-style: solid;
    border-width: 20px;
    width: 0px;
    height: 0px;
}
.tooltiptail2 {
    display: block;
    border-color: transparent #ffffff transparent transparent;
    border-style: solid;
    border-width: 18px;
    width: 0px;
    height: 0px;
    position: relative;
    left: 4px;
    top: -38px;
}

이제 그림자를 포함하고 브라우저 간 호환이 가능한 순수한 CSS를 사용하여 위의 작은 그림을 정확히 모방하는 방법은 무엇입니까?


업데이트 2

아래 답변을 조합 한 후의 해결책은 다음과 같습니다. 여러 브라우저에서 테스트하지는 않았지만 Chrome에서는 멋지게 보입니다.

http://jsfiddle.net/UnsungHero97/MZXCj/688/

HTML

<div id="toolTip">
    <p>i can haz css tooltip</p>
    <div id="tailShadow"></div>
    <div id="tail1"></div>
    <div id="tail2"></div>
</div>

CSS

#toolTip {
    background-color: #ffffff;
    border: 1px solid #73a7f0;
    width: 200px;
    height: 100px;
    margin-left: 32px;
    position:relative;
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    box-shadow: 0px 0px 8px -1px black;
    -moz-box-shadow: 0px 0px 8px -1px black;
    -webkit-box-shadow: 0px 0px 8px -1px black;
}

#toolTip p {
    padding:10px;
}

#tailShadow {
    background-color: transparent;
    width: 4px;
    height: 4px;
    position: absolute;
    top: 16px;
    left: -8px;
    z-index: -10;
    box-shadow: 0px 0px 8px 1px black;
    -moz-box-shadow: 0px 0px 8px 1px black;
    -webkit-box-shadow: 0px 0px 8px 1px black;
}

#tail1 {
    width: 0px;
    height: 0px;
    border: 10px solid;
    border-color: transparent #73a7f0 transparent transparent;
    position:absolute;
    top: 8px;
    left: -20px;
}

#tail2 {
    width: 0px;
    height: 0px;
    border: 10px solid;
    border-color: transparent #ffffff transparent transparent;
    position:absolute;
    left: -18px;
    top: 8px;
}


어떤 브라우저에서 작동해야합니까?
thirtydot 2011

1
이 시점에서 나는 정말로 신경 쓰지 않는다. :) 나는 이것이 가능한지보고 싶다! 현실적으로 저는 이미지를 사용하지만 도전에 관심이 있습니다
Hristo

윤곽선에 레이어드 요소와 픽셀 단위의 위치를 ​​사용하는 경우 가능해야합니다. 그림자가 있든 없든?
Arc

@Archimedix ... 전적으로 동의하지만 할 수 있습니까?
Hristo

1
이것은 너무 간단하지만 너무 굉장합니다.
Wesley Murch 2011

답변:


60

다음은 박스 섀도우가있는 예입니다. 모든 최신 버전의 브라우저가이를 지원해야합니다.

http://jsfiddle.net/MZXCj/1/

HTML :

<div id="toolTip">
    <p>i can haz css tooltip</p>
    <div id="tailShadow"></div>
    <div id="tail1"></div>
    <div id="tail2"></div>
</div>

CSS :

body {font-family:Helvetica,Arial,sans-serif;}

#toolTip {
    position:relative;
}

#toolTip p {
    padding:10px;
    background-color:#f9f9f9;
    border:solid 1px #a0c7ff;
    -moz-border-radius:5px;-ie-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;border-radius:5px;
}

#tailShadow {
    position:absolute;
    bottom:-8px;
    left:28px;
    width:0;height:0;
    border:solid 2px #fff;
    box-shadow:0 0 10px 1px #555;
}

#tail1 {
    position:absolute;
    bottom:-20px;
    left:20px;
    width:0;height:0;
    border-color:#a0c7ff transparent transparent transparent;
    border-width:10px;
    border-style:solid;
}

#tail2 {
    position:absolute;
    bottom:-18px;
    left:20px;
    width:0;height:0;
    border-color:#f9f9f9 transparent transparent transparent;
    border-width:10px;
    border-style:solid;
}


1
대박! 나는 다소 비슷한 해결책을 염두에두고 있었지만 내가 한 모든 것을 설명하기는 게으르다. :) +1
BoltClock

@m_m_m ... 내 업 보팅 권한을 되 찾으면 +1
Hristo

와, 좋아요! 작은 버그 : 그림자가 툴팁 상단에도 약간 보입니다
Iulius Curt 2011

@iuliux ... 그 버그는 z-index로 쉽게 고칠 수 있습니다. :)
Hristo

56

다음은 첫 번째 질문에 대한 설명입니다 (게으 르기 때문에 실제 CSS는 다른 사람에게 맡길 것입니다. 투표 할 가치가 있다고 생각하는 답변을 찬성 해주세요!) :

이렇게하면 "도구 설명 꼬리"라는 작은 화살표 / 삼각형 효과가 생성됩니다. 이것은 내 마음을 날려 버린다! 이게 어떻게 작동하는지 정말 궁금 해요?!

  1. 가장자리 색상은 다양하지만 스타일은 같지만 (귀하의 경우에는 solid) 테두리를 렌더링 할 때 인접한 각 쌍을 나누는 이음새가 대각선입니다. 그것은 무엇을 매우 유사 여기 다이어그램 의 묘사 groove, ridge, insetoutset 테두리 스타일.

    모든 브라우저가 동일한 방식으로 작동하고 내가 기억할 수있는 한 그렇게 해왔지만이 작동은 CSS2.1 사양 또는 CSS Backgrounds and Borders 모듈에서 완전히 정의되지 않았습니다. 후자는 모서리의 색상 및 스타일 전환을 설명하는 섹션이 있으며, 설명은 모서리 반경이 0 인 테두리의 경우 렌더링되는 선이 실제로 패딩 모서리의 모서리와 모서리의 모서리를 연결하는 선임을 암시하는 것 같습니다. 테두리 가장자리 (동일한 너비 테두리의 경우 45도 각도의 선이 됨)이지만 사양은 여전히 ​​이것이 항상 그런 것은 아니라는 점을 경고합니다 (특히 모서리 반경이 0 인 테두리를 명시 적으로 고려하지도 않기 때문에). 1

  2. 에 의해 콘텐츠 (오리지널 W3C) 박스 모델 콘텐츠 사이즈가 0x0으로 정의되는 더불어 40x40 영역이 20 화소의 테두리 밖으로 생성된다.

  3. 네 모서리를 연결하는 대각선으로 정사각형을 나누면 직각이 정사각형의 중간 점에서 만나는 네 개의 직각 삼각형이 생성됩니다 (아래 참조).

  4. 위쪽, 아래쪽 및 왼쪽 테두리는 .tooltiptail요소 컨테이너 의 배경과 일치하도록 흰색이고 오른쪽 테두리는 도구 설명의 배경색과 일치하는 파란색 음영입니다.

    border-color: #ffffff #a0c7ff #ffffff #ffffff;
    

결과적으로 테두리가 레이블이 지정되고 테두리 경계가 내 신뢰할 수있는 선 도구를 사용하여 추가됩니다.

툴팁 꼬리의 방향을 바꾸는 것은 단순히 툴팁 색상을 전환하는 것입니다. 예를 들어, 이것은 팁의 바닥에 부착 된 꼬리를 산출합니다 :

border-color: #a0c7ff #ffffff #ffffff #ffffff;

jsFiddle 미리보기


1 표준 준수를 고집하는 사람이라면이 모든 것을 해킹이라고 생각할 수도 있습니다.


젠장 빠른 타이핑, 똑같은 말을하려고 ... +1
easwee 2011-04-11

글쎄, 나는 분명히 질문을 읽는 것을 싫어합니다. 그것은 심지어 말했다 "I'm not worried about the shadow yet".
thirtydot 2011

1
@BoltClock ... 내 업 보팅 권한을 되 찾으면 +1을드립니다
Hristo

@BoltClock, 브라우저간에 동작이 일관 적입니까? 그리고 w3c에 따른이 동작은 얼마나 표준 입니까?
Pacerier

@Pacerier : 모서리 이음새를 대각선으로 렌더링하는 특정 동작은 사양에 정의되어 있지 않습니다. 이 동작은 브라우저에서 일관 적이며 오랫동안 변경되지 않았습니다. 내 대답에서 이것을 명확히 할 것입니다.
BoltClock

19

이 툴팁은 하나의 div요소 로만 수행합니다 .

HTML :

<div class="tooltip">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent augue justo, venenatis non tincidunt sit amet, suscipit eget ligula.</div>

CSS :

.tooltip{
    position: relative;
    border: 1px solid #73a7f0;
    width: 200px;
    margin-left: 20px;
    padding: 5px 14px;
    border-radius: 4px;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    box-shadow: 0px 0px 6px rgba(0, 0, 0, .7);
    -webkit-box-shadow: -0px 0px 6px rgba(0, 0, 0, .7);
    -moz-box-shadow: 0px 0px 6px rgba(0, 0, 0, .7);
}
.tooltip:before{
    content: ' ';
    display: block;
    position: absolute;
    left: -8px;
    top: 15px;
    width: 14px;
    height: 14px;
    border-color: #73a7f0;
    border-width: 1px;
    border-style: none none solid solid;
    background-color: #fff;
    box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    -webkit-box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    -moz-box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
}

데모

설명:

다른 예와 마찬가지로 테두리가있는 일반 div가 있습니다. 꼬리는 CSS의 간단한 조합입니다.

  • 나는 의사 선택기를 사용합니다 : before (: after도 잘 작동합니다)
  • 내용에 공백을 넣어 꼬리를 표시합니다.
  • 도구 설명 측면의 모서리를 고정하기 위해 상자를 45도에서 회전합니다.
  • 크기와 위치는 놀랍지 않습니다.
  • 원하는 양면에 테두리를 추가합니다.
  • 그리고 마지막으로 바깥 쪽 테두리에 그림자를 추가합니다.

@Hristo IE의 경우 어떻게해야하는지 잘 모르겠지만 몇 가지 기사를 참조하십시오. samuli.hakoniemi.net/… 그러나 그 모습은 어렵 습니다 ... "용기를 빕니다 !"
Yoann 2011

@DoubleYo : IE와 관련하여 ...이 IE와 호환되도록하려면 이미지와 조건부 스타일 시트를 사용하겠습니다. :)
Hristo

11

그림자없는 툴팁

바이올린 데모


Shadow와 함께 (WebKit에서 약간 이상해 보입니다 ... 내 생각에 최적화해야합니다) :

데모 1 , 데모 2


@Archimedix ... 멋지다 :) 이제 2 가지 방법을 알고 있습니다. 그림자 효과를 원하십니까?
Hristo

@Archimedix ... 멋져요! 내 업 보팅 권한을 되 찾으면 +1
Hristo

두 번째 솔루션과 똑같습니다. IE6에서 테두리 투명도를 수정했습니다. ie6에서 테두리를 표시하려면 화살표 래퍼에 대한 솔루션이 필요합니다.
easwee 2011

6

크로스 브라우저 접근 방식 :

이것은 IE7 +에서 작동합니다 (( filter: chroma(color=white);)를 사용하여 IE6에서도 작동 하지만 화살표 주위에 검은 색 테두리가 표시되지 않습니다).

IE6 수정 :

* html .arrow {
        border-bottom-color:white;
        border-left-color:white;
        border-right-color:white;
        filter: chroma(color=white);

}
* html .arrow i
        {
        border-bottom-color:white;
        border-left-color:white;
        border-right-color:white;
        filter: chroma(color=white);
        }

이렇게하면 IE6에 의해 렌더링되는보기 흉한 검은 색 투명도가 크로마 필터에서 지정한 색상이됩니다 (백그라운드에서 사라지도록 흰색을 적용했습니다).


CSS 3 접근 방식 :

CSS3 회전으로 수행 할 수 있지만 CSS3를 준수하지 않는 브라우저에서는 실패합니다.

.tooltip {
    position:relative;
    padding:10px;
    background:#ccc;
    border-bottom:1px solid #000;
}
.tooltip:before {
    content:"";
    display:block;
    width:10px;
    height:10px;
    position:absolute;
    bottom:-6px;
    border-left:1px solid #000;
    border-bottom:1px solid #000;
    background:#ccc;
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    transform: rotate(-45deg);
}
<div class="tooltip"> 
    Tooltip text that wants to be your friend.
</div>

트윗 담아 가기 css3 회전, 튜토리얼 링크 및 기타 리소스에 대한 추가 정보를 제공 할 수 있습니까?
Hristo

@hristo -이 IE에서 회전하는 DX 필터 -하지만 문제는 단지 4 개의 값을 취한다는 것이다 - msdn.microsoft.com/en-us/library/ms532918%28v=vs.85%29.aspx
easwee

@easwee ... IE, 특히 IE 6에 대해 너무 걱정하지 않습니다. 지적 해 주셔서 감사합니다. 모든 IE 버그는 조건부로 쉽게 극복 할 수 있습니다. :)
Hristo 2011

@hristo css3 회전은 IE9에서만 지원됩니다. 따라서 여전히 코딩 표준 인 ie7-8에주의해야합니다. 그러나 그것은 시작입니다.
easwee 2011

@easwee ... 굉장합니다. 이 작업을 수행하고 IE와 호환되도록 만들어야하는 경우 이미지와 조건부 스타일 시트를 사용합니다. :) css3 회전, 자습서 및 기타 리소스에 대한 링크에 대한 추가 정보를 제공 할 수 있습니까?
Hristo

3

CSS의 : before 및 : after 가상 요소를 사용할 수 있습니다. 예를 들어 : before는 삼각형을 삽입하고 : after는 직사각형을 삽입하는 데 사용할 수 있습니다. 이 두 가지를 조합하면 버블 도구 설명이 생성됩니다.

예 :

a[bubbletooltip]:before
{
    content: "";
    position: absolute;
    border-bottom: 21px solid #e0afe0;
    border-left: 21px solid transparent;
    border-right: 21px solid transparent;
    visibility: hidden;
    bottom: -20px;
    left: -12px;
}

a[bubbletooltip]:after
{
    position: absolute;
    content: attr(bubbletooltip);
    color: #FFF;
    font-weight:bold;
    bottom: -35px;
    left: -26px;
    white-space: nowrap;
    background: #e0afe0;
    padding: 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius:6px;
    -khtml-border-radius:6px;
    border-radius: 6px;
    visibility: hidden;
}

온라인 도구는 http://www.careerbless.com/services/css/csstooltipcreator.php 에서 사용할 수 있습니다 .


왜 사용자 정의 속성이 title아닌가?
BoltClock

1
aria-label툴팁에 더 적합한 사용자 지정 속성 이라고 말하고 싶습니다 . 을 사용 title하면 브라우저의 기본 툴팁 렌더링도 얻을 수 있습니다 (어쨌든 시력이있는 사용자를위한).
rink.attendant.6

감사. 나는 또한 삼각형 을 사용 span:before하고 span:after만들 려고 노력했고 webblogsforyou.com/… 에서 필요에 따라 조정했습니다 .
immayankmodi 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.