Eine Website für Nutzer freigeben zu lassen, ist ein gängiges Muster für Webanwendungen, das auf vielen Nachrichtenseiten, Blogs oder Shopping-Websites zu finden ist. Da das Verlinken eine der Superkräfte des Webs ist, besteht die Hoffnung, Traffic von Nutzern zu erhalten, die den freigegebenen Link auf Social-Media-Websites sehen oder ihn per Chatnachricht oder sogar per E-Mail erhalten.
Die moderne Methode
Web Share API verwenden
Mit der Web Share API können Nutzer Daten wie
die URL der Seite, auf der sie sich befinden, zusammen mit einem Titel und einem beschreibenden Text freigeben.
Die Methode navigator.share() der Web Share API ruft den nativen Freigabemechanismus des Geräts auf. Sie gibt ein Promise zurück und verwendet ein einzelnes Argument mit den freizugebenden Daten. Folgende Werte sind möglich:
url: Ein String, der die freizugebende URL darstellt.text: Ein String, der den freizugebenden Text darstellt.title: Ein String, der einen freizugebenden Titel darstellt. Wird möglicherweise vom Browser ignoriert.
Die klassische Methode
Freigabe-Intent einer Social-Media-Website verwenden
Noch nicht alle Browser unterstützen die Web Share API. Eine Alternative ist daher die Integration mit den beliebtesten Social-Media-Websites Ihrer Zielgruppe. Ein beliebtes Beispiel ist Twitter, dessen Web-Intent-URL das Freigeben von Text und einer URL ermöglicht. Die Methode besteht in der Regel darin, eine URL zu erstellen und sie in einem Browser zu öffnen.
UI-Überlegungen
Es ist eine nette Geste, das etablierte Freigabesymbol der Plattform gemäß den UI-Richtlinien der Betriebssystemanbieter zu verwenden.
- Windows:
- Apple:
- Android und andere Betriebssysteme:
Progressive Enhancement
Das folgende Snippet verwendet die Web Share API, wenn sie unterstützt wird, und greift dann auf die Web-Intent-URL von Twitter zurück.
// DOM references
const button = document.querySelector('button');
const icon = button.querySelector('.icon');
const canonical = document.querySelector('link[rel="canonical"]');
// Find out if the user is on a device made by Apple.
const IS_MAC = /Mac|iPhone/.test(navigator.platform);
// Find out if the user is on a Windows device.
const IS_WINDOWS = /Win/.test(navigator.platform);
// For Apple devices or Windows, use the platform-specific share icon.
icon.classList.add(`share${IS_MAC? 'mac' : (IS_WINDOWS? 'windows' : '')}`);
button.addEventListener('click', async () => {
// Title and text are identical, since the title may actually be ignored.
const title = document.title;
const text = document.title;
// Use the canonical URL, if it exists, else, the current location.
const url = canonical?.href || location.href;
// Feature detection to see if the Web Share API is supported.
if ('share' in navigator) {
try {
await navigator.share({
url,
text,
title,
});
return;
} catch (err) {
// If the user cancels, an `AbortError` is thrown.
if (err.name !== "AbortError") {
console.error(err.name, err.message);
}
}
}
// Fallback to use Twitter's Web Intent URL.
// (https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent)
const shareURL = new URL('https://twitter.com/intent/tweet');
const params = new URLSearchParams();
params.append('text', text);
params.append('url', url);
shareURL.search = params;
window.open(shareURL, '_blank', 'popup,noreferrer,noopener');
});
Weitere Informationen
Demo
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>How to let the user share the website they are on</title>
<link rel="stylesheet" href="style.css" />
<!-- TODO: Devsite - Removed inline handlers -->
<!-- <script src="script.js" defer></script> -->
</head>
<body>
<h1>How to let the user share the website they are on</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at libero
eget ante congue molestie. Integer varius enim leo. Duis est nisi,
ullamcorper et posuere eu, mattis sed lorem. Lorem ipsum dolor sit amet,
consectetur adipiscing elit. In at suscipit erat, et sollicitudin lorem.
</p>
<img src="https://placekitten.com/400/300" width=400 height=300>
<p>
In euismod ornare scelerisque. Nunc imperdiet augue ac porttitor
porttitor. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Curabitur eget pretium elit, et
interdum quam.
</p>
<hr />
<button type="button"><span class="icon"></span>Share</button>
</body>
</html>CSS
:root {
color-scheme: dark light;
}
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
body {
margin: 1rem;
font-family: system-ui, sans-serif;
}
img,
video {
height: auto;
max-width: 100%;
}
button {
display: flex;
}
button .icon {
display: inline-block;
width: 1em;
height: 1em;
background-size: 1em;
}
@media (prefers-color-scheme: dark) {
button .icon {
filter: invert();
}
}
.share {
background-image: url('share.svg');
}
.sharemac {
background-image: url('sharemac.svg');
}
JS
// DOM references
const button = document.querySelector('button');
const icon = button.querySelector('.icon');
const canonical = document.querySelector('link[rel="canonical"]');
// Find out if the user is on a device made by Apple.
const IS_MAC = /Mac|iPhone/.test(navigator.platform);
// Find out if the user is on a Windows device.
const IS_WINDOWS = /Win/.test(navigator.platform);
// For Apple devices or Windows, use the platform-specific share icon.
icon.classList.add(`share${IS_MAC? 'mac' : (IS_WINDOWS? 'windows' : '')}`);
button.addEventListener('click', async () => {
// Title and text are identical, since the title may actually be ignored.
const title = document.title;
const text = document.title;
// Use the canonical URL, if it exists, else, the current location.
const url = canonical?.href || location.href;
// Feature detection to see if the Web Share API is supported.
if ('share' in navigator) {
try {
await navigator.share({
url,
text,
title,
});
return;
} catch (err) {
// If the user cancels, an `AbortError` is thrown.
if (err.name !== "AbortError") {
console.error(err.name, err.message);
}
}
}
// Fallback to use Twitter's Web Intent URL.
// (https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent)
const shareURL = new URL('https://twitter.com/intent/tweet');
const params = new URLSearchParams();
params.append('text', text);
params.append('url', url);
shareURL.search = params;
window.open(shareURL, '_blank', 'popup,noreferrer,noopener');
});