У меня есть компонент для просмотра PDF файлов. Я добавил свойство <i>renderAnnotationLayer={true}</i> в <i>Page</i> и импортировал стили через <i>import 'react-pdf/dist/Page/AnnotationLayer.css';</i>, поскольку они, по моему мнению, необходимы для корректной работы. На <i>localhost</i> ссылки открываются как в мобильном, так и в обычном режиме. Однако после развертывания изменений на сайт в мобильном режиме ссылки перестают открываться и не работают даже с мобильного устройства. <br/> У меня есть вопросы по компоненту: <br/> SCSS: <br/>
Для создания кликабельных аннотаций в библиотеке `react-pdf` и обеспечения корректного поведения на мобильных устройствах, вам нужно выполнить несколько шагов. Опишу основные моменты и дам советы по решению проблем, которые могут возникнуть. ### Шаги для создания кликабельных аннотаций: 1. **Убедитесь, что вы используете последние версии библиотек**: - Убедитесь, что у вас установлена актуальная версия `react-pdf`. Проверяйте документацию для получения информации о совместимости и новых функциях. 2. **Использование свойства `renderAnnotationLayer`**: - Убедитесь, что вы правильно передаете свойство `renderAnnotationLayer={true}` в компоненте `<Page>`. Например: ```jsx <Page pageNumber={pageNumber} renderAnnotationLayer={true} /> ``` 3. **Импорт стилей анноций**: - Правильно импортируйте стили для аннотаций. Вы уже упомянули об этом, но важно убедиться, что путь корректен: ```jsx import 'react-pdf/dist/Page/AnnotationLayer.css'; ``` 4. **Настройка обработчиков событий**: - Если аннотации не работают на мобильных устройствах, возможно, проблема в том, как вы обрабатываете события. Проверьте, что у вас есть обработчики для кликов по аннотациям, которые открывают ссылки или выполняют другие действия. ### Пример обработки кликов: Можно использовать личные обработчики событий, чтобы открыть URL ссылок из аннотаций, например: ```jsx const handleAnnotationClick = (url) => { window.open(url, '_blank'); }; // Компонент для отображения страницы <Page pageNumber={pageNumber} renderAnnotationLayer={true} onClick={(event) => { const target = event.target; if (target.tagName === 'A') { event.preventDefault(); const url = target.href; handleAnnotationClick(url); } }} /> ``` ### Проблемы с мобильным режимом: Если ссылки не работают в мобильном браузере после развертывания, раcсмотрите следующие рекомендации: 1. **Проверка CORS**: - Убедитесь, что ваш сервер позволяет доступ к PDF файлам из других доменов (CORS настройки). 2. **Тестирование на различных устройствах**: - Протестируйте на разных мобильных устройствах и браузерах, чтобы исключить проблемы, связанные с совместимостью. 3. **Просмотр консоли**: - Проверьте консоль на наличие ошибок JavaScript или стилей, которые могут свидетельствовать о проблемах в вашем коде или конфигурации. 4. **Кроссбраузерное тестирование**: - Иногда поведение может отличаться в зависимости от браузера. Проверьте, как работает ваш компонент в различных браузерах (например, Chrome, Safari, Firefox). 5. **Обновление зависимостей**: - Убедитесь, что все зависимости вашего проекта являются актуальными. Иногда проблемы решаются просто обновлением. Если приведенные рекомендации не помогут, можете предоставить больше деталей о вашем проекте, и я постараюсь помочь вам найти конкретное решение.
Решил проблему сам, оставлю решение, проблема заключается в том, что все ссылки аннотаций размещаются поверх через абсолютную позицию, из-за этого, если нарушаются пропорции экрана, т.е. ширины, все ссылки съезжают, я убрал из компонента TextLayer как scss, так и пропст в , после добавил ref в div, ref={documentWrapperRef}, и в Page добавил вот такую запись width={documentWrapperRef.current?.getBoundingClientRect().width || undefined}. Все работает отлично, вот рабочий код:
'use client'; import { useRef } from 'react'; import { Document, Page, pdfjs } from 'react-pdf'; // COMPONENTS import { useModalControl } from '@components/modals/document-modal/hooks/useModalControl'; import { usePdfViewer } from '@components/modals/document-modal/hooks/usePdfViewer'; import { PdfControls } from './components/PdfControls'; // STYLES import 'react-pdf/dist/Page/AnnotationLayer.css'; import style from './DocumentModal.module.scss'; // Установите worker pdfjs.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString(); interface DocumentModalProps { isOpen: boolean; onClose: () => void; documentUrl: string; } export const DocumentModal = ({ isOpen, onClose, documentUrl }: DocumentModalProps) => { const dialogRef = useModalControl(isOpen); const documentWrapperRef = useRef<HTMLDivElement>(null); const { scale, isLoading, error, numPages, handleZoomIn, handleZoomOut, handleLoadSuccess, handleLoadError, handleDownload, } = usePdfViewer(); if (!isOpen) return null; return ( <dialog ref={dialogRef} className={style['document-modal']} onClose={onClose}> <div className={style['document-modal__overlay']} onClick={e => { if (e.target === e.currentTarget) { onClose(); } }} > <div className={style['document-modal__wrapper']}> <PdfControls scale={scale} onZoomIn={handleZoomIn} onZoomOut={handleZoomOut} onDownload={() => handleDownload(documentUrl)} onClose={onClose} /> <div className={style['document-modal__content']} ref={documentWrapperRef}> {isLoading && <div className={style['document-modal__loader']}>Загрузка документа...</div>} {error && <div className={style['document-modal__error']}>{error}</div>} <Document file={documentUrl} onLoadSuccess={handleLoadSuccess} onLoadError={handleLoadError} loading={null} noData={null} externalLinkTarget='_blank' > {Array.from(new Array(numPages), (el, index) => ( <Page key={`page_${index + 1}`} pageNumber={index + 1} renderAnnotationLayer={true} scale={scale} className={style['document-modal__page']} loading={null} width={documentWrapperRef.current?.getBoundingClientRect().width || undefined} /> ))} </Document> </div> </div> </div> </dialog> ); };