You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改bslib卡片全屏展开与关闭按钮的文本内容

修改bslib卡片全屏按钮文本的两种方法

方法1:通过JavaScript动态替换默认文本

bslib的全屏按钮文本是硬编码的,我们可以在UI中嵌入一段JavaScript,动态替换展开和关闭按钮的文本。以下是修改后的完整代码(以中文“全屏”和“退出全屏”为例):

library(shiny)
library(bslib)

ui <- fluidPage(
  theme = bs_theme(bootswatch = "minty"),
  titlePanel("Table in a card()"),
  # 添加自定义JS替换按钮文本
  tags$script(HTML("
    // 监听页面元素变化,确保按钮加载后再修改
    const observer = new MutationObserver(() => {
      // 替换全屏展开按钮文本
      const fullscreenBtn = document.querySelector('.card-header .btn-full-screen');
      if (fullscreenBtn && fullscreenBtn.textContent.trim() === 'Full screen') {
        fullscreenBtn.textContent = '全屏';
      }
      // 替换全屏关闭按钮文本
      const exitFullscreenBtn = document.querySelector('.modal-header .btn-full-screen');
      if (exitFullscreenBtn && exitFullscreenBtn.textContent.trim() === 'Exit full screen') {
        exitFullscreenBtn.textContent = '退出全屏';
      }
    });
    observer.observe(document.body, { childList: true, subtree: true });
  ")),
  
  mainPanel(
    card(
      title = "Data Table",
      full_screen = TRUE,
      tableOutput("mytable")
    )
  )
)

server <- function(input, output) {
  data <- data.frame(
    Name = c("John", "Jane", "Alice", "Bob", "Charlie", "David"),
    Age = c(25, 30, 35, 40, 45, 50),
    Score = c(80, 75, 90, 85, 88, 92)
  )
  
  output$mytable <- renderTable({
    data
  })
}

shinyApp(ui = ui, server = server)

方法2:自定义全屏按钮(完全可控)

如果需要更灵活的控制,可以放弃full_screen = TRUE参数,手动在卡片标题栏添加自定义按钮,自己实现全屏逻辑:

library(shiny)
library(bslib)
library(shinyjs)

ui <- fluidPage(
  theme = bs_theme(bootswatch = "minty"),
  useShinyjs(),
  titlePanel("Table in a card()"),
  
  mainPanel(
    card(
      title = tagList(
        "Data Table",
        actionButton(
          "toggle_fullscreen", 
          "全屏", 
          class = "btn btn-sm btn-full-screen ms-auto"
        )
      ),
      id = "my_card",
      tableOutput("mytable")
    )
  )
)

server <- function(input, output) {
  data <- data.frame(
    Name = c("John", "Jane", "Alice", "Bob", "Charlie", "David"),
    Age = c(25, 30, 35, 40, 45, 50),
    Score = c(80, 75, 90, 85, 88, 92)
  )
  
  output$mytable <- renderTable({
    data
  })
  
  # 控制全屏逻辑
  observeEvent(input$toggle_fullscreen, {
    runjs("
      const card = document.getElementById('my_card');
      const btn = document.getElementById('toggle_fullscreen');
      if (card.classList.contains('full-screen')) {
        card.classList.remove('full-screen');
        btn.textContent = '全屏';
      } else {
        card.classList.add('full-screen');
        btn.textContent = '退出全屏';
      }
    ")
  })
}

shinyApp(ui = ui, server = server)

两种方法的区别:

  • 方法1更简单,基于原有的全屏逻辑修改文本,适合快速翻译需求;
  • 方法2自由度更高,可自定义按钮样式、文本和触发逻辑。

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:36:09