Bootstrap工具提示具有不同的样式

时间:2017-05-04 04:08:44

标签: javascript jquery html css twitter-bootstrap

我有工具提示显示使用数据切换,如,

 <i class="fa fa-fire fa-lg" data-toggle="tooltip" data-placement="bottom" title="Fire Place"></i>

我使用

设置了工具提示的样式
.tooltip > .tooltip-inner {

padding: 15px;
font-size: 120%;
background-color: #FFEB6C;
color: #374D40;}

我希望不同地方的工具提示看起来与背景颜色不同。即我想要多次查找工具提示。但我不知道如何为每个工具提示设置自定义工具提示样式。我不能为每个工具提示设置一个css类,因为没有这样的元素,我通过数据切换设置工具提示。

有什么方法可以让我的工作吗?感谢。

4 个答案:

答案 0 :(得分:4)

很简单,我创建了一个类来保存那些名为custom-tooltip的CSS样式:

/* Tooltip */

.custom-tooltip+.tooltip>.tooltip-inner {
  padding: 15px;
  font-size: 1.2em;
  background-color: #FFEB6C;
  color: #374D40;
}


/* Tooltip on bottom */

.custom-tooltip+.tooltip.bottom>.tooltip-arrow {
  border-bottom: 5px solid #FFEB6C;
}

&#13;
&#13;
$('i[data-toggle="tooltip"]').tooltip({
  animated: 'fade',
  placement: 'bottom'
});
&#13;
/* Tooltip */

.custom-tooltip+.tooltip>.tooltip-inner {
  padding: 15px;
  font-size: 1.2em;
  background-color: #FFEB6C;
  color: #374D40;
}


/* Tooltip on top */
.custom-tooltip+.tooltip.top>.tooltip-arrow {
  border-top: 5px solid #FFEB6C;
}


/* Tooltip on bottom */
.custom-tooltip+.tooltip.bottom>.tooltip-arrow {
  border-bottom: 5px solid #FFEB6C;
}


/* Tooltip on left */
.custom-tooltip+.tooltip.left>.tooltip-arrow {
  border-left: 5px solid #FFEB6C;
}


/* Tooltip on right */
.custom-tooltip+.tooltip.right>.tooltip-arrow {
  border-right: 5px solid #FFEB6C;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />



<i class="fa fa-fire fa-lg custom-tooltip" data-toggle="tooltip" data-placement="bottom" title="Fire Place"></i>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我已经为使用动态创建的元素的bootstrap 3工具提示样式准备了一个非常通用的解决方案。它也适用于生成工具提示而不是其元素的兄弟,但是在更高级别的DOM上,例如当使用自定义container选项时:

<body>
    <div>
    <button type="button" class="btn btn-default" data-container="body" title="Tooltip text">Hover over me</button>
    </div>
</body>

工具提示的<div>将作为<div>的兄弟而不是<button>生成...

<强>解决方案

让我们使Bootstrap工具提示对象的模板选项动态化:

$.fn.tooltip.Constructor.prototype.tip = function () {
    var template;
    var $e = this.$element;
    var o  = this.options;
    if (!this.$tip) {
        template = typeof o.template == 'function' ? o.template.call($e[0]) :  o.template;
        this.$tip = $(template);
        if (this.$tip.length != 1) {
            throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!');
        }
    }
    return this.$tip;
}

准备工具提示模板功能。它将从带有工具提示的元素中获取所有“tooltip- *”类,并附加到“tooltip-arrow”和“tooltip-inner”divs

tooltipTemplate = function () {
    var classList = ($(this).attr('class')||"").split(/\s+/);
    var filterTooltipPrefix = function(val){
        return val.startsWith('tooltip-');
    };
    var tooltipClasses = classList.filter(filterTooltipPrefix).join(' ');
    return '<div class="tooltip" role="tooltip"><div class="tooltip-arrow ' + tooltipClasses +'"></div><div class="tooltip-inner ' + tooltipClasses +'"></div></div>';
}

确保我们的功能适用于旧版浏览器:

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position){
        position = position || 0;
        return this.substr(position, searchString.length) === searchString;
    };
}

现在启用工具提示:

$('body').tooltip({ 
    selector: "[title]", 
    html: true,
    template: tooltipTemplate
});

示例:

HTML

<h1>Test tooltip styling</h1>
<div><span title="Long-long-long tooltip doesn't fit the single line">Hover over me 1</span></div>
<div><span class="tooltip-left" data-container="body" title="Example (left aligned):<br>Tooltip doesn't fit the single line, and is not a sibling">Hover over me 2</span></div>
<div><span class="tooltip-large tooltip-left" title="Example (left aligned):<br>This long text we want to have in the single line">Hover over me 3</span></div>

CSS

.tooltip-inner.tooltip-large {
    max-width: 300px;
}

.tooltip-inner.tooltip-left {
    text-align: left;
}

以下是工作演示:https://www.bootply.com/Mz48qBWXFu

注意我无法在使用Bootstrap 4的jsfiddle上运行此代码。它会抛出一个错误: TOOLTIP: Option "template" provided type "function" but expected type "string"显然有必要进行一些额外的调整。

<强>更新

以上所有内容在2个地方都有点矫枉过正:

不是在元素的class属性中发布工具提示样式类,而是使用data-属性。这将简化tooltipTemplate函数并删除startsWith代码垫片:

tooltipTemplate = function () {
    var tooltipClasses = $(this).data('tooltip-custom-classes');
    return '<div class="tooltip" role="tooltip"><div class="tooltip-arrow ' + tooltipClasses +'"></div><div class="tooltip-inner ' + tooltipClasses +'"></div></div>';
}

更重要的是,我们根本不需要修改工具提示模板。 我们应该回调inserted.bs.tooltip事件。这会简化一切(感谢Oleg的回答https://stackoverflow.com/a/42994192/9921853):

Bootstrap 3:

$(document).on('inserted.bs.tooltip', function(e) {
    var tooltip = $(e.target).data('bs.tooltip');
    tooltip.$tip.addClass($(e.target).data('tooltip-custom-class'));
});

Bootstrap 4:

$(document).on('inserted.bs.tooltip', function(e) {
    var tooltip = $(e.target).data('bs.tooltip');
    $(tooltip.tip).addClass($(e.target).data('tooltip-custom-class'));
});

以下是整个例子:
for Bootstrap 3
for Bootstrap 4

答案 2 :(得分:0)

试试这个

<i id="my-tooltip-1" class="fa fa-fire fa-lg" data-toggle="tooltip" data-placement="bottom" title="Fire Place"></i>

<style>
#my-tooltip-1 + .tooltip > .tooltip-inner {
        padding: 15px;
        font-size: 120%;
        background-color: #FFEB6C;
        color: #374D40;

        /* do something */
}
#my-tooltip-1 + .tooltip > .tooltip-arrow {
        background-color: #FFEB6C;

        /* do something */
}
</style>

答案 3 :(得分:0)

我也一直在搜索(广泛)以 Bootsrap 4 中的将不同样式应用于选择性工具提示的答案,并说我 沮丧 是一种轻描淡写的说法。

很多线程只是解决了全局.tooltip-inner样式的问题或使用脚本来完成此任务,甚至Bootstrap可能也应该提供了一种更简单的方法。

无论如何,这是我个人的情况和解决方法。

对于页面上出现的各种工具提示,我通常会坚持使用基本的Bootstrap工具提示选项(我认为这已经可以使用,否则请参见下面的更新),但是在Navbar上,我有一个键盘快捷键Favicon我想样式的锚标签。我完成此操作的方法是将其包裹在一个跨度标签中(或乔治所说的“数据容器”)。

<link href='https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css' rel='stylesheet'/>
<link href='https://use.fontawesome.com/releases/v5.6.3/css/all.css' rel='stylesheet'/>

<script src='https://code.jquery.com/jquery-3.3.1.slim.min.js'/>
<script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js'/>
<script src='https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js'/>

<nav>
...
<span class="tt_kb">
<a class="nav-item nav-link px-2" href="#" data-toggle="tooltip"  placement="auto"  data-html="true" container="body" trigger="hover" data-container=".tt_kb" data-boundary="window" title="Keyboard Shortcuts ... blah blah blah"><i class="far fa-keyboard"></i></a>
</span>
...
</nav>

