Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Tabs): Allow to scroll to selected tab #5957

Merged
merged 9 commits into from
Oct 16, 2023

Conversation

mendrew
Copy link
Contributor

@mendrew mendrew commented Oct 11, 2023


  • Документация фичи

Описание

Добавляем возможность горизонтального скролла до активной вкладки.

Используется функция scrollIntoView.
Самое простое решение, но есть нюансы:

1) Вертикальный скролл не выключить

На текущий момент нам надо скроллить только горизонтально, но scrollIntoView осуществляет как горизонтальный, так и вертикальный скролл и вертикальный скролл не выключить. Вертикально scrollIntoView не будет скроллить если используется значение block: "nearest" и при этом элемент находится в рамках видимой области.
Почему вертикальный скролл это проблема? Достаточно представить что компонентTabs находится где-то внизу страницы и не виден сразу, тогда при инициализации страницы может сработать вертикальный скролл до компонента Tabs.
Чтобы избежать проблем с вертикальным скроллом мы не вызываем scrollIntoView если элемент вертикально не в зоне видимости.

2) Старые браузеры не поддерживают опции scrollBehavior

Не все старые браузеры, перечисленные в нашем .browserslistrc поддерживают используемые нами опции в scrollIntoView. Поэтому для таких бразеров скролл просто не будет работать, потому что вызов scrollIntoView с булевым флагом подразумевает вертикальное выравнивание, а значит страница тоже может скроллится, что не желательно.

Почему не использовать scrollTo или другие аналогичные методы вместо scrollIntoView?

В целом можно, но VKUI позволяет располагать TabItem внутри Tabs достаточно свободно, TabItem можно обернуть в любое количество элементов, добавить дополнительных оберток для всего списка элементов, что усложняет логику для правильного просчёта величины на которую нужно проскролить, плюс усложняет определение самого элемента к которому нужно применить скролл.
Можно будет рассмотреть такой вариант, если текущее решение нас не удовлетворит, но пока что лучше воспользоваться тем, что предлагает scrollIntoView.

Изменения

Добавлено два новый пропа в компонент Tabs:

  • withScrollToSelectedTab для включения скролла до активной вкладки
  • scrollBehaviorToSelectedTab для выбора горизонтального выравнивания

@github-actions github-actions bot added the v5 Автоматизация: PR продублируется в ветку v5 label Oct 11, 2023
@codesandbox-ci
Copy link

codesandbox-ci bot commented Oct 11, 2023

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 5ec2e6e:

Sandbox Source
VKUI TypeScript Configuration

@codecov
Copy link

codecov bot commented Oct 11, 2023

Codecov Report

Attention: 6 lines in your changes are missing coverage. Please review.

Comparison is base (2715ada) 79.16% compared to head (5ec2e6e) 79.15%.
Report is 3 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5957      +/-   ##
==========================================
- Coverage   79.16%   79.15%   -0.02%     
==========================================
  Files         306      306              
  Lines        9548     9570      +22     
  Branches     3225     3231       +6     
==========================================
+ Hits         7559     7575      +16     
- Misses       1989     1995       +6     
Flag Coverage Δ
unittests 79.15% <75.00%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Coverage Δ
packages/vkui/src/components/Tabs/Tabs.tsx 91.89% <100.00%> (+0.46%) ⬆️
packages/vkui/src/components/TabsItem/TabsItem.tsx 77.96% <68.42%> (-4.97%) ⬇️

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Carefully turn the scroll on with the flag
and allow to control scroll behavior with separate prop.
Also turn off scroll on mount to avoid extra verticall scroll.
Disable vertical scroll when scrollIntoView will
scroll try to scroll vertically as well.

Update docs
@mendrew mendrew force-pushed the mendrew/feat/5870/Tabs/scroll-to-selected-tab branch from 5458cf3 to 9cf7e3d Compare October 11, 2023 12:20
@github-actions
Copy link
Contributor

github-actions bot commented Oct 11, 2023

size-limit report 📦

Path Size
JS 328.3 KB (+0.2% 🔺)
JS (gzip) 100.29 KB (+0.19% 🔺)
JS (brotli) 82.88 KB (+0.05% 🔺)
JS import Div (tree shaking) 2.71 KB (0%)
CSS 255.11 KB (0%)
CSS (gzip) 33.51 KB (0%)
CSS (brotli) 27.17 KB (0%)

@github-actions
Copy link
Contributor

github-actions bot commented Oct 11, 2023

e2e tests

Playwright Report

@github-actions
Copy link
Contributor

github-actions bot commented Oct 11, 2023

👀 Docs deployed

Commit 5ec2e6e

@mendrew mendrew marked this pull request as ready for review October 11, 2023 12:41
@mendrew mendrew requested a review from a team as a code owner October 11, 2023 12:41
Only scroll when user selects the tab
Copy link
Contributor

@inomdzhon inomdzhon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 🚀

@mendrew mendrew merged commit d5e3854 into master Oct 16, 2023
@mendrew mendrew deleted the mendrew/feat/5870/Tabs/scroll-to-selected-tab branch October 16, 2023 12:21
vkcom-publisher pushed a commit that referenced this pull request Oct 16, 2023
* Описание
Добавляем возможность горизонтального скролла до активной вкладки.

Используется функция [scrollIntoView](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView).
Самое простое решение, но есть нюансы:
1) Вертикальный скролл не выключить
На текущий момент нам надо скроллить только горизонтально, но [scrollIntoView](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView) осуществляет как горизонтальный, так и вертикальный скролл и вертикальный скролл не выключить. Вертикально `scrollIntoView` не будет скроллить если используется значение `block: "nearest"` и при этом элемент находится в рамках видимой области.
Почему вертикальный скролл это проблема? Достаточно представить что  компонент`Tabs` находится где-то внизу страницы и не виден сразу, тогда при инициализации страницы может сработать вертикальный скролл до компонента `Tabs`.
Чтобы избежать проблем с вертикальным скроллом мы не вызываем `scrollIntoView` если элемент вертикально не в зоне видимости.

2) Старые браузеры не поддерживают опции scrollBehavior
Не все [старые браузеры](https://caniuse.com/?search=scrollintoview), перечисленные в нашем [.browserslistrc](https://github.com/VKCOM/VKUI/blob/30c6d400cdd354204cc05fa33aa5f43f24bea467/.browserslistrc) поддерживают используемые нами опции в `scrollIntoView`. Поэтому для таких бразеров скролл просто не будет работать, потому что вызов `scrollIntoView` с булевым флагом подразумевает вертикальное выравнивание, а значит страница тоже может скроллится, что не желательно.

* Почему не использовать `scrollTo` или другие аналогичные методы вместо `scrollIntoView`?
В целом можно, но VKUI позволяет располагать `TabItem` внутри `Tabs` достаточно свободно, `TabItem` можно обернуть в любое количество элементов, добавить дополнительных оберток для всего списка элементов, что усложняет логику для правильного просчёта величины на которую нужно проскролить, плюс усложняет определение самого элемента к которому нужно применить скролл.
Можно будет рассмотреть такой вариант, если текущее решение нас не удовлетворит, но пока что лучше воспользоваться тем, что предлагает `scrollIntoView`.

* Изменения
Добавлено два новый пропа в компонент `Tabs`:
- `withScrollToSelectedTab` для включения скролла до активной вкладки
- `scrollBehaviorToSelectedTab` для выбора горизонтального выравнивания
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
v5 Автоматизация: PR продублируется в ветку v5
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature][Tabs]: Доскролл на активный элемент при выборе
3 participants