iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
生成式 AI

RAG自己來系列:客服機器人系列 第 26

[Day 26] 進階設計 - CSS & JS 微調頁面

  • 分享至 

  • xImage
  •  

使用 Gradio 去構建我們的問答系統時,雖然它有 Row 跟 Column 的元件去幫我們排版,但對於元件的細部設定,還得依靠 CSS 去幫助我們做微調

如果我想讓 Chat 頁面中的輸入框,將外圍的 Textbox 的區塊去掉,只留下內部的輸入區塊

https://ithelp.ithome.com.tw/upload/images/20241004/20146555KobBxqEi2G.png

那麼首先我們先建立一個檔案,名為 layout.css,且在 Blocks 的元件中套用該 css 檔

https://ithelp.ithome.com.tw/upload/images/20241004/20146555RJS6AQtN2k.png

再來我們設定頁面元件的 class 屬性

https://ithelp.ithome.com.tw/upload/images/20241004/20146555JZ4xyywtnp.png

這時我們可以透過瀏覽器的開發人員模式去確認元件是否有套用 class,透過檢查網頁元素,我們可以先確定,要把 padding 設定為 0

https://ithelp.ithome.com.tw/upload/images/20241004/201465553WRCdlGBdE.png
https://ithelp.ithome.com.tw/upload/images/20241004/20146555xr9BuCKP4f.png

再來則是要把 Textbox 的字樣去掉,透過右邊的窗口也可以看到,我們可以把 chat_textbox -> label -> span 的元素隱藏起來,所以將.chat_textbox底下的指定元素隱藏即可

https://ithelp.ithome.com.tw/upload/images/20241004/20146555uMvMbhjmua.png
https://ithelp.ithome.com.tw/upload/images/20241004/20146555LBCsQHlIrg.png


這邊再舉另一個案例,若是使用 Gradio 去構建前端頁面時,底下一定都會有一個「Use via API ...」的文字橫幅

https://ithelp.ithome.com.tw/upload/images/20241004/20146555hV9F5tRdIo.png

若想將它隱藏起來,一樣可以透過 F12 的工具確認它的元素狀態

https://ithelp.ithome.com.tw/upload/images/20241004/20146555HEnj6zXqUd.png

可以發現它是 footer 元素且 class 是屬於 "svelte-1rjryqp",而這個類別

https://ithelp.ithome.com.tw/upload/images/20241004/20146555FQmalZl4s9.png

而這個類別被許多的網頁元素引用,所以且 footer 的元素不在我們 css 可控的範圍,因此我們需要透過 Javascript 去協助我們去除該列物件

而在這邊我選擇使用 MutationObserver 這個類別,它可以協助我們監聽document.body 中的所有狀態,在這邊我讓這個監聽器幫我監聽是否有新的網頁元素產生

  • script.js

    偵測是否有 footer 的元素且 class 屬於 svelte-1rjryqp 的物件產生,有的話就將它隱藏

    function callback(mutationsList, observer) {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList') {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        if (node.matches('footer.svelte-1rjryqp')) {
                            document.querySelector('footer.svelte-1rjryqp').style.display = 'none';
                      }
                  }
              });
          }
      }
    }
    
    const observer = new MutationObserver(callback);
    const config = { childList: true, subtree: true };
    const targetNode = document.body;
    observer.observe(targetNode, config);
    
  • main.py

    這邊我選擇使用 head 而不使用 js 的原因是,head 能使用更底層的語法,不受 gradio 的限制

    ...
    with gr.Blocks(css=open("./layout.css", "r").read(), head=f'<script>\n{open("./script.js", "r", encoding="utf-8").read()}\n</script>') as demo:
        ...
    

實際效果如下,可以看到,最底下的 footer 已經消失了

https://ithelp.ithome.com.tw/upload/images/20241004/20146555D4klRrtMmW.png


上一篇
[Day 25] [複習篇] Day18 ~ Day24 周回複習
下一篇
[Day 27] 進階設計 - 修改投票按鈕樣式
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言