純粋な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

レイヤー化された要素とアウトラインにピクセル単位の配置を使用している場合は、実行可能である必要があります。影の有無は?
アーク

@Archimedix ...完全に同意しますが、あなたはそれを行うことができますか?
フリスト

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
驚くばかり!私はかなり似た解決策を心に留めていましたが、私がやったことを説明した後、何かを作るのは
面倒

@mdmullinax ...エピック!私の投票権を取り戻したら、+ 1を差し上げます
Hristo

わあ、すごい!小さなバグ:シャドウもツールチップの上部に少し表示されます
Iulius Curt

@iuliux ...そのバグはz-indexで簡単に修正できます:)
Hristo

56

最初の質問に回答するための説明を以下に示します(実際のCSSは怠惰なので他の人に任せます。投票に値すると思う回答には賛成してください!):

これにより、小さな矢印/三角形のような効果、つまり「ツールチップテール」が作成されます。これは私の心を吹き飛ばします!私はこれがどのように機能するかを知ることに本当に興味がありますか?!

  1. さまざまなエッジの色で同じスタイルのボーダーをレンダリングするとき(あなたの場合、 solid)、隣接するコーナーの各ペアを分割するシームは対角線です。それは何に非常に似ていますここで図がで描くgrooveridgeinsetおよびoutset境界線のスタイル。

    すべてのブラウザーは同じように動作し、私が覚えている限りそうしましたが、この動作はCSS2.1仕様でもCSS背景および境界モジュールでも完全には定義されていないことに注意してください。後者には、コーナーでの色とスタイルの遷移を説明するセクションがあり、説明には、コーナー半径がゼロの境界の場合、レンダリングされる線は実際にはパディングエッジのコーナーとパッドのコーナーを結ぶ線であることを暗示しているようですボーダーエッジ(等幅ボーダーの場合は45度の角度の線が表示されます)でも、常にそうであるとは限らない可能性がある(特に、コーナー半径がゼロのボーダーは明示的に考慮されていないため)と警告されています。1

  2. コンテンツ(原W3C)ボックスモデルコンテンツ寸法は0x0のように定義された状態で、40×40領域は、20ピクセルの境界の外に作成されます。

  3. 四角を結ぶ対角線で正方形を分割すると、直角が正方形の中点で交わる4つの直角三角形になります(以下を参照)。

  4. 上部、下部、左のボーダーは.tooltiptail要素のコンテナーの背景に一致するように白であり、右のボーダーはツールチップの背景色に一致するように青の色合いです。

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

結果は次のとおりです。境界線がラベル付けされ、境界線の境界線が私の信頼できるラインツールを使用して追加されました。

ツールチップの尾の向きを変更するには、単にツールチップの色を切り替えます。たとえば、これにより、チップの下部に接続された尾が生成されます。

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

jsFiddleプレビュー


1 標準への準拠にこだわっている場合は、これをすべてハックと見なすこともできます。



さて、私は質問を読むのがはっきりと嫌いです。それも言った"I'm not worried about the shadow yet"
thirtydot 2011

1
@BoltClock ...私の投票権を取り戻したら、+ 1を差し上げます
Hristo

@BoltClock、動作はブラウザ間で一貫していますか?そして、w3cによると、この動作はどの程度標準的ですか?
Pacerier 2014年

@Pacerier:コーナーシームを対角線としてレンダリングする特定の動作は、どの仕様でも定義されていません。動作はブラウザ間で一貫しており、長い間変更されていません。私の答えでこれを明確にします。
BoltClock

19

このツールチップは1つの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度から回転させて、ツールチップの側面の角を固定します
  • サイズと配置に驚きはありません。
  • 必要な2辺に境界線を追加します。
  • そして最後に、外側の境界線に影を追加します。

@HristoのためにIE私は本当にやるのか分からないが、いくつかの記事を参照してください。samuli.hakoniemi.net/...「!ボンの勇気」しかしdificultなるようにその表情を...
Yoann

@DoubleYo:IEに関して...このIEを互換にする必要がある場合は、画像と条件付きスタイルシートを使用します:)
Hristo

11

影のないツールチップ

フィドルデモ


Shadowを使用すると(WebKitで少し奇妙に見えます...それを最適化する必要があると思います):

デモ1デモ2


@Archimedix ...かっこいい:)これを行う2つの方法がわかりました。影の効果に行きたいですか?
Hristo

@Archimedix ...素晴らしく見えます!私の投票権を取り戻したら、+ 1を差し上げます
Hristo

私の2番目のソリューションと同じように-IE6で境界線の透過性も修正できました-矢印のラッパーがie6で境界線を表示するためのソリューションが必要です。
easwee

6

クロスブラウザアプローチ:

これはIE7 +から機能します(IE6 filter: chroma(color=white);でも()を使用して機能しますが、矢印の周りに黒い境界線は表示されません)。

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>

@easwee ...かっこいい!!! css3ローテーション、チュートリアルへのリンク、およびその他のリソースに関する詳細情報を提供できますか?
フリスト

@hristo -がIEに回転するDXフィルタである-しかし、問題は、それが唯一の4つの値をとることである- msdn.microsoft.com/en-us/library/ms532918%28v=vs.85%29.aspx
easwee

@easwee ... IE、特にIE 6についてはあまり心配していません。指摘いただきありがとうございます。IEのバグは条件付きで簡単に解決できます:)
Hristo

@hristo css3ローテーションはIE9でのみサポートされているため、コード化の標準であるie7-8に引き続き注意する必要があります。しかし、それは始まりです。
easwee

@easwee ...すごい。これを実行してIE互換にする必要がある場合は、画像と条件付きスタイルシートを使用します:) css3ローテーション、チュートリアルへのリンク、およびその他のリソースに関する詳細情報を提供できますか?
Hristo 2011

3

CSSの:beforeおよび:after疑似要素を利用できます。FOrインスタンスでは、:beforeを使用して三角形を挿入し、:afterを使用して長方形を挿入できます。これら2つの組み合わせにより、バブルツールチップが作成されます

例:

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 2013年

ありがとう。またspan:beforespan:after三角形を使用して作成しようとし、webblogsforyou.com / から必要に応じて調整しました
immayankmodi 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.