3 điểm bởi GN⁺ 2024-11-07 | 1 bình luận | Chia sẻ qua WhatsApp
  • 98.css cho phép tạo giao diện web trông như Windows 98 chỉ bằng CSS, giúp tái hiện trung thực UI desktop cổ điển
  • Khả năng truy cập dựa trên HTML ngữ nghĩa, với giả định rằng các thuộc tính ARIA cho nút, nhãn và nút biểu tượng được dùng đúng cách
  • Không bao gồm JavaScript nên có thể gắn vào các dự án React, JavaScript thuần hoặc HTML thông thường bất kể framework nào
  • Cung cấp các component phong cách Windows 98 như nút, checkbox, radio button, cửa sổ, tree view, tab, table view, thanh tiến trình, v.v.
  • Có thể dùng qua npm, GitHub releases, unpkg và được phát hành theo giấy phép MIT, đồng thời nhận báo lỗi và pull request

Cách tái hiện giao diện Windows 98 bằng CSS

  • 98.css là thư viện CSS để tạo giao diện trông như Windows 98
  • Có thể xem dự án trên GitHub
  • Khả năng truy cập dựa vào cấu trúc HTML ngữ nghĩa thay vì script riêng
    • Nút phải dùng <button>
    • Phần tử nhập liệu cần có <label> tương ứng
    • Nút biểu tượng truyền đạt ý nghĩa bằng aria-label
  • Có thể ghi đè một phần style của phần tử mà vẫn giữ nguyên diện mạo cơ bản
    • Ví dụ có thể tăng padding cho nút hoặc thêm màu cho nhãn của input

Cài đặt và tích hợp framework

  • 98.css áp dụng phong cách Windows 98 cho phần tử HTML chỉ bằng CSS, không cần JavaScript
  • Có thể dùng độc lập với frontend framework
  • Có cung cấp ví dụ dùng với Reactdùng với JavaScript thuần
  • Cách dùng nhanh nhất là lấy stylesheet từ unpkg
<link rel="stylesheet" href="https://unpkg.com/98.css">;
npm install 98.css

Các form control cơ bản

  • Button

    • Nút tiêu chuẩn có chiều rộng 75px, chiều cao 23px, với viền ngoài và viền trong nổi cùng padding ngang mặc định 12px
    • Khi thêm class default, có thể truyền đạt bằng trực quan hành động mặc định sẽ được thực thi bằng phím Enter trong Windows 98
    • Ở trạng thái được nhấn, viền nổi sẽ chuyển sang dạng bị nhấn xuống
    • Nút bị vô hiệu hóa vẫn giữ cùng kiểu viền nổi nhưng nhãn hiển thị mờ hơn
    • Trạng thái focus được hiển thị bằng viền nét đứt nằm cách bên trong nội dung nút 4px
  • Checkbox

    • Checkbox biểu thị lựa chọn độc lập hoặc không loại trừ lẫn nhau
    • Khi được chọn, biểu tượng dấu chọn xuất hiện trong một panel lõm xuống, kèm theo nhãn cho tùy chọn ở bên cạnh
    • Sau <input type="checkbox"> cần có <label> với thuộc tính for trỏ đến id của input
    • Có thể dùng các thuộc tính checked, disabled
    • Khi nhóm nhiều input, hãy bọc từng input trong một container có class field-row để căn khoảng cách
  • Option Button

    • Radio button là control dùng để chọn đúng một mục trong số các lựa chọn giới hạn
    • Dùng với <input type="radio">, và nếu gán cùng thuộc tính name thì chúng sẽ được nhóm lại
    • Tương tự checkbox, có thể bọc bằng field-row để giữ khoảng cách giữa các input nhất quán
    • Hỗ trợ các thuộc tính checked, disabled
  • Group Box

    • Group box là khung hình chữ nhật để tổ chức nhiều control
    • Dùng bằng cách bọc phần tử trong fieldset, cung cấp viền ngoài lõm và viền trong nổi
    • Có thể đặt legend bên trong fieldset để gắn nhãn cho nhóm

