風仙洞

HTML と CSS のテスト

最終更新:2024/03/07
初出:2020/06/27

目次

li::after でマーカー変化他

追加:2024/03/07

li 要素に疑似要素 ::after を付けてマーカーを出現させるだけでなく、他の要素や :hover 疑似クラスとも組み合わせ、変化させてみた。

● CSS
  • ul.menu-list2 {padding: 0; width: 90%; margin: 20px auto; list-style-type: none; display: flex; flex-wrap: wrap;}
  • .menu-list2 > li {width: 50%; padding: 10px; box-sizing: border-box; border-bottom: black solid 1px; position: relative;}
  • .menu-list2 > li:nth-last-of-type(even) {border-left: 1px solid black;}
  • .menu-list2 > li::after {content: "▶"; position: absolute; top: 50%; right: 10px; transform: translateY(-50%); color: brown;}
  • .menu-list2 a {color: #333; text-decoration: none; display: block;}
  • li#language {width: 100%; border-bottom: black solid 3px; padding: 10px;}
  • #language::after {display: none;}
  • #language summary {list-style-type: none; position: relative;}
  • #language summary::after {content:"▶"; color: brown; position: absolute; top: 50%; right: 0; transform: translateY(-50%);}
  • #language summary:hover::after {content: "▼"; color: brown; position: absolute; top: 50%; right: 0; transform: translateY(-50%);}
  • ul.lang-list {font-weight: normal; display: none;}
  • #language:hover ul.lang-list {display: block;}
● HTML
  • <ul class="menu-list2">
  • <li><a href="#">企業情報</a></li>
  • <li><a href="#">採用情報</a></li>
  • <li id="language">
    • <details>
    • <summary>Language</summary>
    • <ul class="lang-list">
      <li>日本語</li>
      <li>English</li>
      <li>中国语</li>
      <li>その他(Other)</li>
    • </ul>
    • </details>
  • </li>
  • </ul>

dl/dt/dd 要素で表作成

追加:2024/03/07

table 要素を使って表を作成するのは当たり前である。しかし、項目と値のペアが短い場合と長い場合が混在する場合、1行に th 要素が複数あるのは何か変である。しかも table 要素では、スマホ用表示の際に行の中のセルの数を減らすわけにはいかない。

そこで dl/dt/dd 要素で表を作成し、メディアクエリーでの項目・値のセット減少に対応させた。

氏名
R. Daneel Olivaw
性別
無性
100-0000
都道府県
東京都
住所
千代田区○○○1-1-1

ちなみに上の表は次のように変形する(スマホで見た場合、画像が小さくなって見にくいが......)。

dt/dt/dd 要素による表のモバイル表示 dt/dt/dd 要素による表のPC表示
● CSS
  • dl.entry-data {width: 90%; margin: 10px auto; display: flex; flex-wrap: wrap; align-items: center;}
  • .entry-data > dt, .entry-data > dd {border: silver solid 1px; padding: 5px; box-sizing: border-box; height: auto; min-height: 36px;}
  • .entry-data > dt {width: 16%; background-color: #ddd;}
  • .entry-data > dd {margin-left: 0; width: 34%;}
  • .entry-data > dd.ever {width: 84%;}
  • @media screen and (max-width: 710px) {
    • .entry-data > dt {width: 25%;}
    • .entry-data > dd, .entry-data > dd.ever {width: 75%;}
  • }
● HTML
  • <dl class="entry-data">
    • <dt>氏名</dt>
    • <dd>R. Daneel Olivaw</dd>
    • <dt>性別</dt>
    • <dd>無性</dd>
    • <dt>〒</dt>
    • <dd>100-0000</dd>
    • <dt>都道府県</dt>
    • <dd>東京都</dd>
    • <dt>住所</dt>
    • <dd class="ever">千代田区○○○1-1-1
    • </dd>
  • </dl>

transform: translate(値) で中央配置

追加:2024/02/12

親要素の中央に子要素を配置する方法はいくつかあるが、transform: translate(値) での方法を試してみた。

画像サンプル
テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

条件は、

  • skyblue の太枠の横幅は 90%、本来の高さ 50vh(このページで作図する都合で実際には 300px に設定)。
  • slategray の部分の高さは 50px。
  • figure 要素で作成する内側の黒枠の幅は skyblue の枠の 80%。
  • 内側の枠をページュの部分の上下左右の中央に配置。

この条件では、ベージュ部分の本来の高さは calc(50vh - 50px) であり、vh なので端末によって高さが変わるが、ベージュ部分の上端、下端とのマージン、左端、右端とのマージンを等しくするというお題である。

そこで考えたのが次のソース。

● CSS
  • div.outer {margin: 10px auto; width: 94%; height: 50vh; background-color: beige; border: skyblue solid 3px;
    position: relative;}
  • .outer > div.header {height: 50px; background-color: slategray;}
  • figure.inner {width: 80%; margin: 0; display: flex; justify-content: center; box-sizing: border-box; align-items: flex-start; gap: 10px; border: black solid 1px; padding: 10px;
    position: absolute; top: calc(25vh + 25px); left: 50%; transform: translate(-50%,-50%);}
  • .inner > img, .inner > div {width: 50%;}
  • .inner > div {text-align: justify; font-size: 95%; line-height: 1.5;}
  • .inner > img {aspect-ratio: 3 / 2;}
● HTML
  • <div class="outer">
  • <div class="header"></div>
  • <figure class="inner">
    • <img src="URL" alt="">
    • <p>テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
    • </p>
  • </figure>
  • </div>
  • div class="outer" に position: relative
  • figure lass="inner" に position: absolute

を適用するのは当然として、子要素に top: calc(25vh + 25px)、left: 50% で端との距離を指定しただけでは figure 要素として X軸(左右)、Y軸(上下)の中央にはならない。左上が中央になってしまうのである。それを補整するのが、

  • transform: translate(-50%,-50%)

である。translate 関数の値を % で指定した場合は、要素自身の大きさに対するパーセンテージ となる。なお、translate 関数には translateX、translateY、translateZ、translate3d という兄弟が存在する。

ul/li 要素で細い罫線の枡目

追加:2023/12/31

ul/li 要素で表を作成し、しかもその内側の罫線を細く表示する、というお題(下の表)で CSS を考えてみた。

  • ul 要素に対して 左右の margin を auto、padding は 0、マーカー無し、flexbox 適用(改行可)
  • li 要素に対して padding が 0、太さ 1 px の黒の実線で border、おまじないの box-sizing: border-box

まではすぐにわかった。しかしそのままでは内側の罫線が太くなってしまう。その対策は......

1列目と2列目の li 要素の border-right を対象にするセレクタは ~:nth-of-type(3n+○)であろう。

問題は3番目の li 要素までを対象とするセレクタである。:nth-of-type の引数をどう記述したら良いのだろうか? 思い浮かばなかったのでネット検索したら、なんと「(-n+3)」が答えであった。こんな指定の仕方があったとは......3番目以降ならば (n+3) だから、その逆という訳か(^^;;;

● CSS
  • UL.thin-rules {list-style-type: none; width: 80%; height: 150px; margin: 20px auto; padding: 0; display: flex; flex-wrap: wrap; background-color: beige;}
  • .thin-rules > li {padding: 0; width: calc(100% / 3); border: black solid 1px; box-sizing: border-box;}
  • .thin-rules > li:nth-of-type(-n+3) {border-bottom: none;}
  • .thin-rules > li:nth-of-type(3n+1), .thin-rules > li:nth-of-type(3n+2) {border-right: none;}

hover すると沈むハイパーリンク・ボタン

追加:2023/12/15

ボタンの上にマウスカーソルを hover するとそのボタンが沈み込むようにするにはどうしたらよいか?、という質問が某 Q&A サイトに投稿されたので調べてみた(私が食事をしたり少し調べている間になぜか質問が削除されてしまった)。

ボタンはおそらくハイパーリンクの a 要素を display: block でボタン化したものであろう。ボタン化することにより、文字のない padding 領域をクリックしてもハイパーリンクが機能するようになる。「hover すると」は「:hover」疑似クラスの利用であろう。そこまではすぐにわかったが、どうやったらボタンが沈むのか?

ネット検索した結果、タネ明かしは

  • box-shadow プロパティによる影
  • transition プロパティによる遅延
  • transform: translate3d(~) プロパティによる変形

の利用であった。解説したサイト(複数)では影の色は常識的に「#000(black)」であったが、私は「transparent(透明)」に変えてみた。

● CSS
  • UL.portal {padding: 0; width: 90%; margin: 10px auto; display: flex; justify-content: center; gap: 4px;}
  • .portal>li {padding: 0; margin: 0; display: inline-block; flex: 1; height: 80px; border-radius: 8px; box-shadow: 0 5px 0 transparent; transition: 0.5s; display: flex; justify-content: center; align-items: center;}
  • .portal>li a {display: block; color: white; text-decoration: none;}
  • .portal>li:hover {transform: translate3d(0, 5px, 0); box-shadow: none;}
  • .portal>li:first-of-type {background-color: orange;}
  • .portal>li:last-of-type {background-color: blue;}
● HTML
  • <ul class="portal">
    <li><a href="https://www.yahoo.co.jp/">Yahoo!</a></li>
    <li><a href="https://www.google.co.jp/">Google</a></li>
  • </ul>

counter-increment プロパティの利用

ol/li 要素での番号付リストの場合、text-align: center でセンタリングすると、マーカーとの間に異様な隙間ができてしまう。ul/li 要素での番号なしリストでも同じである。

  1. テキストテキストテキスト
  2. テキストテキストテキストテキストテキスト

counter-increment プロパティを使うとその問題を解決できる。数字の前や後ろに文字を付加することも出来る。

ポイントは、

  1. 準備として li 要素のマーカーを消し、幅(width)を fit-content にしておく。
  2. counter-increment と counter 関数の値に共通の適当な名前を付ける。ここでは「eel」にしたが、全角文字でも構わない。
  3. 疑似要素「::before」を利用し、content プロパティの値である counter 関数の前後にダブルクォテーションで括って付加したい文字列を指定する。
● CSS
  • ol.auto-count {padding-left: 1em;}
  • .auto-count li {list-style-type: none; width: fit-content;
    margin: 2px auto; counter-increment: eel;}
  • .auto-count li::before {content: "No."counter(eel)": ";}
● HTML
  • <ol class="auto-count">
    <li>テキストテキストテキスト</li>
    <li>テキストテキストテキストテキストテキストテキスト</li>
    <li>テキストテキストテキストテキストテキスト</li>
  • </ol>
結果
  1. テキストテキストテキスト
  2. テキストテキストテキストテキストテキストテキスト
  3. テキストテキストテキストテキストテキスト

複合 counter-increment プロパティ

追加:2023/10/16

目次での利用を想定して counter-increment プロパティを複合して使えないかと考えた。ネットを検索して二重利用は見つけたが、外側の ol 要素の値を継承して1番目の値とする用法は見つけられなかった。そこでごちゃごちゃやっていたら......成功してしまった(^^;;;

ポイントは、

  1. 外側のol 要素に対しては、counter-increment プロパティと counter 関数、::before 擬似要素で連番を作成する(「counter-increment プロパティの利用」参照)。
  2. 内側の ol 要素に対して counter-increment プロパティを2つ定義、1つ目の値を外側のと同値+「0」(数字のゼロ)にする。
  3. 内側 ol 要素の li::before に対して、「-」を挟んで counter 関数を2つ使用する。
● CSS
  • ol.my-count {padding-left: 1em;}
  • .my-count>li {list-style-type: none; counter-increment: bee;}
  • .my-count>li::before {content: counter(bee)".";}
  • ol.my-count2 li {list-style-type: none; counter-increment: bee 0; counter-increment: snake;}
  • .my-count2 li::before {content: counter(bee)"-"counter(snake)". ";}
● HTML
  • <ol class="my-count">
    <li>章題</li>
    <li>章題
    • <ol class="my-count2">
      <li>節題</li>
      <li>節題</li>
    • </ol>
    </li>

  • <li>章題</li>
  • </ol>
結果
  1. 章題
  2. 章題
    1. 節題
    2. 節題
  3. 章題
  • 結果の表示に関しては、スマホでの表示スペースの都合で counter-increment に関係ないレイアウト系 CSS を追加した。

table 要素の列固定

追加:2023/02/24

表を作成しているときに、セルの横幅の合計が、main 要素の横幅よりも大きくなってしまった!なんて時に、昔は JavaScript を使っていたそうである。しかし、position: sticky というへんてこりんな宣言(プロパティ+値)が使えるようになったおかげで、私にも列固定ができるようになった。

なお、この宣言を使った場合、left: 0 も指定しないと、縦スクロールに追随してくれないので注意。

1列目 4列目
1列目 4列目
● CSS
  • DIV.container {width: calc(90% - 20px); overflow: auto; margin: 10px auto;}
  • TABLE.fixed-column {border-collapse: collapse; width: 645px;}
  • .fixed-column TD {width: 160px; border: black solid 1px; height: 50px;}
  • .fixed-column TD:first-child {background-color: khaki; color: black; position: sticky; left: 0;}
  • .fixed-column TD:first-child::before {
    content: ""; position: absolute; top: -1px; left: -1px; width: 100%; height: 100%; border: 1px solid black;}
● HTML
  • <div class="container">
  • <table class="fixed-column">
  • <tr>
    <td>1列目</td><td></td><td></td><td>4列目</td>
  • </tr>
  • <tr>
    <td>1列目</td><td></td><td></td><td>4列目</td>
  • </tr>
  • </table>
  • </div>
  • CSS の最後にある疑似要素 ~::before 以下が無くても列固定としては動作するが、これを付けないと、左罫線がチラチラすることを教えてくれたサイトがあった。