23/10/2022
Når du udvikler webapplikationer specifikt til mobile enheder, især dem der kører på iOS som iPhone og iPad, kan du støde på en uventet udfordring: standardkontekstmenuen, der dukker op, når en bruger foretager et langt tryk. Dette kan være særligt frustrerende i applikationer, hvor et langt tryk er tiltænkt en anden funktion, såsom i spil eller interaktive elementer. Heldigvis findes der en enkel og effektiv løsning ved hjælp af CSS.

Forestil dig at bygge et avanceret webbaseret spil, hvor et langt tryk på en bestemt genstand skal udløse en unik handling. Hvis standard iOS-menuen, der tilbyder muligheder som "Kopiér", "Indsæt" eller "Gem billede", popper op i stedet, bryder det fuldstændig med den tilsigtede brugeroplevelse. Ligeledes kan uønsket tekstmarkering ved et utilsigtet langt tryk forstyrre brugerens interaktion med din applikation.
På mobile browsere, og især i Mobile Safari på Apple-enheder, er standardadfærden ved et langt tryk på et interaktivt element eller tekst at enten fremhæve teksten eller vise en kontekstmenu. Dette er en generel funktion designet til at give brugerne adgang til almindelige handlinger. Men i mange moderne webapplikationer, hvor brugergrænsefladen er finjusteret til specifikke interaktioner, kan denne standardadfærd være en betydelig hindring for en glat og intuitiv brugeroplevelse. Det er her, vi skal gribe ind.
Løsningen: CSS til Kontrol af Brugerinteraktioner
Heldigvis er det relativt nemt at deaktivere disse standardfunktioner ved hjælp af et par specifikke CSS-egenskaber. Disse egenskaber er primært rettet mod WebKit-baserede browsere, hvilket inkluderer Safari på iOS. Ved at anvende disse egenskaber globalt eller på specifikke elementer, kan du fuldstændig kontrollere, hvordan brugerne interagerer med dit indhold via lange tryk.
De Afgørende CSS-Egenskaber
De to mest effektive CSS-egenskaber til at opnå dette er:
-webkit-user-select: none;-webkit-touch-callout: none;
Lad os dykke ned i, hvad hver af disse gør:
-webkit-user-select: none;
Denne egenskab styrer, om brugeren kan vælge tekst eller andre elementer på en webside. Når den sættes til none, forhindrer den effektivt brugeren i at markere tekst. Dette betyder, at selvom brugeren holder fingeren nede på et stykke tekst, vil det ikke blive fremhævet, og der vil ikke blive igangsat en kopieringshandling. Dette er afgørende for at forhindre utilsigtet tekstmarkering, der kan følge med et langt tryk.
-webkit-touch-callout: none;
Denne egenskab er specifikt designet til at forhindre den standardkontekstmenu, der vises, når en bruger foretager et langt tryk på et element på mobile enheder. Ved at sætte den til none, sikrer du, at når en bruger holder fingeren nede på et element, vil denne menu simpelthen ikke dukke op. Dette giver dig fuld kontrol over, hvilke handlinger der kan udføres ved et langt tryk.
Praktisk Implementering: Et Komplet Eksempel
For at illustrere, hvordan disse CSS-egenskaber fungerer i praksis, lad os oprette en simpel HTML-side. Vi vil anvende disse egenskaber på hele dokumentet for at demonstrere den globale effekt, og derefter style et specifikt element for at vise, hvordan det ser ud på et enkelt interaktivt element.
HTML og CSS Kode
Forhindr Kontekstmenu ved Langt Tryk Forhindr Standard Kontekstmenu ved Langt Tryk
Prøv et langt tryk her! Hold fingeren nede på boksen ovenfor. Du vil bemærke, at der hverken dukker en kontekstmenu op, eller at teksten bliver markeret.
Forklaring af Koden
- Globale CSS-Egenskaber: Ved at anvende
-webkit-user-select: none;og-webkit-touch-callout: none;direkte påhtml-elementet, sikrer vi, at disse begrænsninger gælder for hele websiden. Dette er den mest effektive måde at implementere denne funktionalitet på, hvis du ønsker at forhindre disse handlinger overalt på dit site. - Styleret Element: Klassen
.interaktivt-elementbruges til at skabe en visuelt tiltalende boks, der fungerer som et eksempel. Når du interagerer med dette element på en iOS-enhed, vil du se, at den tilsigtede effekt (ingen menu, ingen markering) er aktiv. De tilføjede hover-effekter og styling gør elementet mere engagerende og demonstrerer, at standardadfærden er blevet overskrevet, uden at forhindre andre visuelle feedback-mekanismer.
Yderligere Overvejelser og Bedste Praksis
Mens disse CSS-egenskaber er meget effektive, er det vigtigt at overveje, hvordan de påvirker den generelle brugeroplevelse. Hvis du deaktiverer tekstmarkering og kontekstmenuer globalt, kan det forhindre brugere i at udføre legitime handlinger, som de forventer at kunne, såsom at kopiere vigtig information fra din side. Derfor kan det være en god idé kun at anvende disse egenskaber på specifikke elementer, hvor det er strengt nødvendigt, f.eks. i spil eller interaktive komponenter, hvor lange tryk har en defineret, ikke-standardiseret funktion.
Anvendelse på Specifikke Elementer
Hvis du kun vil deaktivere kontekstmenuen for et bestemt element, kan du anvende CSS-klasser direkte på det pågældende element i din HTML:
Bevæg dette objekt! Eller bedre, definer en klasse i din CSS:
.ingen-kontekstmenu { -webkit-user-select: none; -webkit-touch-callout: none; }Og anvend den på dit element:
Bevæg dette objekt! Alternativer og JavaScript
Selvom CSS-løsningen er den mest ligetil og anbefalede metode til at forhindre den standardkontekstmenu, kan der i mere komplekse scenarier være behov for JavaScript. Du kan bruge JavaScript til at lytte efter touchstart og touchend events samt contextmenu events og forhindre deres standardadfærd med event.preventDefault(). Dette giver en endnu større grad af kontrol, men medfører også øget kompleksitet.
Her er et simpelt JavaScript-eksempel:
document.addEventListener('contextmenu', function(e) { e.preventDefault(); }); document.getElementById('dit-element-id').addEventListener('touchstart', function(e) { // Yderligere logik kan tilføjes her });Det er dog vigtigt at bemærke, at CSS-løsningen generelt er mere performant og enklere for denne specifikke opgave.
Tabel: Sammenligning af Metoder
Her er en hurtig sammenligning af CSS-metoden versus JavaScript:
| Metode | Fordele | Ulemper | Bedst til |
|---|---|---|---|
CSS (-webkit-user-select, -webkit-touch-callout) | Enkel, høj performance, ingen JavaScript nødvendig | Primært effektive på WebKit/Safari; mindre kontrol over specifikke touch-events | Forhindre standardkontekstmenu og tekstmarkering overalt eller på specifikke elementer. |
JavaScript (event.preventDefault()) | Fuld kontrol over alle touch-events, kan bruges på tværs af browsere (med korrekt implementering) | Mere kompleks, potentiel performance-påvirkning, kræver kendskab til event-håndtering | Meget specifikke interaktioner, hvor CSS alene ikke er nok, eller hvor der kræves kompleks logik baseret på touch-events. |
Ofte Stillede Spørgsmål (FAQ)
- Virker disse CSS-egenskaber på Android?
-webkit-user-selectvirker bredt i mange browsere, herunder Chrome på Android, for at forhindre tekstmarkering.-webkit-touch-callouter dog primært en WebKit/Safari-specifik egenskab og har ikke samme effekt på Android. For Android kan du normalt stole påuser-select: none;for at forhindre markering, men kontekstmenuen kan stadig opføre sig anderledes. - Kan jeg kun forhindre det på billeder?
Ja, du kan anvende disse CSS-egenskaber på ethvert HTML-element, herunder<img>,<div>,<button>osv. Du skal blot målrette elementet med din CSS-selektor. - Er der en standard CSS-egenskab, der gør det samme?
Ja, standard CSS-egenskaben eruser-select: none;. Den er bredt understøttet, men-webkit-user-selecter stadig nødvendig for fuld kompatibilitet med ældre versioner af Safari og for at sikre den mest pålidelige adfærd på iOS.-webkit-touch-callouthar ingen direkte standardiseret ækvivalent, der specifikt forhindrer kontekstmenuen på samme måde. - Hvad hvis jeg vil have brugeren til at kunne vælge noget tekst, men ikke åbne menuen?
Dette er en mere kompleks situation. Du kan forsøge at bruge JavaScript til at lytte efterlongpressevents og kun forhindrecontextmenueventen, mens du tillader standard tekstmarkering. Dog kan det være svært at skelne præcist mellem et ønske om at markere tekst og et ønske om at åbne menuen for brugeren. Ofte er det bedst at vælge en klar interaktionsmodel.
Konklusion
At forhindre standardkontekstmenuen og tekstmarkering ved et langt tryk på mobile enheder, især iOS-enheder, er en vigtig overvejelse for mobilwebudviklere. Ved at anvende de kraftfulde CSS-egenskaber -webkit-user-select: none; og -webkit-touch-callout: none; kan du effektivt styre disse interaktioner og skabe en mere poleret og målrettet brugeroplevelse. Husk at anvende disse egenskaber med omhu og overvej, hvor de bedst tjener formålet med din applikation for at undgå at begrænse brugerens muligheder unødvendigt.
Hvis du vil læse andre artikler, der ligner Undgå uønskede menuer på din mobilweb, kan du besøge kategorien Teknologi.
