tooltip.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <link href="../../../dist/css/bootstrap.min.css" rel="stylesheet">
  7. <title>Tooltip</title>
  8. <style>
  9. #target {
  10. border: 1px solid;
  11. width: 100px;
  12. height: 50px;
  13. margin-left: 50px;
  14. transform: rotate(270deg);
  15. margin-top: 100px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="container">
  21. <h1>Tooltip <small>Bootstrap Visual Test</small></h1>
  22. <p class="text-body-secondary">Tight pants next level keffiyeh <a href="#" data-bs-toggle="tooltip" title="Default tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" data-bs-toggle="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" data-bs-toggle="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" data-bs-toggle="tooltip" title="The last tip!">freegan cred</a> raw denim single-origin coffee viral.</p>
  23. <hr>
  24. <div class="row">
  25. <p>
  26. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="auto" title="Tooltip on auto">
  27. Tooltip on auto
  28. </button>
  29. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" title="Tooltip on top">
  30. Tooltip on top
  31. </button>
  32. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="right" title="Tooltip on right">
  33. Tooltip on end
  34. </button>
  35. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tooltip on bottom">
  36. Tooltip on bottom
  37. </button>
  38. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left" title="Tooltip on left">
  39. Tooltip on start
  40. </button>
  41. </p>
  42. </div>
  43. <div class="row">
  44. <p>
  45. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left" title="Tooltip with container (selector)" data-bs-container="#customContainer">
  46. Tooltip with container (selector)
  47. </button>
  48. <button id="tooltipElement" type="button" class="btn btn-secondary" data-bs-placement="left" title="Tooltip with container (element)">
  49. Tooltip with container (element)
  50. </button>
  51. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
  52. Tooltip with HTML
  53. </button>
  54. <button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left" title="Tooltip with XSS" data-bs-container="<img src=1 onerror=alert(123)>">
  55. Tooltip with XSS
  56. </button>
  57. </p>
  58. </div>
  59. <div class="row">
  60. <div class="col-sm-3">
  61. <div id="target" title="Test tooltip on transformed element"></div>
  62. </div>
  63. <div id="shadow" class="pt-5"></div>
  64. </div>
  65. <div id="customContainer"></div>
  66. <div class="row mt-4 border-top">
  67. <hr>
  68. <div class="h4">Test Selector triggered tooltips</div>
  69. <div id="wrapperTriggeredBySelector">
  70. <div class="py-2 selectorButtonsBlock">
  71. <button type="button" class="btn btn-secondary bs-dynamic-tooltip" title="random title">Using title</button>
  72. <button type="button" class="btn btn-secondary bs-dynamic-tooltip" data-bs-title="random title">Using bs-title</button>
  73. </div>
  74. </div>
  75. <div class="mt-3">
  76. <button type="button" class="btn btn-primary" onclick="duplicateButtons()">Duplicate above two buttons</button>
  77. </div>
  78. </div>
  79. </div>
  80. <script src="../../../dist/js/bootstrap.bundle.js"></script>
  81. <script>
  82. /* global bootstrap: false */
  83. if (typeof document.body.attachShadow === 'function') {
  84. const shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' })
  85. shadowRoot.innerHTML =
  86. '<button id="firstShadowTooltip" type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" title="Tooltip on top in a shadow dom">' +
  87. ' Tooltip on top in a shadow dom' +
  88. '</button>' +
  89. '<button id="secondShadowTooltip" type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" title="Tooltip on top in a shadow dom with container option">' +
  90. ' Tooltip on top in a shadow dom' +
  91. '</button>'
  92. new bootstrap.Tooltip(shadowRoot.firstChild)
  93. new bootstrap.Tooltip(shadowRoot.getElementById('secondShadowTooltip'), {
  94. container: shadowRoot
  95. })
  96. }
  97. new bootstrap.Tooltip('#tooltipElement', {
  98. container: '#customContainer'
  99. })
  100. const targetTooltip = new bootstrap.Tooltip('#target', {
  101. placement: 'top',
  102. trigger: 'manual'
  103. })
  104. targetTooltip.show()
  105. document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(tooltipEl => new bootstrap.Tooltip(tooltipEl))
  106. </script>
  107. <script>
  108. /* global bootstrap: false */
  109. new bootstrap.Tooltip('#wrapperTriggeredBySelector', {
  110. animation: false,
  111. selector: '.bs-dynamic-tooltip'
  112. })
  113. /* eslint-disable no-unused-vars */
  114. function duplicateButtons() {
  115. const buttonsBlock = document.querySelector('.selectorButtonsBlock')// get first
  116. const buttonsBlockClone = buttonsBlock.cloneNode(true)
  117. buttonsBlockClone.innerHTML += new Date().toLocaleString()
  118. document.querySelector('#wrapperTriggeredBySelector').append(buttonsBlockClone)
  119. }
  120. /* eslint-enable no-unused-vars */
  121. </script>
  122. </body>
  123. </html>