Як я можу створити “підказку” за допомогою чистого 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;
}


У яких браузерах він повинен працювати?
тридцять пунктів

1
на даний момент мені насправді все одно :) Я просто хочу побачити, чи можливо це! реально, я б використовував зображення, але мене цікавить виклик
Христо

Це повинно бути здійсненним, якщо використовуються шаруваті елементи та ідеальне розташування пікселів для контуру. З тінню чи без?
Arc

@Archimedix ... цілком згоден, але чи можете ви це зробити?
Христо

1
Це так просто, але так дивовижно, хороша знахідка Христо!
Wesley Murch

Відповіді:


60

Ось приклад із box-shadow, всі браузери останньої версії повинні це підтримувати

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
Чудово! Я мав на увазі досить подібне рішення, але лінувався щось зробити після всього, що пояснив :) :)
BoltClock

@mdmullinax ... епічно! коли я отримаю свої привілеї з високим голосуванням, я дам вам +1
Христо

ого, чудово! Невелика помилка: тінь також видно трохи у верхній частині підказки
Iulius Curt

@iuliux ... цю помилку можна легко виправити за допомогою z-index :)
Христо

56

Ось пояснення, щоб відповісти на ваше перше запитання (фактичний CSS я залишу іншим, оскільки мені лінь - проголосуйте за їхні відповіді, які, на вашу думку, заслуговують на голоси!):

Це створює маленький ефект, схожий на стрілку / трикутник, "підказку". Це мене вражає! Мені справді цікаво знати, як це працює ?!

  1. При отрисуванні межі з різними кольорами країв, але однакового стилю (у вашому випадку solid), шов, що розділяє кожну пару сусідніх кутів, є діагональною лінією. Це дуже схоже на те , що схема тут вдає з groove, ridge, insetіoutset стилів кордонів.

    Зауважте, що, хоча всі браузери поводяться однаково і робили це стільки, скільки я пам’ятаю, ця поведінка не повністю визначена ні в специфікації CSS2.1, ні в модулі CSS Backgrounds and Borders. В останньому є розділ, що описує переходи кольорів і стилів у кутах , і, мабуть, з цього опису випливає, що для меж з нульовим радіусом кута рендеринг фактично є лінією, яка з’єднує кут краю заповнення з кутом край кордону (в результаті виходить лінія під кутом 45 градусів для меж з однаковою шириною), але специфікація все ще застерігає, що це може бути не завжди (тим більше, що вона навіть не враховує кордони з нульовим радіусом кута). 1

  2. За допомогою моделі вікна вмісту (оригінальна W3C) , область 20x40 створюється поза межами 20 пікселів, розміри вмісту визначаються як 0x0.

  3. Поділ квадрата діагональними лініями, що з’єднують його чотири кути, призводить до чотирьох прямокутних трикутників, прямі кути яких стикаються в середній точці квадрата (див. Нижче).

  4. Верхня, нижня та ліва межі білі, щоб відповідати тлу .tooltiptailконтейнера елемента, а права межа - відтінок синього, щоб відповідати кольору тла підказки:

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

Результат такий, із позначеними межами та доданими кордонами за допомогою мого надійного інструмента «Лінія»:

Переорієнтація хвоста підказки - це просто питання зміни кольору підказки. Наприклад, це дасть хвіст, прикріплений до нижньої частини кінчика:

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

jsFiddle попередній перегляд


1 Якщо ви прихильник дотримання стандартів, ви можете також вважати все це хакерством.


Чортів швидко
набирав

Ну, я чітко смокчу читання питань. Це навіть говорило "I'm not worried about the shadow yet".
тридцять крапок

1
@BoltClock ... коли я отримаю свої привілеї за підтримку, я дам вам +1
Христо

@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:

  • Я використовую псевдоселектор: до (: після теж прекрасно працює)
  • Я змушую вміст пробілом, щоб зробити хвіст видимим.
  • Я повертаю свою коробку на 45 градусів, щоб зафіксувати кут збоку підказки
  • Не дивно для розміру та розташування.
  • Я додаю рамку з двох сторін, які я хочу.
  • І нарешті, я додаю тіні до зовнішньої межі.

@Hristo Для IE, я насправді не знаю, як це зробити, але перегляньте статтю: samuli.hakoniemi.net/… Але це виглядає важко ... " Приємної мужності!"
Йоанн,

@DoubleYo: Що стосується IE ... якщо мені потрібно зробити цей IE сумісним, я просто скористаюся зображеннями та умовною таблицею стилів :)
Христо

11

Підказка без тіні

Демонстрація скрипки


З Shadow (виглядає трохи дивно в WebKit ... маю напевно оптимізувати):

Демо 1 , Демо 2


@Archimedix ... круто :) тепер я знаю 2 способи зробити це, ну 3, якщо рахувати за допомогою зображень. хочете піти на ефект тіні?
Христо

@Archimedix ... виглядає чудово! коли я отримаю свої привілеї з високим голосуванням, я дам вам +1
Христо

Приємно, як і моє друге рішення - мені також вдалося виправити частину прозорості меж в 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 css3 підтримується лише в IE9 - тому вам все одно потрібно подбати про ie7-8, які все ще є стандартом для кодування. Але це початок.
easwee

@easwee ... чудово. Якщо мені коли-небудь потрібно буде зробити це і зробити його сумісним з IE, я б використав зображення та умовний аркуш стилів :) Чи могли б ви надати трохи більше інформації про обертання css3, посилання на навчальні посібники та інші ресурси?
Христо

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.