Использование Share.js для добавления кнопок шаринга

Раздел: Библиотеки -> социальные виджеты

Обзор библиотеки Share.js для социальных сетей

Как добавить на сайт компактный набор кнопок для публикации страницы в социальных сетях?

Share.js - это лёгкая (около 2 КБ) JavaScript-библиотека, которая создаёт всплывающие окна для шаринга без перезагрузки страницы. Основной способ использования - подключение через CDN и вызов метода Share() с настройками.

// Подключение через CDN в <head>
<script src="https://cdn.jsdelivr.net/npm/share.js@2/dist/js/share.min.js"></script>

// Инициализация
<div id="share"></div>
<script>
  new Share("#share", {
    networks: ['facebook', 'vkontakte', 'twitter', 'telegram'],
    url: window.location.href,
    title: document.title
  });
</script>

Share js (share.js библиотека для социальных сетей)

После этого внутри элемента #share появляются иконки с атрибутами data-share. Библиотека сама назначает обработчики кликов. Важно: для работы требуется, чтобы страница была открыта через HTTP/HTTPS (не file://).

Проблема: кнопки не отображаются. Решение: убедиться, что скрипт загружен до вызова Share() или обернуть вызов в DOMContentLoaded. Также проверить, что идентификатор элемента корректен.

Как настроить отображение только определённых социальных сетей?

Массив networks принимает идентификаторы: facebook, vkontakte, twitter (теперь X), telegram, whatsapp, odnoklassniki, pinterest, linkedin, reddit, tumblr, email, copy.

new Share("#share", {
  networks: ['telegram', 'vkontakte', 'copy'],
  url: 'https://example.com'
});

Иконки появятся в порядке перечисления. Случай использования: сайт ориентирован на русскоязычную аудиторию, достаточно VK, Telegram и копирования ссылки.

Ошибка: не работает копирование в буфер обмена. Решение: кнопка copy использует API буфера обмена, который требует безопасного контекста (HTTPS) и не сработает в iframe. Для fallback можно добавить вручную.

Как изменить текст всплывающего окна или передать собственные параметры?

Параметры title, description, image (для Pinterest) и hashtags (Twitter) настраиваются отдельно.

new Share("#share", {
  networks: ['pinterest', 'twitter'],
  url: 'https://example.com/page',
  title: 'Заголовок страницы',
  description: 'Краткое описание',
  image: 'https://example.com/image.jpg',
  hashtags: 'article'
});

Для Twitter параметр hashtags добавляет хештеги к твиту без решётки. Случай использования: интернет-магазин делится карточкой товара с картинкой.

Проблема: изображение не подхватывается Pinterest. Решение: Pinterest требует абсолютный URL картинки, доступный для индексации. Проверить, что ссылка не заблокирована robots.txt.

Как добавить обработчик после успешного шаринга?

Библиотека поддерживает событие share, которое срабатывает после открытия окна соцсети (но не после фактической публикации, так как это невозможно отследить из-за CORS).

var shareInstance = new Share("#share", {
  networks: ['facebook'],
  url: location.href
});

shareInstance.el.addEventListener('share', function(e) {
  console.log('Пользователь кликнул:', e.detail.network);
  // Например, отправить аналитику
  ga('send', 'event', 'Share', e.detail.network);
});

Случай использования: подсчёт статистики переходов по кнопкам шаринга через Google Analytics или Яндекс.Метрику.

Типичная ошибка: событие не срабатывает. Решение: событие называется share (строчные буквы). Не путать с click. Также убедиться, что shareInstance.el существует (библиотека создаёт его после инициализации).

Как избежать блокировки всплывающего окна браузером?

Браузеры блокируют window.open(), если вызов происходит не в ответ на прямое действие пользователя. Share.js использует обработчик клика по элементу с data-атрибутами, поэтому блокировки не происходит. Однако если кнопка добавлена динамически после загрузки страницы, может возникнуть проблема.

// Динамическое добавление кнопок (не рекомендуется)
var btn = document.createElement('div');
btn.setAttribute('data-share', 'facebook');
document.body.appendChild(btn);
// Необходимо повторно инициализировать Share.js? 
// Библиотека не отслеживает DOM-изменения автоматически.
// Решение: инициализировать только после того, как все элементы будут в DOM.
new Share("#dynamic-container", { networks: ['telegram'] });

