bootstrap «всплывающая подсказка» и «всплывающее окно» добавляют дополнительный размер в таблицу

82

Примечание.
В зависимости от вашей версии Bootstrap (до 3.3 или более ранней) вам может потребоваться другой ответ.
Обратите внимание на примечания.

Когда я активирую всплывающие подсказки (наведите указатель мыши на ячейку) или всплывающие окна в этом коде, размер таблицы увеличивается. Как мне этого избежать?

Здесь emptyRow - функция для генерации tr со 100

<html>
<head>
    <title></title>
    <script type="text/javascript" language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <link type="text/css" rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
    <script type="text/javascript" language="javascript" src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.1/bootstrap.min.js"></script>
    <style>    
    #matrix td {
        width: 10px;
        height: 10px;
        border: 1px solid gray; 
        padding: 0px; 
    }
    </style>
<script>
function emptyRow() {
        str = '<tr>'
        for (j = 0; j < 100; j++) {
            str += '<td rel="tooltip" data-original-title="text"></td>'
        }
        str += '</tr>'
        return str
    }
    $(document).ready(function () {
        $("#matrix tr:last").after(emptyRow())
        $("[rel=tooltip]").tooltip();
    });
    </script>
</head>
<body style="margin-top: 40px;">
<table id="matrix">
    <tr>
    </tr>
</table>
</body>
</html>

благодарю в совет!

мишка
источник
Какой именно дополнительный размер вы имеете в виду? js генерирует 100 ячеек в одной строке под предопределенной пустой строкой. Я создал скрипку
Девеллар
@Devellar, размер увеличивается при активации всплывающей подсказки (при наведении курсора на ячейку)
mishka
@MikhaillErofeev У меня такая же проблема, если вы решите ее, пожалуйста, скажите мне
Rnk Jangir
@RonakJangir, см. Ответ ниже
mishka
@MikhaillErofeev Я просто хочу добавить всплывающую подсказку на td, поэтому этот ответ для меня бесполезен. К тому решение представило в Twitter Bootstrap см github.com/twitter/bootstrap/issues/5980
Rnk Джангир

Ответы:

90

Примечание: решение для Bootstrap 3.0 ~ 3.2

Вам нужно создать элемент внутри tdи применить подсказку к нему, как это , потому что сам по себе подсказка является ДИВ, и когда он будет помещен после того,td элемента его расположения тормоза таблицы.

Эта проблема появилась в последней версии Bootstrap. Здесь продолжаются обсуждения исправлений на GitHub . Надеюсь, в следующей версии будут исправлены файлы.

Девеллар
источник
57
Из ссылки GitHub: начиная с версии 2.3.x, решение состоит в том, чтобы установить для параметра контейнера всплывающей подсказки / всплывающего окна значение body. Например: $ (...). Tooltip ({container: 'body'}); Или используя атрибут data- * в HTML: data-container = "body"
Доменик,
5
@Domenic Это должен быть ответ, а затем помечен как правильное решение. Просто работает.
Тимм
1
пожалуйста, добавьте это в качестве ответа, намного проще для будущих разработчиков
cmario
90

Примечание: решение для Bootstrap 3.3+

Простое решение

В .tooltip()звонке установите containerопцию body:

$(function () {
  $('[data-toggle="tooltip"]').tooltip({
    container : 'body'
  });
});

В качестве альтернативы вы можете сделать то же самое, используя data-containerатрибут:

<p data-toggle="tooltip" data-placement="left" data-container="body" title="hi">some text</p>

Почему это работает?

Это решает проблему, потому что по умолчанию всплывающая подсказка display: blockи элемент вставляется в то место, откуда он был вызван. Из-заdisplay: block в некоторых случаях он влияет на поток страницы, то есть толкает другие элементы вниз.

Если установить контейнер для элемента body, всплывающая подсказка добавляется к телу вместо того, откуда она была вызвана, поэтому она не влияет на другие элементы, потому что нет ничего, что можно было бы «подтолкнуть».

MrCode
источник
3
Благодаря! Работает отлично.
Эми Паттерсон,
Благодаря!! Параметр data-toggle = "tooltip" работал, но не параметр container: 'body' ..
Р. Пн,
Большое спасибо, это сэкономило мне часы :)
Viky293 01
1
Это не сработает, если ваша таблица находится в модальном режиме, поскольку всплывающая подсказка появляется где-то на странице (возможно, я до сих пор ее не нашел). Пусть покупатель будет бдителен. Принятый ответ все еще работает, просто оберните свой td-контент в div и примените к нему всплывающую подсказку.
Hippyjim
17

Примечание: решение для Bootstrap 3.3+

Если вы не хотите разбивать таблицу при применении всплывающей подсказки к <td>элементу, вы можете использовать следующий код:

    $(function () {
        $("body").tooltip({
            selector: '[data-toggle="tooltip"]',
            container: 'body'
        });
    })

Ваш html может выглядеть так:

<td data-toggle="tooltip" title="Your tooltip data">
    Table Cell Content
</td>

Это работает даже с динамически загружаемым контентом. Например, используется с таблицами данных

shock_gone_wild
источник
1
Спасибо! Я наконец-то могу использовать всплывающую подсказку с таблицами данных
себасира
9

Я хотел бы добавить немного точности к принятому ответу, я решил использовать формат ответа для читабельности.

Примечание: решение для Bootstrap 3.0 ~ 3.2

Прямо сейчас можно обернуть всплывающую подсказку в div , но потребуются некоторые изменения, если вы хотите, <td>чтобы всплывающая подсказка отображалась целиком (из-за Bootstrap CSS). Простой способ сделать это - перенести <td>заполнение в оболочку:

HTML

<table class="table table-hover table-bordered table-striped">
    <tr>
        <td>
            <div class="show-tooltip" title="Tooltip content">Cell content</div>
        </td>
    </tr>
</table>

JS (jQuery)

$('.show-tooltip').each(function(e) {
    var p = $(this).parent();
    if(p.is('td')) {
        /* if your tooltip is on a <td>, transfer <td>'s padding to wrapper */
        $(this).css('padding', p.css('padding'));
        p.css('padding', '0 0');
    }
    $(this).tooltip({
        toggle: 'toolip',
        placement: 'bottom'
    });
});
Zessx
источник
если вы хотите, чтобы весь <td> отображал всплывающую подсказку, просто примените всплывающую подсказку непосредственно к элементу td
shock_gone_wild
@shock_gone_wild Дело не в этом. Применение всплывающей подсказки к любому <td>элементу приведет к поломке всей таблицы, как указано в исходном вопросе, и в каждом ответе. Вот почему мы все решили добавить в него еще один элемент. Тем не менее, я не знаю о новинках Bootstrap 4, и эта ошибка, возможно, была исправлена.
zessx
нет, это не сломает таблицу, если вы добавите контейнер: 'body'. Смотрите мой ответ здесь. stackoverflow.com/a/34882401/3927116
shock_gone_wild
1
containerБыло введено в 2014 году, через 2 года после этого вопроса. Спасибо за ваш комментарий, я внесу несколько изменений, чтобы выделить эту опцию и уточнить, что эта ошибка не связана с последними версиями Bootstrap.
zessx
1
Я только что добавил это, потому что в ответе, получившем большое количество голосов, уже используется опция контейнера. И для будущих читателей эта информация может быть очень полезной;)
shock_gone_wild
1

Вы должны инициализировать всплывающую подсказку внутри функции с данными fnDrawCallback

"fnDrawCallback": function (data, type, full, meta) { $('[data-toggle="tooltip"]').tooltip({ placement: 'right', title: 'heyo', container: 'body', html: true }); },

И определите свой столбец, как показано ниже

 {
      targets: 2,
      'render': function (data, type, full, meta) {
       var htmlBuilder = "<b>" + data + "</b><hr/><p>Description: <br/>" + full["longDescrioption"] + "</p>";
      return "<a href='#' class='Name'>" + (data.length > 50 ? data.substr(0, 50) + '…' : data) + "</a>" +
      "<sup data-toggle='tooltip' data-original-title=" + htmlBuilder + ">"+
      "<i class='ic-open-in-new ic' style='font-size:12px;margintop:-3px;'></i></sup>";
    }
 },
Никундж Патель
источник
Проголосуйте за часть fnDrawCallback, и это единственное место, где инициализация всплывающей подсказки BS с форматированием HTML работает с таблицей данных с включенным разбиением на страницы.
Дрю
1

Если вы используете datatable для таблицы, тогда он будет использоваться полностью

$('#TableId').DataTable({
                "drawCallback": function (settings) {
                    debugger;
                    $('[data-toggle="tooltip"]').tooltip({
                        container: 'body'
                    });

                }
            });
Радждип Хавад
источник
0

Если вы используете директивы начальной загрузки для AngularJS, используйте атрибут tooltip-append-to-body.

<td ng-repeat="column in row.columns" uib-tooltip="{{ ctrl.viewModel.leanings.tooltip }}" tooltip-append-to-body="true"></td>
Хайдер Аббас
источник