3 ポイント 投稿者 GN⁺ 2024-11-07 | 1件のコメント | WhatsAppで共有
  • 98.cssは、Windows 98のように見えるWebインターフェースをCSSだけで作成でき、古いデスクトップUIを忠実に再現できるようにする
  • アクセシビリティはセマンティックHTMLに依存し、ボタン・ラベル・アイコンボタンのARIA属性を正しく使うことが前提となる
  • JavaScriptを含まないため、フレームワークを問わずReact、素のJavaScript、一般的なHTMLプロジェクトに組み込める
  • ボタン、チェックボックス、ラジオボタン、ウィンドウ、ツリービュー、タブ、テーブルビュー、プログレスバーなど、Windows 98風のコンポーネントを提供する
  • npm、GitHub Releases、unpkgから利用でき、MITライセンスで公開されており、バグ報告やプルリクエストを受け付けている

CSSでWindows 98 UIを再現する方法

  • 98.cssは、Windows 98のように見えるインターフェースを作るためのCSSライブラリ
  • プロジェクトはGitHubで確認できる
  • アクセシビリティは、別途スクリプトではなくセマンティックHTML構造に依存する
    • ボタンには<button>を使う必要がある
    • 入力要素には対応する<label>が必要
    • アイコンボタンはaria-labelで意図を伝える
  • 基本の外観を保ちながら、一部の要素スタイルを上書きできる
    • ボタンのパディングを増やしたり、入力ラベルに色を追加したりできる

インストールとフレームワーク統合

  • 98.cssは、JavaScriptなしでCSSだけによりHTML要素へWindows 98スタイルを適用する
  • フロントエンドフレームワークとは独立して利用できる
  • 例として、Reactの使用例素のJavaScriptの使用例が提供されている
  • 最も手早い使い方は、unpkgからスタイルシートを読み込む方法
<link rel="stylesheet" href="https://unpkg.com/98.css">;
npm install 98.css

基本フォームコントロール

  • Button

    • 標準ボタンは幅75px、高さ23pxで、浮き上がった外側・内側の枠線と、標準の12px水平パディングを持つ
    • defaultクラスを追加すると、Windows 98でEnterキーにより実行されるデフォルト動作を視覚的に示せる
    • クリック状態では、浮き上がった枠線が押し込まれた形に変わる
    • 無効化されたボタンは同じ浮き上がった枠線を維持するが、ラベルは薄く表示される
    • フォーカスは、ボタン内容の内側4px位置にある点線の枠線で示される
  • Checkbox

    • チェックボックスは、独立している、または相互排他的でない選択を表す
    • 選択時には沈んだパネル内にチェックアイコンが表示され、その横に選択肢を示すラベルが付く
    • <input type="checkbox">の後に、for属性が入力のidを指す<label>を含める必要がある
    • checkeddisabled属性を使用できる
    • 複数の入力をまとめる場合は、各入力をfield-rowクラス付きコンテナで囲んで間隔を揃える
  • Option Button

    • ラジオボタンは、限られた選択肢の中から1つだけ選ぶコントロール
    • <input type="radio">として使い、同じname属性を与えるとグループ化される
    • チェックボックスと同様に、field-rowで囲むことで入力間の間隔を一貫させられる
    • checkeddisabled属性をサポートする
  • Group Box

    • グループボックスは、複数のコントロールを整理するための長方形フレーム
    • fieldsetで要素を囲んで使い、沈んだ外側の枠線と浮き上がった内側の枠線を提供する
    • legendfieldset内に入れることでグループラベルを付けられる

テキスト入力、スライダー、ドロップダウン

  • TextBox

    • テキストボックスは、ユーザーがテキストを入力または編集するための長方形コントロール
    • 単一行入力は<input type="text">としてレンダリングする
    • 対応する<label>と正しいfor属性を用意し、両方をfield-rowコンテナで囲む構成が推奨される
    • field-row-stackedクラスを使うと、ラベルを入力の横ではなく上に配置できる
    • 複数行入力にはtextareaを使う
    • disabledvalueなど標準HTML属性を使える
  • Slider

    • スライダーは、調整範囲を示すバーと現在値を示すインジケーターで構成される
    • <input type="range">としてレンダリングする
    • has-box-indicatorクラスで、標準インジケーターをボックス型インジケーターに変更できる
    • is-verticalを使うdivで囲むと、縦向きスライダーとして表示される
    • 縦向きスライダーの長さを変えるには、inputのwidthとdivのheightを調整する必要がある
  • Dropdown

    • ドロップダウンリストボックスは、一覧から1つの項目だけを選べるようにする
    • 閉じた状態では現在の値を表示し、ユーザーがリストを開いて値を変更する
    • selectoption要素でレンダリングする
    • デフォルト値は最初のオプションで、特定のoptionselectedを付けると既定の選択を変更できる

Windows 98スタイルのウィンドウ構成

  • Title Bar

    • タイトルバーはウィンドウ上端の内側にあり、ウィンドウの内容を識別する
    • title-bartitle-bar-texttitle-bar-controlsクラスで構成する
    • 閉じるボタンはaria-label="Close"を使い、支援技術に意図を伝える
    • MinimizeMaximizeRestoreHelpなどのaria-labelも使用できる
    • aria-labelには対応するスタイリングクラスがあり、aria-labelのテキストが別言語でもレンダリング・アクセシビリティ・ローカライズ上の問題が起きないようにできる
    • 最大化ボタンはdisabledで無効化できる
    • inactiveクラスを追加すると、非アクティブなタイトルバーとして表示できる
  • Window contents

    • windowクラスは、タイトルバーを含むウィンドウコンテナを作成し、浮き上がった外側・内側の枠線とパディングを提供する
    • コンテナスタイルにwidthを指定して、ウィンドウサイズを自由に調整できる
    • タイトルバー下の内容はwindow-bodyクラスで描画できる
  • Status Bar

    • ステータスバーは通常ウィンドウ下部にあり、現在の状態や文脈情報を表示する
    • status-barクラスでステータスバーをレンダリングする
    • 各テキスト要素にはstatus-bar-fieldクラスを使う
    • 例にはPress F1 for helpSlide 1CPU Usage: 14%のようなステータスフィールドが含まれる

リスト、タブ、テーブル、進行表示

  • TreeView

    • ツリービューは、オブジェクト集合を論理的な階層関係に従ってインデント付きアウトライン形式で表示する特殊なリストボックス
    • ul要素にtree-viewクラスを付けてレンダリングする
    • 子のli要素には任意のコンテンツを入れられる
    • ネストしたulを入れると、点線の枠線とインデントでツリー構造を表現できる
    • 展開可能なセクションは、子リストをdetails要素内に入れて作成できる
  • Tabs

    • タブコントロールは、同じウィンドウ内で複数の論理ページや情報セクションを定義するのに使う
    • menu要素にrole="tablist"を付け、子のli要素にはrole="tab"を付ける
    • タブ管理はユーザー側のJavaScriptコードで処理する必要がある
    • アクティブタブにはaria-selected="true"を追加すればよい
    • 複数行タブは、menuタグにmultirowsクラスを追加して作成できる
  • TableView

    • テーブルビューはtable要素でレンダリングする
    • 適切な枠線とoverflowコンテナを提供するには、sunken-panelクラス付きのdivで囲む
    • 少しスクリプトを追加すれば、テーブルビューをインタラクティブにできる
    • interactiveクラスをtableに付けると、本文行のhover時にポインターカーソルを表示する
    • 行にhighlightedクラスを付けると、選択されたように見える
  • Progress Indicator

    • プログレスバーは、長時間の処理の完了率を表示するために使う
    • デフォルトはsolidなプログレスバー
    • segmentedクラスを使うと、分割型のプログレスバーを宣言できる
    • progress-indicator-barのwidthスタイルで進捗率を表す

フィールド枠線とオープンソース参加

  • Field borders

    • テキストボックス、チェックボックス、ドロップダウンリストボックス、スピンボックス、リストボックスはフィールド枠線スタイルを使用する
    • ウィンドウ内の作業領域にも同じスタイルを使える
    • フィールド枠線は沈んだ外側の枠線と沈んだ内側の枠線を使う
    • ほとんどのコントロール内部はbutton highlight色を使う
    • テキストボックスやコンボボックスのようなテキストフィールドが読み取り専用または無効状態のときは、内部にbutton face色を使う
    • 汎用用途向けにfield-borderfield-border-disabledstatus-field-borderクラスが提供される
    • これらのクラスは枠線、背景色、最小限のパディングだけを定義するため、通常は追加パディングを自分で指定する必要がある
  • ライセンスと貢献

    • 98.cssはMIT licensedのプロジェクト
    • バグの確認と報告にはGitHub issues pageを使う
    • プルリクエストを歓迎しており、特にオープンソース参加が初めての人にはコードレビューを提供するとしている
    • プロジェクトは、楽しいオープンソース経験を積む場を目指している

1件のコメント

 
GN⁺ 2024-11-07
Hacker Newsの意見
  • 3.11、95、2000、XP、CDE、Mac OS 9と、それぞれのデフォルトカラーパレットをすべて含めた似たようなものを作った: https://nielssp.github.io/classic-stylesheets/?theme=win9x&s...
    焦点はピクセル単位での完全再現というより、高解像度モニターのような現代の環境でもうまく動作し、見栄えがよい形にすることだった
    そのためアイコンとシンボルをすべて SVG で作り直し、XPとMac OS 9を追加したときにShow HNに投稿したが、大きな関心は得られなかった

    • 気に入っているが、Windows 2000テーマはタイトル文字が太すぎるか濃すぎて、少しずれて見える
      個人的にはWindows 2000はUIデザインの頂点だった
    • ものすごくクールで、品質やテーマ処理、実装のシンプルさが素晴らしい
      さらに見たいのはデータテーブルのテーマで、リストやグリッドのように動作するインタラクティブなテーブルまであるとよい
    • Hotdog stand!
      https://nielssp.github.io/classic-stylesheets/?theme=win3x&s...
    • 98.cssは見つけられる中で最も機能豊富なレトロCSSライブラリだったので簡単なアプリに使ったが、このプロジェクトの Windows 3.1カラーパレット も試してみたくなった
    • UI要素の一つ一つをうまくマッピングしていて、プロジェクトは本当に美しく完成度が高い
  • 作った本人です。これがまた上がってきてうれしい
    これは私のバーンアウト回復プロジェクトで、最近それに関する考えを書き留めた: https://notes.jordanscales.com/98-css-reflections

    • 以前、子どもの頃の何かを再現しようとして、かなりシンプルなWebアプリに98.cssを使ったが、目的にとてもよく合っていた
      [0]: https://www.mathsheets.net/
    • 状態が良くなっていることを願う
      昔のゲームやOSのようなレトロコンピューティングが慰めになり、さらには癒やしにもなり得るという点は興味深い
      子どもの頃のGameboyやNintendoのゲームをエミュレーターで遊んだり、Macintosh System 9を動かしたりするときに似た感覚を覚えたし、Pico-8、SerenityOS、TempleOSも思い浮かぶ
      ユーザーが完全に理解し制御できるレトロ風のコンピューティング環境という共通点があり、治療ツールとしての安全なサンドボックスのような、より深い心理的ダイナミクスもあるのだろう
      最近の技術と社会には敵対的なダークパターンがあまりにも多いので、ユーザーの快適さのために設計された物理的・精神的空間を見つけることは大きな安心になる
    • これまで見た Windows 98再現 の中で最も正確
      Windows 2000とWindows XP向けのものもあるとよい
  • 集めておいたもの:
    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/

    • Tufte OSは初めて聞いた :)
  • 98.cssは正当な理由で HNクラシック になった
    以前の議論:
    https://news.ycombinator.com/item?id=33310554 - 2022年10月、コメント179件
    https://news.ycombinator.com/item?id=22940564 - 2020年4月、コメント211件
    併せて見る価値があるものとして、HyperCard SimulatorとDeckerもある
    https://hn.algolia.com/?q=hypercard

  • 90年代後半、MicrosoftにはWindowsデスクトップのテーマや色に合わせられる CSS組み込み色名 があったと記憶している
    今でも動作するのかは分からないし、IDEでは全部赤色で表示されるので動作しないように見える
    windowtextappworkspacemenutextthreedlightshadowthreedshadowthreedface のような値を使って、ユーザーのデスクトップのルック&フィールに合ったWeb UIを作ることができた
    1998年にブラウザベースのイントラネットアプリでそう使っていて、おかげでよりネイティブらしく見えた

  • このスタイルは非標準のDPIとは相性がよくない
    たとえばモニターのスケーリングを150%に設定したとき、物理ピクセルに合わせて表示してみるには、ブラウザのコンソールで次のように実行できる:
    with(document.documentElement.style){ transform = \scale(${ 1 / devicePixelRatio })`; transformOrigin = 'top left'; }`
    倍率に整数を掛けるとくっきり拡大された感じになり、100%完璧ではなくても意図されたレンダリングにかなり近く見える

    • withをこう使っているのは怖くもあり、同時にとても新鮮でもある
      好きだけど嫌い
  • crowdwaveでこれを少し使っているように見える: https://www.crowdwave.com

  • あわせて見るとよさそうなもの: https://botoxparty.github.io/XP.csshttps://khang-nd.github.io/7.css

    • これらと投稿されたリンクのどれにも共通して、現代のUIと明らかに違うのは余白がずっと少ないこと
      最近はラジオボタングループの選択肢同士の間のように、息をするための空間が必要だというのがほとんど呪文のようになっているが、昔のUIの狭い間隔のほうが率直で、エンドユーザーをより尊重していて、情報密度が高く感じられる
      革新をすべて捨てたいわけではないが、古いUIがよく恋しくなる
    • Windows 7風のものが最も完成度が高く、プログレスバーやメニューのように他にはない要素もかなりある
      Windows 7のウィンドウ装飾は好きではなかったが、それ以外はElectronアプリに使っても悪くなさそう
    • XP向けのリンクは本当にうれしい
      Windows XP UIはすべてのWindows UIの中で最高で、洗練されていると感じられる程度には現代的でありながら、コントラストがあって見やすく、読みやすく、理解しやすかった
      Windows 7 UIは派手すぎて可読性より見た目を優先していたし、Windows 98は古すぎて灰色一色で、コントラスト不足もあった
    • 自分のものも宣伝してみる。上のものほど分離されていたり大規模だったりはしないが、テーマにはかなり合っている:
      https://git.sr.ht/~q3cpma/website/tree/master/item/src/resou...
      https://world-playground-deceit.net/
      こういうものを見ると、最後までやり切ってみたくなる
    • あとは欠けているのはWindows 3.x版だけ
  • 見た目だけでも、Windows 95とWindows 98でレンダリングされていたMS Sans Serifではないように思える

    • 古いフォントを現代のブラウザで再現するのは難しい問題
      https://web.archive.org/web/20230603234837/https://vistaserv...
    • ピクセル化された性格もそのまま保っている
      別のコメントでリンクされているXPスタイルシート[1]は、テキストと図形を高解像度で描くことで制約を減らしつつ、UIの雰囲気を維持している
      98のようなUIが好きな理由は低解像度ではなく、明確さと単純さにある
      [1] https://news.ycombinator.com/item?id=42056921
  • 何年ものUX/UI「研究」と「改善」の末に出てきたものより、こちらのほうがずっと良いと思う
    1998年には1歳だったので、古い世代だからというわけでもない
    ボタンに見えないボタン、タブに見えないタブ、押してみて初めて編集可能だと分かるテキストフィールドが嫌いなだけ

    • Windows 95以降のOSのUIに、実際どれほど多くのUX/UI研究が反映されたのかは分からない
      AppleはMacOSXのためにある程度研究しただろうが、この20年、特にモバイルでは、発見しやすさや一貫性という概念なしに機能がただ放り込まれているように感じた
      何より、企業が「一貫したブランディング」や「独自の外観」を欲しがったことが、多くの問題の原因に見える
    • ただし、濃いグレーの背景の上に黒いテキストというのは気に入らない
      それにそのWebサイトには、普通のテキストのように偽装した「show code」ボタンもある