
在 Shiny 应用中,sortable 包提供了一种直观的方式来创建可拖拽排序的列表,极大地增强了用户交互体验。然而,当这些列表包含大量项目时,其内容可能会超出容器的可见区域,导致界面布局混乱,甚至部分内容无法访问。为了解决这一问题,我们需要为 sortable 列表容器添加滚动功能,使其在内容溢出时自动显示滚动条,从而保持界面的整洁和良好的用户体验。
本教程将以一个典型的 sortable 桶列表(bucket list)应用为例,演示如何为源列表(即用户可以从中拖拽项目的列表)实现垂直滚动。
实现 sortable 列表的滚动功能,主要依赖于 CSS 中的两个关键属性:max-height 和 overflow-y。
通过将这两个属性应用于 rank_list 组件所生成的 HTML 容器,我们就能有效地控制其高度并在必要时启用滚动。
以下是基于原始示例修改后的 Shiny 应用代码,其中包含了实现滚动功能的关键 CSS 样式。
library(shiny)
library(sortable)
ui <- fluidPage(
tags$head(
tags$style(HTML("
/* 为所有桶列表容器设置最小高度 */
.bucket-list-container {min-height: 350px;}
/* 为第一个可拖拽源列表(ID为 rank_list_1)设置最大高度和垂直滚动 */
#rank_list_1 {
max-height: 300px; /* 设置最大高度,可根据需要调整 */
overflow-y: auto; /* 当内容溢出时显示垂直滚动条 */
border: 1px solid #ddd; /* 可选:添加边框以便观察滚动效果 */
padding: 5px; /* 可选:增加内边距 */
}
/* 确保内部的列表项不会因为滚动而挤压 */
#rank_list_1 .sortable-item {
margin-bottom: 5px; /* 增加列表项之间的间距 */
}
"))
),
fluidRow(
column(
width = 12,
# 选择变量列表的单选按钮
radioButtons(inputId="variableList",
label="选择您的变量列表",
choices = c("names(mtcars)"="names(mtcars)","state.name"="state.name")),
# 用于筛选变量名称的文本输入框
textInput(
inputId = "subsetChooseListText",
label = "输入文本以筛选列表",
value = "c"
),
div(
class = "bucket-list-container default-sortable",
"将项目拖拽到任意桶中",
div(
class = "default-sortable bucket-list bucket-list-horizontal",
# uiOutput 将渲染 rank_list_1,它是可滚动的源列表
uiOutput("selection_list", style="flex:1 0 200px;"),
# 目标列表 1
rank_list(
text = "拖拽到这里",
labels = list(),
input_id = "rank_list_2",
options = sortable_options(group = "mygroup")
),
# 目标列表 2
rank_list(
text = "也可以拖拽到这里",
labels = list(),
input_id = "rank_list_3",
options = sortable_options(group = "mygroup")
)
)
)
)
),
fluidRow(
column(
width = 12,
tags$b("结果"),
column(
width = 12,
tags$p("input$rank_list_1"),
verbatimTextOutput("results_1"),
tags$p("input$rank_list_2"),
verbatimTextOutput("results_2"),
tags$p("input$rank_list_3"),
verbatimTextOutput("results_3")
)
)
)
)
server <- function(input,output) {
# 初始化响应式变量列表
varList <- reactive({
req(input$variableList)
if (input$variableList == "state.name") {
state.name
} else {
# 增加项目数量以确保滚动条出现
paste0(rep(names(mtcars), 20),"_", 1:220)
}
})
# 根据文本输入筛选列表
subsetChooseList <- reactive({
items <- varList()
pattern <- input$subsetChooseListText
if (nchar(pattern) < 1) {
return(items)
}
items[
grepl(
x = items,
pattern = input$subsetChooseListText,
ignore.case = TRUE
)
]
})
# 渲染可拖拽的源列表
output$selection_list <- renderUI({
labels <- subsetChooseList()
# 移除已被选择的项目
labels <- labels[!(
labels %in% input$rank_list_2 |
labels %in% input$rank_list_3
)]
rank_list(
text = "从这里拖拽",
labels = labels,
input_id = "rank_list_1", # 关键:此ID对应CSS样式
options = sortable_options(group = "mygroup")
)
})
# 用于调试的可视化输出
output$results_1 <- renderPrint(input$rank_list_1)
output$results_2 <- renderPrint(input$rank_list_2)
output$results_3 <- renderPrint(input$rank_list_3)
}
shinyApp(ui, server)代码解析:
通过上述修改,当用户选择 "names(mtcars)" 列表且项目数量过多时,Drag from here 列表将显示一个垂直滚动条,允许用户浏览所有可拖拽的项目,而不会破坏整体页面布局。
通过简单地在 Shiny 应用的 UI 部分嵌入 CSS 样式,并利用 max-height 和 overflow-y: auto 这两个属性,我们可以轻松地为 sortable 列表添加垂直滚动功能。这不仅解决了内容溢出导致的布局问题,也显著提升了用户在处理大量数据时的交互体验。掌握这一技巧,将使你的 Shiny 应用在功能性和美观性方面更上一层楼。
以上就是Shiny 应用中实现可滚动 Sortable 列表的实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号