Ô nhập văn bản, slider và dropdown

  • TextBox

    • Text box là control hình chữ nhật cho phép người dùng nhập hoặc chỉnh sửa văn bản
    • Ô nhập một dòng được render bằng <input type="text">
    • Khuyến nghị cung cấp <label> tương ứng với thuộc tính for chính xác, và bọc cả hai trong container field-row
    • Nếu dùng class field-row-stacked, nhãn có thể được đặt phía trên thay vì bên cạnh ô nhập
    • Ô nhập nhiều dòng dùng textarea
    • Có thể dùng các thuộc tính HTML tiêu chuẩn như disabled, value
  • Slider

    • Slider gồm một thanh biểu thị phạm vi điều chỉnh và một chỉ báo hiển thị giá trị hiện tại
    • Được render bằng <input type="range">
    • Có thể đổi chỉ báo mặc định sang dạng hộp bằng class has-box-indicator
    • Nếu bọc trong div dùng is-vertical, nó sẽ hiển thị thành slider dọc
    • Để thay đổi độ dài slider dọc, cần chỉnh width của inputheight của div
  • Dropdown

    • Hộp danh sách dropdown cho phép chỉ chọn một mục từ danh sách
    • Ở trạng thái đóng, nó hiển thị giá trị hiện tại và người dùng mở danh sách để đổi giá trị
    • Được render bằng các phần tử selectoption
    • Giá trị mặc định là tùy chọn đầu tiên; có thể thay đổi lựa chọn mặc định bằng cách đặt selected cho một option cụ thể

Cấu thành cửa sổ kiểu Windows 98

  • Title Bar

    • Thanh tiêu đề nằm ở mép trên bên trong cửa sổ và dùng để nhận diện nội dung của cửa sổ
    • Được cấu thành từ các class title-bar, title-bar-text, title-bar-controls
    • Nút đóng dùng aria-label="Close" để truyền đạt ý nghĩa tới công nghệ hỗ trợ
    • Cũng có thể dùng các aria-label như Minimize, Maximize, Restore, Help
    • Mỗi aria-label có class style tương ứng, để dù văn bản aria-label ở ngôn ngữ khác vẫn không phát sinh vấn đề về render, truy cập hay bản địa hóa
    • Nút maximize có thể bị vô hiệu hóa bằng disabled
    • Có thể thêm class inactive để hiển thị như thanh tiêu đề không hoạt động
  • Window contents

    • Class window tạo container cửa sổ chứa thanh tiêu đề, cung cấp viền ngoài và viền trong nổi cùng padding
    • Có thể chỉ định width trong style của container để tự do điều chỉnh kích thước cửa sổ
    • Nội dung bên dưới thanh tiêu đề có thể được vẽ bằng class window-body
  • Status Bar

    • Thanh trạng thái thường nằm ở dưới cùng của cửa sổ và hiển thị trạng thái hiện tại hoặc thông tin ngữ cảnh
    • Render thanh trạng thái bằng class status-bar
    • Mỗi phần tử văn bản dùng class status-bar-field
    • Ví dụ bao gồm các trường trạng thái như Press F1 for help, Slide 1, CPU Usage: 14%

Danh sách, tab, bảng và hiển thị tiến trình

  • TreeView

    • Tree view là một hộp danh sách đặc biệt hiển thị tập hợp đối tượng dưới dạng dàn ý thụt đầu dòng theo quan hệ phân cấp logic
    • Được render bằng cách gắn class tree-view cho phần tử ul
    • Các phần tử con li có thể chứa nội dung tùy ý
    • Nếu lồng ul, cấu trúc cây sẽ được hiển thị bằng viền nét đứt và thụt lề
    • Có thể tạo các phần có thể mở rộng bằng cách đặt danh sách con trong phần tử details
  • Tabs

    • Tab control được dùng để định nghĩa nhiều trang logic hoặc các phần thông tin trong cùng một cửa sổ
    • Gắn role="tablist" cho phần tử menu, và role="tab" cho các phần tử con li
    • Việc quản lý tab cần được xử lý bằng mã JavaScript do người dùng viết
    • Có thể thêm aria-selected="true" cho tab đang hoạt động
    • Tab nhiều hàng có thể tạo bằng cách thêm class multirows vào thẻ menu
  • TableView

    • Table view được render bằng phần tử table
    • Để cung cấp viền phù hợp và container overflow, hãy bọc nó trong div có class sunken-panel
    • Chỉ cần thêm một chút script là có thể biến table view thành dạng tương tác
    • Nếu gán class interactive cho table, con trỏ chuột dạng pointer sẽ hiện khi hover lên các hàng nội dung
    • Nếu gán class highlighted cho một hàng, hàng đó sẽ trông như đang được chọn
  • Progress Indicator

    • Thanh tiến trình dùng để hiển thị tỷ lệ hoàn thành của một tác vụ dài
    • Mặc định là thanh tiến trình liền khối
    • Có thể khai báo thanh tiến trình phân đoạn bằng class segmented
    • Tiến độ được biểu thị bằng style width của progress-indicator-bar

Viền trường và tham gia mã nguồn mở

  • Field borders

    • Text box, checkbox, hộp danh sách dropdown, spin box và list box dùng kiểu viền trường
    • Cùng kiểu này cũng có thể dùng cho vùng làm việc bên trong cửa sổ
    • Viền trường dùng viền ngoài lõm và viền trong lõm
    • Bên trong hầu hết control sử dụng màu button highlight
    • Khi các trường văn bản như text box và combo box ở trạng thái chỉ đọc hoặc bị vô hiệu hóa, phần bên trong dùng màu button face
    • Các class field-border, field-border-disabled, status-field-border được cung cấp cho mục đích sử dụng chung
    • Những class này chỉ định nghĩa viền, màu nền và padding tối thiểu, nên thường cần tự chỉ định thêm padding
  • Giấy phép và đóng góp

    • 98.css là dự án MIT licensed
    • Việc xác nhận và báo lỗi sử dụng GitHub issues page
    • Dự án hoan nghênh pull request, và đặc biệt cho biết sẽ cung cấp code review cho những người mới tham gia mã nguồn mở
    • Dự án hướng tới việc trở thành nơi tích lũy trải nghiệm mã nguồn mở thú vị

1 bình luận

 
GN⁺ 2024-11-07
Ý kiến trên Hacker News
  • Đã làm một thứ tương tự, bao gồm 3.11, 95, 2000, XP, CDE, Mac OS 9 cùng các bảng màu mặc định của từng hệ: https://nielssp.github.io/classic-stylesheets/?theme=win9x&s...
    Trọng tâm không phải là tái hiện hoàn hảo đến từng pixel, mà là một dạng vẫn hoạt động tốt và trông đẹp trong môi trường hiện đại như màn hình độ phân giải cao
    Vì vậy, toàn bộ biểu tượng và ký hiệu đều được làm lại bằng SVG, và khi thêm XP cùng Mac OS 9 tôi đã đăng lên Show HN nhưng không nhận được nhiều chú ý

    • Tôi thích nó, nhưng theme Windows 2000 trông hơi lệch vì chữ tiêu đề quá dày hoặc quá đậm
      Cá nhân tôi thấy Windows 2000 là đỉnh cao của thiết kế UI
    • Cực kỳ tuyệt, chất lượng, cách xử lý theme và độ đơn giản của phần triển khai đều xuất sắc
      Thứ tôi muốn thấy thêm là theme cho bảng dữ liệu, và sẽ càng hay nếu có cả các bảng tương tác hoạt động như danh sách và lưới
    • Hotdog stand!
      https://nielssp.github.io/classic-stylesheets/?theme=win3x&s...
    • 98.css là thư viện CSS retro giàu tính năng nhất mà tôi tìm được nên tôi đã dùng cho một ứng dụng đơn giản, và giờ cũng muốn thử bảng màu Windows 3.1 của dự án này
    • Dự án thật sự đẹp và hoàn thiện cao, ánh xạ rất tốt từng thành phần UI
  • Tôi là người tạo ra nó. Rất vui khi thấy nó được đưa lên lại
    Đây là dự án phục hồi sau burnout của tôi, và gần đây tôi đã viết vài suy nghĩ liên quan: https://notes.jordanscales.com/98-css-reflections

    • Trước đây tôi đã dùng 98.css cho một web app khá đơn giản nhằm tái hiện thứ gì đó từ thời thơ ấu, và nó rất phù hợp với mục đích đó
      [0]: https://www.mathsheets.net/
    • Hy vọng tình trạng của bạn đã tốt hơn
      Thật thú vị khi retro computing như các trò chơi cũ hay hệ điều hành cũ có thể mang lại sự an ủi, thậm chí có tính chữa lành
      Tôi có cảm giác tương tự khi chơi các game Gameboy, Nintendo thời thơ ấu trên trình giả lập hoặc chạy Macintosh System 9, và cũng nghĩ đến Pico-8, SerenityOS, TempleOS
      Điểm chung là đó là những môi trường điện toán kiểu hoài cổ mà người dùng có thể hiểu và kiểm soát hoàn toàn; có lẽ còn có những động lực tâm lý sâu hơn, như một sandbox an toàn đóng vai trò công cụ trị liệu
      Công nghệ và xã hội ngày nay có quá nhiều dark pattern mang tính đối kháng, nên việc tìm được những không gian vật lý và tinh thần được thiết kế vì sự thoải mái của người dùng đem lại cảm giác nhẹ nhõm lớn
    • Đây là bản tái hiện Windows 98 chính xác nhất mà tôi từng thấy
      Ước gì cũng có bản cho Windows 2000 và Windows XP
  • Những thứ tôi đã gom lại:
    The Sims https://thesimscss.inbn.dev/
    Windows 98 https://jdan.github.io/98.css/
    Windows XP https://botoxparty.github.io/XP.css/
    Windows 7 https://khang-nd.github.io/7.css/
    Edward Tufte https://edwardtufte.github.io/tufte-css/

    • Lần đầu nghe đến Tufte OS :)
  • 98.css đã trở thành một HN classic vì những lý do chính đáng
    Các thảo luận trước đây:
    https://news.ycombinator.com/item?id=33310554 - tháng 10/2022, 179 bình luận
    https://news.ycombinator.com/item?id=22940564 - tháng 4/2020, 211 bình luận
    Cũng đáng xem thêm HyperCard Simulator và Decker
    https://hn.algolia.com/?q=hypercard

  • Tôi nhớ vào cuối thập niên 90, Microsoft có các tên màu tích hợp trong CSS khớp với theme và màu sắc desktop của Windows
    Tôi không biết giờ chúng còn hoạt động không; trong IDE thì tất cả đều hiện màu đỏ nên có vẻ là không hoạt động
    Có thể dùng các giá trị như windowtext, appworkspace, menutext, threedlightshadow, threedshadow, threedface để tạo UI web khớp với look-and-feel desktop của người dùng
    Năm 1998, tôi đã dùng như vậy trong một ứng dụng intranet dựa trên trình duyệt, nhờ đó nó trông giống native hơn

  • Kiểu này không hợp với DPI không mặc định
    Ví dụ, khi đặt tỷ lệ màn hình ở 150%, để thử căn theo pixel vật lý, bạn có thể chạy như sau trong console của trình duyệt:
    with(document.documentElement.style){ transform = \scale(${ 1 / devicePixelRatio })`; transformOrigin = 'top left'; }`
    Nếu nhân tỷ lệ với một số nguyên, bạn có thể có cảm giác được phóng to rõ nét; dù không hoàn hảo 100%, trông vẫn gần hơn nhiều với cách render dự định

    • Việc dùng with như thế này vừa đáng sợ vừa rất mới mẻ
      Vừa thích vừa ghét
  • Có vẻ crowdwave đã dùng một chút cái này: https://www.crowdwave.com

  • Những thứ đáng xem cùng: https://botoxparty.github.io/XP.csshttps://khang-nd.github.io/7.css

    • Điểm khác biệt rõ ràng giữa các thứ này, cũng như liên kết được gửi, so với UI hiện đại là khoảng trắng ít hơn rất nhiều
      Ngày nay, việc cần có không gian để “thở”, như giữa các lựa chọn trong một nhóm radio button, gần như đã trở thành câu thần chú; nhưng khoảng cách chật hơn của UI ngày xưa cho cảm giác chân thật hơn, tôn trọng người dùng cuối hơn và có mật độ thông tin cao hơn
      Tôi không muốn vứt bỏ hết mọi đổi mới, nhưng thường rất nhớ UI cũ
    • Bản trông giống Windows 7 có mức độ hoàn thiện cao nhất, và cũng có khá nhiều thành phần mà những bản khác không có, như thanh tiến trình hay menu
      Tôi không thích phần trang trí cửa sổ của Windows 7, nhưng phần còn lại có vẻ dùng cho ứng dụng Electron cũng không tệ
    • Rất vui khi thấy liên kết dành cho XP
      UI Windows XP là UI tốt nhất trong tất cả các UI Windows; nó hiện đại vừa đủ để tạo cảm giác tinh tế, nhưng vẫn có độ tương phản nên dễ nhìn, dễ đọc và dễ hiểu
      UI Windows 7 thì quá bóng bẩy và đặt hình thức lên trước khả năng đọc; còn Windows 98 thì quá cũ kỹ, toàn màu xám nên cũng thiếu tương phản
    • Xin quảng bá cái của tôi một chút. Nó không tách bạch hay đồ sộ như những cái ở trên, nhưng khá hợp chủ đề:
      https://git.sr.ht/~q3cpma/website/tree/master/item/src/resou...
      https://world-playground-deceit.net/
      Nhìn những thứ như thế này khiến tôi muốn làm đến cùng
    • Giờ thứ duy nhất còn thiếu là phiên bản Windows 3.x
  • Chỉ nhìn bằng mắt cũng thấy có vẻ không phải MS Sans Serif từng được render trên Windows 95 và Windows 98

    • Tái hiện phông chữ cũ trên trình duyệt hiện đại là một vấn đề khó
      https://web.archive.org/web/20230603234837/https://vistaserv...
    • Tính chất pixel hóa cũng được giữ nguyên
      Stylesheet kiểu XP[1] được liên kết trong một bình luận khác vẽ chữ và hình khối ở độ phân giải cao, nhờ đó giảm bớt ràng buộc trong khi vẫn giữ cảm giác của UI
      Lý do tôi thích UI kiểu 98 không phải vì độ phân giải thấp, mà vì sự rõ ràng và đơn giản
      [1] https://news.ycombinator.com/item?id=42056921
  • Tôi thấy cái này tốt hơn nhiều so với những gì xuất hiện sau nhiều năm “nghiên cứu” và “cải tiến” UX/UI
    Năm 1998 tôi mới một tuổi, nên không phải vì tôi thuộc thế hệ cũ
    Tôi chỉ ghét những nút trông không giống nút, tab trông không giống tab, và các trường văn bản mà phải bấm vào mới biết là có thể chỉnh sửa

    • Tôi không rõ sau Windows 95, UI hệ điều hành có thật sự phản ánh nhiều nghiên cứu UX/UI hay không
      Apple có lẽ đã nghiên cứu ở mức nào đó cho MacOSX, nhưng trong 20 năm qua, đặc biệt trên mobile, tôi có cảm giác các tính năng cứ bị ném vào mà không có khái niệm về khả năng khám phá hay tính nhất quán
      Trên hết, có vẻ việc các công ty muốn “branding nhất quán” hoặc “diện mạo riêng” là nguyên nhân của nhiều vấn đề
    • Tuy vậy, tôi không thích chữ đen trên nền xám đậm
      Và trên trang web đó còn có nút “show code” ngụy trang như văn bản bình thường