使用bslib预设shiny主题时,如何优化禁用SelectizeInput的可读性?
问题:bslib预设主题下禁用SelectizeInput可读性差的解决方法
我正在开发Shiny应用,使用bslib包的bs_theme(preset = "shiny")预设主题,但禁用SelectizeInput后输入框变得难以辨认,相关代码如下:
library(shiny) library(bslib) ui <- page_fluid( shinyjs::useShinyjs(), theme = bs_theme(preset = "shiny"), selectizeInput("id1", "selection unreadable", choices = 1:3, multiple = T) ) server <- function(input, output, session) { observeEvent(input$id1, ignoreInit =T, { shinyjs::disable('id1') }) } shinyApp(ui, server)
禁用后效果:
我希望继续使用该预设主题,但让禁用的输入框保持默认主题那样的高可读性,默认主题示例代码如下:
ui <- fluidPage( shinyjs::useShinyjs(), selectInput("id1", "selection readable", choices = 1:3, multiple = T) ) server <- function(input, output, session) { observeEvent(input$id1, ignoreInit =T, { shinyjs::disable('id1') }) } shinyApp(ui, server)
默认主题禁用后效果:
解决方案
通过自定义CSS覆盖bslib预设主题中禁用状态下SelectizeInput的样式,即可在保留shiny预设主题的同时提升禁用输入框的可读性,具体实现代码如下:
library(shiny) library(bslib) ui <- page_fluid( shinyjs::useShinyjs(), # 自定义CSS样式 tags$style(HTML(" /* 禁用状态的SelectizeInput容器样式 */ .selectize-input.disabled { background-color: #e9ecef !important; color: #495057 !important; border-color: #ced4da !important; opacity: 1 !important; } /* 禁用状态下已选选项的文字颜色 */ .selectize-input.disabled .item { color: #495057 !important; } ")), theme = bs_theme(preset = "shiny"), selectizeInput("id1", "selection now readable", choices = 1:3, multiple = T) ) server <- function(input, output, session) { observeEvent(input$id1, ignoreInit =T, { shinyjs::disable('id1') }) } shinyApp(ui, server)
样式说明
- 将背景色设为默认主题禁用状态的浅灰色
#e9ecef,避免过暗 - 文字颜色调整为
#495057,保证清晰可读 - 边框颜色修正为
#ced4da,和默认主题保持一致 - 强制
opacity:1,解决预设主题中禁用输入框过度透明的问题
内容的提问来源于stack exchange,提问作者Ben Nutzer
相关产品推荐
相关产品推荐

