如何解决Shiny仪表板中TopNav与侧边栏重叠的问题?
问题描述
我制作了一个带有多个标签页的Shiny仪表板,当窗口尺寸缩小到一定程度时,顶部标签页会自动换行到第二行,但此时第二行导航栏会与侧边栏内容重叠,主面板内容却能正常适配导航栏的新高度。
问题表现:导航栏换行后,第二行导航栏会覆盖侧边栏顶部的输入控件(如选择框),导致控件被遮挡。
代码示例
ui11 <- shinyUI(navbarPage("Beasts of Bellevue", tabPanel("Head to Head", fluid = TRUE, useShinydashboard(), dashboardSidebar( sidebarMenu(), # 选择左侧图表的变量 selectInput(inputId = "left", label = "Manager 1:", choices = c("Kevin", "Jake", "Lyons", "Nipples", "Dan", "Shuds", "Karp", "Mills", "Joey", "Raffy", "Oster", "Scott", "Sam"), selected = "Kevin"), # 选择右侧图表的变量 selectInput(inputId = "right", label = "Manager 2:", choices = c("Kevin", "Jake", "Lyons", "Nipples", "Dan", "Shuds", "Karp", "Mills", "Joey", "Raffy", "Oster", "Scott", "Sam"), selected = "Lyons"), # 选择要包含的比赛类型 checkboxGroupInput(inputId = "selected_gametype", label = "Select game type(s):", choices = c("Regular Season", "Playoffs", "Consolation"), selected = c("Regular Season", "Playoffs", "Consolation")), # 选择要包含的赛季 sliderInput(inputId = "slider", label = "Seasons", min = 2012, max = max(h2h$Year), value = c(2012, max(h2h$Year)), sep = "", ticks = FALSE, dragRange = TRUE), br(), tags$img(src = "bob.png", height = 225, width = 225)), # 头部 header <- dashboardHeader( disable = TRUE ), mainPanel(width = 12, dashboardBody(tags$head(tags$meta(name = "viewport", content = "width=1600")), shinyDashboardThemes( theme = "grey_light" ), fluidRow( # 第一行第一列 column(width = 6, h3(textOutput("left")) ), # 第一行第二列 column(width = 6, h3(textOutput("right")) ) ), fluidRow( # 第二行第一列 column(width = 6, withLoader(valueBoxOutput( outputId = "leftnumber", width = NULL), type = "html", loader = "loader7")), # 第二行第二列 column(width = 6, valueBoxOutput( outputId = "rightnumber", width = NULL)) ), fluidRow( column(width = 12, valueBoxOutput( outputId = "leftnumberavg", width = 2), valueBoxOutput( outputId = "leftnumberavg2", width = 2), valueBoxOutput( outputId = "leftmargofvic", width = 2), valueBoxOutput( outputId = "rightnumberavg", width = 2), valueBoxOutput( outputId = "rightnumberavg2", width = 2), valueBoxOutput( outputId = "rightmargofvic", width = 2)) ), plotlyOutput(outputId = "plot") ) ) )))
解决方案
方案1:自定义CSS调整侧边栏间距
问题根源是navbarPage换行后高度增加,但dashboardSidebar的顶部位置未同步调整。在dashboardBody的tags$head中添加以下样式,让侧边栏顶部留出足够空间:
tags$head( tags$meta(name = "viewport", content = "width=device-width, initial-scale=1.0"), tags$style(HTML(" /* 让导航栏自适应换行后的高度 */ .navbar { min-height: auto; padding-bottom: 0.5em; } /* 小屏幕下调整侧边栏顶部间距 */ @media (max-width: 992px) { .main-sidebar { margin-top: 100px; /* 根据实际导航栏高度调整数值 */ } } /* 大屏幕保持原有间距 */ @media (min-width: 993px) { .main-sidebar { margin-top: 50px; } } ")) )
方案2:改用原生Dashboard布局结构
当前混用navbarPage和dashboard组件易引发样式冲突,建议改用dashboardPage结合navbarMenu实现多标签页,遵循Shiny Dashboard原生布局规范,自适应效果更协调:
ui11 <- shinyUI(dashboardPage( # 顶部导航栏(含多标签页) dashboardHeader( title = "Beasts of Bellevue", navbarMenu("Tabs", tabItem(tabName = "head_to_head", "Head to Head"), tabItem(tabName = "other_tab", "Other Tab") ) ), # 侧边栏 dashboardSidebar( sidebarMenu( menuItem("Head to Head", tabName = "head_to_head", icon = icon("bar-chart")), menuItem("Other Tab", tabName = "other_tab", icon = icon("table")) ), # 原有输入控件 selectInput(inputId = "left", label = "Manager 1:", choices = c("Kevin", "Jake", "Lyons", "Nipples", "Dan", "Shuds", "Karp", "Mills", "Joey", "Raffy", "Oster", "Scott", "Sam"), selected = "Kevin"), selectInput(inputId = "right", label = "Manager 2:", choices = c("Kevin", "Jake", "Lyons", "Nipples", "Dan", "Shuds", "Karp", "Mills", "Joey", "Raffy", "Oster", "Scott", "Sam"), selected = "Lyons"), checkboxGroupInput(inputId = "selected_gametype", label = "Select game type(s):", choices = c("Regular Season", "Playoffs", "Consolation"), selected = c("Regular Season", "Playoffs", "Consolation")), sliderInput(inputId = "slider", label = "Seasons", min = 2012, max = max(h2h$Year), value = c(2012, max(h2h$Year)), sep = "", ticks = FALSE, dragRange = TRUE), br(), tags$img(src = "bob.png", height = 225, width = 225) ), # 主面板内容 dashboardBody( shinyDashboardThemes(theme = "grey_light"), tags$head(tags$meta(name = "viewport", content = "width=device-width, initial-scale=1.0")), tabItems( tabItem(tabName = "head_to_head", fluidRow( column(width = 6, h3(textOutput("left"))), column(width = 6, h3(textOutput("right"))) ), fluidRow( column(width = 6, withLoader(valueBoxOutput( outputId = "leftnumber", width = NULL), type = "html", loader = "loader7")), column(width = 6, valueBoxOutput( outputId = "rightnumber", width = NULL)) ), fluidRow( column(width = 12, valueBoxOutput(outputId = "leftnumberavg", width = 2), valueBoxOutput(outputId = "leftnumberavg2", width = 2), valueBoxOutput(outputId = "leftmargofvic", width = 2), valueBoxOutput(outputId = "rightnumberavg", width = 2), valueBoxOutput(outputId = "rightnumberavg2", width = 2), valueBoxOutput(outputId = "rightmargofvic", width = 2)) ), plotlyOutput(outputId = "plot") ), tabItem(tabName = "other_tab", h3("其他标签页内容")) ) ) ))
内容的提问来源于stack exchange,提问作者kk924
相关产品推荐
相关产品推荐

