--- title: Misc path: /v6/misc/ index: 15 --- import EventDelegation from '../../components/examples/EventDelegation'; import TriggerTarget from '../../components/examples/TriggerTarget'; import ContextMenu from '../../components/examples/ContextMenu'; ### Context menu ```js const rightClickableArea = document.querySelector('#container'); const instance = tippy(rightClickableArea, { content: 'Context menu', placement: 'right-start', trigger: 'manual', interactive: true, arrow: false, offset: [0, 0], }); rightClickableArea.addEventListener('contextmenu', (event) => { event.preventDefault(); instance.setProps({ getReferenceClientRect: () => ({ width: 0, height: 0, top: event.clientY, bottom: event.clientY, left: event.clientX, right: event.clientX, }), }); instance.show(); }); ``` ### Different trigger target You may want the tippy to appear at a different location from its trigger (event listeners) target. For example: For this, you can utilize the `triggerTarget` prop: ```js const innerOrangeSpanElement = document.querySelector('span'); const outerDivElement = document.querySelector('div'); tippy(innerOrangeSpanElement, { triggerTarget: outerDivElement, }); ``` ### Touch devices Tippy provides first-class support for touch devices. Tooltips can be tricky to get right on touch devices because of the nature of touch input. #### Buttons A tooltip on a button is generally used to convey information before the user decides to click on it. On touch devices, this isn't possible because a tap is required to show the tooltip, which will fire a click event. On iOS, a tap will show the tooltip but click events won't fire until a second tap. This allows the user to see the tooltip before deciding to click the button. On Android, clicking the button will show the tooltip and also fire a click event. Depending on your use case, one of these will be preferred, so user agent checking may be needed. If neither behavior is preferred, consider using the `touchHold` prop which allows the user to see the tooltip while pressing and holding the button, but won't fire a click event unless the click appears to be intentional. ##### Setup ```js const button = document.querySelector('button'); const isIOS = /iPhone|iPad|iPod/.test(navigator.platform); ``` ##### A: Make iOS behave like Android (single tap to click) ```js button.addEventListener('click', () => { // Your logic }); tippy(button, { onShow() { if (isIOS) { button.click(); } }, }); ``` ##### B: Make Android behave like iOS (double tap to click) Tippy has a useful static property `tippy.currentInput`. This is a mutable object whose properties change depending on the user's current input. Currently, it has a single property called `isTouch`, which is a boolean flag determining if the user is currently using touch input. This is a dynamic value because of hybrid devices which can use a mix of mouse and touch input. ```js function emulateIOS(listener) { let clicks = 0; return function () { clicks++; if (clicks === 2 || isIOS || !tippy.currentInput.isTouch) { clicks = 0; listener.apply(this, arguments); } }; } const instance = tippy(button); const onClick = emulateIOS(() => { // Your logic }); button.addEventListener('click', onClick); ``` #### Hold & long press ```js // Will only show the tippy while the user is pressing the screen (not a tap) tippy(button, { touch: 'hold', }); // Will only show the tippy on a "long press" hold tippy(button, { touch: ['hold', 500], // 500ms delay }); ```