<style>
.tt_kb .tooltip .tooltip-inner {
    background-color: #3266FF;
    text-align: left;
    width: 200px;
    position: relative;
    right: 50px;
}
</style>

对我来说奇怪的是, 出于某种原因 ,[ position =“ auto” ] didn'正常工作 (很好),因为我在导航栏的右上角有tt_kb Favicon,工具提示的一半消失在了我的窗口之外,因此我 添加 [ position:relative right:50px ]即可解决此问题。总体而言,这对我来说相当不错,我想您可以稍加调整就可以使它在您的情况下起作用。

希望获得帮助)


学分:想法来自线程stackoverflow/questions/re-color-tooltip-in-bootstrap-4上的 George 的“ 为每个工具提示使用自定义样式”,我很遗憾由于我是新来的,没有声誉,甚至没有标记为评论有用(


更新

对于那些无法使用常规Bootstrap / Popper工具提示的用户,您可能需要在代码中添加以下脚本和常规样式。

    <script>
      $(document).ready(function(){
        $('[data-toggle="tooltip"]').tooltip();
      });

      $('[data-toggle="tooltip"]').each(function(){
        var options = {
          html: true
        };

        if ($(this)[0].hasAttribute('data-type')) {
            options['template'] =
              '&#60;div class="tooltip ' + $(this).attr('data-type') + '" role="tooltip"&#62;' +
              ' &#60;div class="tooltip-arrow"&#62;&#60;/div&#62;' +
              ' &#60;div class="tooltip-inner"&#62;&#60;/div&#62;' +
              '&#60;/div&#62;';
        }

        $(this).tooltip(options);
    });
    </script>

</style>
  .tooltip.primary .tooltip-inner          { background-color:    #31b0d5; }
  .tooltip.primary.top > .tooltip-arrow    { border-top-color:    #337ab7; }
  .tooltip.primary.right > .tooltip-arrow  { border-right-color:  #337ab7; }
  .tooltip.primary.bottom > .tooltip-arrow { border-bottom-color: #337ab7; }
  .tooltip.primary.left > .tooltip-arrow   { border-left-color:   #337ab7; }

  .tooltip.info .tooltip-inner          { background-color:    #31b0d5; }
  .tooltip.info.top > .tooltip-arrow    { border-top-color:    #31b0d5; }
  .tooltip.info.right > .tooltip-arrow  { border-right-color:  #31b0d5; }
  .tooltip.info.bottom > .tooltip-arrow { border-bottom-color: #31b0d5; }
  .tooltip.info.left > .tooltip-arrow   { border-left-color:   #31b0d5; }

  .tooltip.success .tooltip-inner          { background-color:    #449d44; }
  .tooltip.success.top > .tooltip-arrow    { border-top-color:    #449d44; }
  .tooltip.success.right > .tooltip-arrow  { border-right-color:  #449d44; }
  .tooltip.success.bottom > .tooltip-arrow { border-bottom-color: #449d44; }
  .tooltip.success.left > .tooltip-arrow   { border-left-color:   #449d44; }

  .tooltip.warning .tooltip-inner          { background-color:    #ec971f; }
  .tooltip.warning.top > .tooltip-arrow    { border-top-color:    #ec971f; }
  .tooltip.warning.right > .tooltip-arrow  { border-right-color:  #ec971f; }
  .tooltip.warning.bottom > .tooltip-arrow { border-bottom-color: #ec971f; }
  .tooltip.warning.left > .tooltip-arrow   { border-left-color:   #ec971f; }

  .tooltip.danger .tooltip-inner          { background-color:    #d9534f; }
  .tooltip.danger.top > .tooltip-arrow    { border-top-color:    #d9534f; }
  .tooltip.danger.right > .tooltip-arrow  { border-right-color:  #d9534f; }
  .tooltip.danger.bottom > .tooltip-arrow { border-bottom-color: #d9534f; }
  .tooltip.danger.left > .tooltip-arrow   { border-left-color:   #d9534f; }
</style>

更新

添加了可以正常使用的JSFiddle Demo

NB 出于某种原因,导航栏将无法在演示中正确对齐,除非您将其缩放为 110 %或 125 %!