forked from leongersen/noUiSlider
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add example for merging overlapping tooltips (leongersen#1032)
Co-Authored-By: Ömür Yıldırım <[email protected]>
- Loading branch information
1 parent
a3c2b42
commit 3792a7b
Showing
7 changed files
with
128 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<?php sect('merging-tooltips'); ?> | ||
<h1>Merging overlapping tooltips</h1> | ||
|
||
<section> | ||
|
||
<div class="view"> | ||
<p><a href="https://github.com/leongersen/noUiSlider/issues/1032">Issue #1032</a> asks to merge overlapping tooltips. As this feature is outside the scope of the tooltips-feature in noUiSlider, this example can be used to implement this feature using the event system.</p> | ||
|
||
<div class="example"> | ||
<div id="merging-tooltips"></div> | ||
<?php run('merging-tooltips'); ?> | ||
<?php run('merging-tooltips-slider'); ?> | ||
</div> | ||
</div> | ||
|
||
<div class="side"> | ||
<div class="viewer-header">Initializing the slider</div> | ||
|
||
<div class="viewer-content"> | ||
<?php code('merging-tooltips-slider'); ?> | ||
</div> | ||
|
||
<div class="viewer-header">Merging overlapping tooltips</div> | ||
|
||
<div class="viewer-content"> | ||
<?php code('merging-tooltips'); ?> | ||
</div> | ||
</div> | ||
</section> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
var mergingTooltipSlider = document.getElementById('merging-tooltips'); | ||
|
||
noUiSlider.create(mergingTooltipSlider, { | ||
start: [20, 32, 50, 70, 80, 90], | ||
connect: true, | ||
tooltips: [false, true, true, true, true, true], | ||
range: { | ||
'min': 0, | ||
'max': 100 | ||
} | ||
}); | ||
|
||
mergeTooltips(mergingTooltipSlider, 15, ' - '); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/** | ||
* @param slider HtmlElement with an initialized slider | ||
* @param threshold Minimum proximity (in percentages) to merge tooltips | ||
* @param separator String joining tooltips | ||
*/ | ||
function mergeTooltips(slider, threshold, separator) { | ||
|
||
var textIsRtl = getComputedStyle(slider).direction === 'rtl'; | ||
var isRtl = slider.noUiSlider.options.direction === 'rtl'; | ||
var isVertical = slider.noUiSlider.options.orientation === 'vertical'; | ||
var tooltips = slider.noUiSlider.getTooltips(); | ||
var origins = slider.noUiSlider.getOrigins(); | ||
|
||
// Move tooltips into the origin element. The default stylesheet handles this. | ||
tooltips.forEach(function (tooltip, index) { | ||
if (tooltip) { | ||
origins[index].appendChild(tooltip); | ||
} | ||
}); | ||
|
||
slider.noUiSlider.on('update', function (values, handle, unencoded, tap, positions) { | ||
|
||
var pools = [[]]; | ||
var poolPositions = [[]]; | ||
var poolValues = [[]]; | ||
var atPool = 0; | ||
|
||
// Assign the first tooltip to the first pool, if the tooltip is configured | ||
if (tooltips[0]) { | ||
pools[0][0] = 0; | ||
poolPositions[0][0] = positions[0]; | ||
poolValues[0][0] = values[0]; | ||
} | ||
|
||
for (var i = 1; i < positions.length; i++) { | ||
if (!tooltips[i] || (positions[i] - positions[i - 1]) > threshold) { | ||
atPool++; | ||
pools[atPool] = []; | ||
poolValues[atPool] = []; | ||
poolPositions[atPool] = []; | ||
} | ||
|
||
if (tooltips[i]) { | ||
pools[atPool].push(i); | ||
poolValues[atPool].push(values[i]); | ||
poolPositions[atPool].push(positions[i]); | ||
} | ||
} | ||
|
||
pools.forEach(function (pool, poolIndex) { | ||
var handlesInPool = pool.length; | ||
|
||
for (var j = 0; j < handlesInPool; j++) { | ||
var handleNumber = pool[j]; | ||
|
||
if (j === handlesInPool - 1) { | ||
var offset = 0; | ||
|
||
poolPositions[poolIndex].forEach(function (value) { | ||
offset += 1000 - 10 * value; | ||
}); | ||
|
||
var direction = isVertical ? 'bottom' : 'right'; | ||
var last = isRtl ? 0 : handlesInPool - 1; | ||
var lastOffset = 1000 - 10 * poolPositions[poolIndex][last]; | ||
offset = (textIsRtl && !isVertical ? 100 : 0) + (offset / handlesInPool) - lastOffset; | ||
|
||
// Center this tooltip over the affected handles | ||
tooltips[handleNumber].innerHTML = poolValues[poolIndex].join(separator); | ||
tooltips[handleNumber].style.display = 'block'; | ||
tooltips[handleNumber].style[direction] = offset + '%'; | ||
} else { | ||
// Hide this tooltip | ||
tooltips[handleNumber].style.display = 'none'; | ||
} | ||
} | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters