Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
リストビュー画面UX改善の振り返り
Search
proteinMochi
April 03, 2025
Programming
0
160
リストビュー画面UX改善の振り返り
Muddy_Web_#11_Cybozu_proteinmochi
proteinMochi
April 03, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
110
OpenTelemetryで始めるベンダーフリーなobservability / Vendor-free observability starting with OpenTelemetry
seike460
PRO
0
160
バランスを見極めよう!実装の意味を明示するための型定義 TSKaigi 2025 Day2 (5/24)
whatasoda
2
710
Efficiency and Rock 'n’ Roll (Really!)
hollycummins
0
530
ワイがおすすめする新潟の食 / 20250530phpconf-niigata-eve
kasacchiful
0
120
【TSkaigi 2025】これは型破り?型安全? 真実はいつもひとつ!(じゃないかもしれない)TypeScript クイズ〜〜〜〜!!!!!
kimitashoichi
1
280
Investigating Multithreaded PostgreSQL
macdice
0
130
技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt
yoshiyoshifujii
0
150
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
momeemt
1
110
クラシルリワードにおける iOSアプリ開発の取り組み
funzin
1
730
“技術カンファレンスで何か変わる?” ──RubyKaigi後の自分とチームを振り返る
ssagara00
0
200
鯛変だったRubyKaigi 2025 ── それでも楽しかった!
pndcat
0
130
Featured
See All Featured
BBQ
matthewcrist
88
9.6k
Building Applications with DynamoDB
mza
95
6.4k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Navigating Team Friction
lara
185
15k
Site-Speed That Sticks
csswizardry
6
570
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Automating Front-end Workflow
addyosmani
1370
200k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Become a Pro
speakerdeck
PRO
28
5.3k
Docker and Python
trallard
44
3.4k
Transcript
リストビュー画面UX改善の 振り返り
None
話す内容 • 「リストビュー画面」(一覧画面)のUXの改善タスクを振り返る • 一覧画面を一目に収める対応 • 微妙に伸びる横幅の対応 *主に実装レベルで振り返る(UXの概念はあまり触れません)
before
after
None
前提:一覧画面の構成
ヘッダー & グローバル ナビゲーション メインコンテンツ (utility) メインコンテンツ (table)
横にスクロールすると..
None
一覧画面を一目に収める対応
実装方法の検討 1. スクロール対象をテーブルに変更 2. 1.の変更に加えて、外側に偽スクロールを作って同期させる 3. テーブルコンポーネント以外をviewportに固定する
1. スクロール対象テーブルに変更
None
採用できなかった理由 • 横スクロールバーがviewportの最下部に表示されない → 横スクロールバーを探すために毎度下まで下がらないといけない → UX よくないと判断
None
2. 1.の変更に加えて、 外側に偽スクロールを作って同期させる
内側スクロールバー 外側スクロールバー (に見えるやつ)
採用できなかった理由 • ゴリ押しすぎる (偽スクロールバーってなに?) → React の DOM update の自然な流れに反する
bad practice → コードの可読性&メンテ性&拡張性などにおいて NG
3. テーブルコンポーネント以外をviewportに固定する
ラッパーコンポーネント用意
ラッパーコンポーネントの css 指定
None
絶妙に伸びる横幅の対応
横幅が伸びたとは?
横幅が伸びた原因 • `width: 100vw` → 現状 css 仕様的には、縦スクロールバーを考慮しない
解決策の検討 1. 別の width property 単位 → `dvw` を活用 2.
別の width property 単位 → `%` を活用 3. JS 活用
1. 別の width property 単位 → `dvw` を活用
% に変更 from web.dev vw = dvw
解決できなかった理由 dvhはモバイルの viewport では意味あるけど、 dvwは = vw なので、 スクロールバー分を考慮してくれるわけではない
2. 別の width property 単位 → `%` を活用
% に変更
Viewportに固定したい コンポーネント テーブル コンポーネント root コンポーネント Viewport
Viewportに固定したい コンポーネント テーブル コンポーネント root コンポーネント Viewport
解決できなかった理由 伸ばしたくないコンポーネントの幅を伸ばしてしまう。 kintoneの構造上無理だった。
3. JS 活用
1. グローバル resize イベント → ブラウザー window 自体のサイズを観察 → 画面自体のレイアウト変更は観察しない
2. MutationObserver API → DOM 変更を観察 → DOM追加・削除に使えそう 3. IntersectionObserver API → viewport範囲内で見えるか否かを観察 → lazy loading, scroll tracking などで使えそう 4. ResizeObserver API → 要素のサイズの変化を観察 → 縦スクロールバーによる width 変更に反応してくれそう 使えそうなJS pick-up
ResizeObserver API は幅広く使われてる!
% に変更
% に変更
解決!
あとがき
source • Scrollbar problem source • `dvh` explanation source •
Can I use source • resize event source • MutationObserver source • IntersectionObserver source • ResizeObserver source