Лучше задать статический контейнер и вложить в него кнопки через настройки. Случай использования: одностраничные приложения (SPA) - инициализировать Share.js после рендеринга компонента.

Проблема: в некоторых SPA (React, Vue) окно не открывается. Решение: использовать ref или nextTick, чтобы гарантировать, что элемент уже в DOM.

Дополнительные примеры использования Share.js

Пример 1. Кастомная стилизация кнопок с использованием CSS-переменных

Пример
<style>
  .share-custom {
    --share-bg: #f0f0f0;
    --share-color: #333;
    --share-hover-bg: #e0e0e0;
    display: flex;
    gap: 8px;
  }
  .share-custom .share-btn {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: var(--share-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background 0.2s;
  }
  .share-custom .share-btn:hover {
    background: var(--share-hover-bg);
  }
</style>
<div id="custom-share" class="share-custom"></div>
<script>
  new Share("#custom-share", {
    networks: ['facebook', 'twitter', 'telegram'],
    url: 'https://example.com'
  });
</script>
Результат: три круглые кнопки с иконками Facebook, Twitter и Telegram, серый фон, при наведении фон светлеет.

Пример 2. Интеграция с React (функциональный компонент)

Пример
import React, { useEffect, useRef } from 'react';
import 'share.js';

const ShareButtons = () => {
  const containerRef = useRef(null);

  useEffect(() => {
    if (containerRef.current) {
      new Share(containerRef.current, {
        networks: ['vkontakte', 'whatsapp', 'telegram', 'copy'],
        url: window.location.href,
        description: 'React приложение с кнопками шаринга'
      });
    }
  }, []);

  return <div ref={containerRef}></div>;
};

export default ShareButtons;
Результат: компонент рендерит пустой контейнер, после монтирования в него добавляются кнопки VK, WhatsApp, Telegram и копирования. Важно: импорт 'share.js' должен загружать CSS и JavaScript библиотеки через CDN (например, в index.html) или через модуль.

Пример 3. Передача произвольных параметров через data-атрибуты

Если требуется для каждой кнопки указать свой URL, можно использовать атрибуты data-share-url на элементах:

Пример
<div id="multiple-urls">
  <div data-share="facebook" data-share-url="https://example.com/facebook">Фейсбук</div>
  <div data-share="twitter" data-share-url="https://example.com/twitter">Твиттер</div>
</div>
<script>
  // Инициализация без параметра url, библиотека возьмёт из data-атрибутов
  new Share("#multiple-urls", {
    networks: [] // не указываем, чтобы не создавать стандартные кнопки
  });
  // Но библиотека ожидает, что уже есть элементы с data-share. 
  // Если они созданы вручную, то нужно просто вызвать new Share("#multiple-urls") без настроек.
</script>
Результат: клик на "Фейсбук" открывает окно шаринга для URL https://example.com/facebook, а на "Твиттер" - для https://example.com/twitter.

Пример 4. Использование метода Share.open для открытия окна программно

Пример
// Открыть окно шаринга VK с произвольными параметрами без видимой кнопки
Share.open('vkontakte', {
  url: 'https://example.com',
  title: 'Программный вызов',
  description: 'Открыто через Share.open'
});
Результат: сразу открывается попап VK с указанным URL, без необходимости нажимать кнопку. Полезно для собственных обработчиков, например, по таймеру.

Пример 5. Работа с событием 'share' и отмена действия по умолчанию

Пример
const share = new Share("#share", {
  networks: ['telegram'],
  url: window.location.href
});

share.el.addEventListener('share', function(e) {
  console.log('Начало шаринга на', e.detail.network);
  // e.preventDefault() не сработает, событие не отменяемое.
  // Для отмены нужно использовать свой обработчик клика
});

// Альтернатива: повесить свой обработчик на контейнер и отловить клик по data-share
share.el.addEventListener('click', function(e) {
  const target = e.target.closest('[data-share]');
  if (target) {
    const network = target.getAttribute('data-share');
    if (network === 'telegram') {
      e.stopImmediatePropagation(); // предотвращает стандартное поведение
      // свой код
      Share.open(network, { url: location.href, title: 'Кастом' });
    }
  }
});
Результат: при клике на Telegram сначала появляется сообщение в консоли, затем открывается окно шаринга. Если нужно заблокировать стандартное окно, используется stopImmediatePropagation на раннем этапе.

Share.js библиотека для социальных сетей - comments

En
Share js (javascript)