sikaku

1要素のHTMLとCSSだけでチョコレートを作ってみた

バレンタインデーまで残り300日程ですね。そろそろチョコレートの素材が欲しくなるころではないでしょうか。

という雑な理由付けはさておきHTML1要素とCSSのみで表示できるチョコレートを作ってみたのでおいておきます。

source code

基本

demo
text
HTML
  1. <span class="choco">text</span>
CSS
  1. @import url(https://fonts.googleapis.com/css?family=Lobster);
  2. .choco {/* 要素自体の設定 */
  3. box-sizing: border-box;
  4. position: relative;
  5. z-index: 0;
  6. display: inline-flex;
  7. justify-content: center;
  8. align-items: center;
  9. min-width: 100px;
  10. min-height: 56px;
  11. border-radius: 4px;
  12. border: solid 8px;
  13. border-color: #804535 #3c1a11 #2c100a #6a3b2b;
  14. background-color: #6f3c2f;
  15. color: #6a3a2d;
  16. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(0,0,0,0.4);
  17. box-shadow: -1px 4px 8px rgba(0,0,0,0.3);
  18. font-family: 'Lobster', serif;
  19. font-size: 20px;
  20. line-height: 1;
  21. }
  22. .choco::before ,
  23. .choco::after {/* 擬似要素共通設定 */
  24. content: '';
  25. position: absolute;
  26. top: 0; right: 0; bottom: 0; left: 0;
  27. display: block;
  28. border-style: solid;
  29. pointer-events: none;
  30. }
  31. .choco::before {/* before(擬似要素) */
  32. z-index: 1;
  33. border-width: 6px;
  34. border-color: #291617 #662e1f #99604c #65413b;
  35. color: rgba(0,0,0,0.2);
  36. box-shadow: 4px 4px 4px inset;
  37. }
  38. .choco::after {/* after(擬似要素) */
  39. z-index: 2;
  40. margin: -3px;
  41. border-radius: 4px;
  42. border-width: 5px;
  43. border-color: #985d4d #885041 #885041 #985d4d;
  44. color: rgba(255,255,255,0.3);
  45. box-shadow: -1px -1px 1.4px,-1px -1px 1.4px inset;
  46. }

何をやっているのか

demo

text

before elment after

擬似要素のbefore,afterを使って立体的にしています。

demo内ボタンクリックでそれぞれ分離できるようにしたので個別にどんな表示か確かめたい人はそちらから。

各部品役割
  • elemnt(要素自体)
    :
    • borderで外側法面描画
    • background-colorでベース色描画
    • box-shadowで全体の影描画
    • あと文字の表示領域担当
  • before(擬似要素)
    :
    • borderで内側法面描画
    • box-shadowでくぼみ部分にかかる影を描画
  • after(擬似要素)
    :
    • borderで最上面描画
    • box-shadowでハイライト描画

他諸々。表示ソースの背景色でそれぞれ分けておいたので後は読み取ってください。

チョコレートで法面ってなんだと思いつつも他にどう呼べばいいのかわからない。

編集

いっぱい並べる

<span class="choco">text</span>の記述数だけチョコレートも増えます。好きなだけ並べてください。

ただ、一ヶ所にまとめて並べる場合は下記を採用した方が無駄がなくてよいと思います。

demo
text text text text text text text text text text text text
html
  1. <div class="chocoBOX">
  2. <span>text</span>
  3. <span>text</span>
  4. <span>text</span>
  5. <span>text</span>
  6. <span>text</span>
  7. <span>text</span>
  8. <span>text</span>
  9. <span>text</span>
  10. <span>text</span>
  11. <span>text</span>
  12. <span>text</span>
  13. <span>text</span>
  14. </div>
css
  1. @import url(https://fonts.googleapis.com/css?family=Lobster);
  2. .chocoBOX {/* 大枠 */
  3. display: grid;
  4. grid-template-columns: repeat(auto-fit,minmax(100px,1fr));
  5. }
  6. .chocoBOX > * {/* 要素自体の設定 */
  7. box-sizing: border-box;
  8. position: relative;
  9. z-index: 0;
  10. display: flex;
  11. justify-content: center;
  12. align-items: center;
  13. min-height: 56px;
  14. border-radius: 4px;
  15. border: solid 8px;
  16. border-color: #804535 #3c1a11 #2c100a #6a3b2b;
  17. background-color: #6f3c2f;
  18. color: #6a3a2d;
  19. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(0,0,0,0.4);
  20. box-shadow: -1px 4px 8px rgba(0,0,0,0.3);
  21. font-family: 'Lobster', serif;
  22. font-size: 20px;
  23. line-height: 1;
  24. }
  25. .chocoBOX > *::before ,
  26. .chocoBOX > *::after {/* 擬似要素共通設定 */
  27. content: '';
  28. position: absolute;
  29. top: 0; right: 0; bottom: 0; left: 0;
  30. display: block;
  31. border-style: solid;
  32. pointer-events: none;
  33. }
  34. .chocoBOX > *::before {/* before(擬似要素) */
  35. z-index: 1;
  36. border-width: 6px;
  37. border-color: #291617 #662e1f #99604c #65413b;
  38. color: rgba(0,0,0,0.2);
  39. box-shadow: 4px 4px 4px inset;
  40. }
  41. .chocoBOX > *::after {/* after(擬似要素) */
  42. z-index: 2;
  43. margin: -3px;
  44. border-radius: 4px;
  45. border-width: 5px;
  46. border-color: #985d4d #885041 #885041 #985d4d;
  47. color: rgba(255,255,255,0.3);
  48. box-shadow: -1px -1px 1.4px,-1px -1px 1.4px inset;
  49. }

その他編集

傾ける
demo
text text text text text text text text

一部傾けると砕いた感を出せるかもしれません。

追加CSS
  1. .crack1 {
  2. z-index:1;
  3. transform: rotate(-12deg);
  4. }
  5. .crack2 {
  6. z-index:1;
  7. transform: rotate(30deg);
  8. }
  • 傾けたいチョコレート一片にcrack1crack2どちらかのクラス付与
    例:<span class="choco crack1">text</span>
リンク化

span要素の代わりにa要素を使用するだけでOKです。

CSSの追加記述をするなら、a要素デフォルト装飾の文字下線の消去をしたり、クリック時動きをつけてみたり色々遊んでください。

おすすめ追加CSS
  1. a.choco {
  2. text-decoration: none;
  3. }
  4. a.choco:active {
  5. top: -2px;
  6. z-index: 2;
  7. transform: rotate(-30deg);
  8. }

味変え

text text text text text text text text

CSSでの単純な描画なので、色を変えればチョコレートの味変えも簡単にできます。

一部のチョコだけ変えるか全部のチョコを変えるかで編集方法が異なるので、お好みの方法を採用してください。

一部のみ変更
  • 後述色変え追加CSSをCSS末尾に追加
  • 色変えしたいチョコレート用の要素にtaste1クラス追加
    例1:<span class="choco taste1">text</span>
    例2:<span class="taste1">text</span>
全部変更
  • 後述色変え追加CSSの、同内容を指すセレクタボックス内のプロパティの値のみ書き換え
上記が良く分からない場合
  • 後述色変え追加CSS.taste1部分を.choco(いっぱい並べるverだと.chocoBOX > *)に変更後CSS末尾に追加

色変え追加CSS

CSS
  1. .taste1 {/* 要素自体 */
  2. border-color: #f59a92 #e95760 #e1495e #f28986;/* 外側法面( 上右下左 ) */
  3. background-color: #ee7f85;/* ベース背景 */
  4. color: #ea7c80;/* 文字色 */
  5. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(120,0,0,0.3);/* 文字影( ハイライト 影 ) */
  6. }
  7. .taste1::before {/* before(擬似要素) */
  8. border-color: #dc455a #f28986 #f59a92 #e95760;/* 内側法面( 上右下左 ) */
  9. color: rgba(255,0,0,0.2);/* くぼみ部分にかかる影の色 */
  10. }
  11. .taste1::after {/* after(擬似要素) */
  12. border-color: #f7afa1 #f59a92 #f59a92 #f7afa1;/* 最上面( 上右下左 ) */
  13. color: rgba(255,255,255,0.3);/* ハイライトの色 */
  14. }

配色等簡易変更ツール

demo
text

入力で上記色変え追加CSSが書き換わります。

セレクター
ベース
外側法面
内側法面
最上面
明暗

▽立体

▽文字

色変えサンプルコード

  • default
    text
    CSS
    1. .default {
    2. border-color: #804535 #3c1a11 #2c100a #6a3b2b;
    3. background-color: #6f3c2f;
    4. color: #6a3a2d;
    5. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(0,0,0,0.4);
    6. }
    7. .default::before {
    8. border-color: #291617 #662e1f #99604c #65413b;
    9. color: rgba(0,0,0,0.2);
    10. }
    11. .default::after {
    12. border-color: #985d4d #885041 #885041 #985d4d;
    13. color: rgba(255,255,255,0.3);
    14. }
  • bitter
    text
    CSS
    1. .bitter {
    2. border-color: #977770 #431e15 #291811 #5f3d34;
    3. background-color: #5f3831;
    4. color: #5d3730;
    5. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(0,0,0,0.4);
    6. }
    7. .bitter::before {
    8. border-color: #3f2526 #6a453 #8d665f #5f321c;
    9. color: rgba(0,0,0,0.2);
    10. }
    11. .bitter::after {
    12. border-color: #8d665f;
    13. color: rgba(255,255,255,0.3);
    14. }
  • milk
    text
    CSS
    1. .milk {
    2. border-color: #cc8b60 #834126 #b3674c #b97e54;
    3. background-color: #bc733f;
    4. color: #ba703e;
    5. text-shadow: 0 1px rgba(255,255,255,0.3), 0 -1px rgba(0,0,0,0.4);
    6. }
    7. .milk::before {
    8. border-color: #b3674c #b97e54 #cc8b60 #834126;
    9. color: rgba(0,0,0,0.2);
    10. }
    11. .milk::after {
    12. border-color: #b97e54;
    13. color: rgba(255,255,255,0.3);
    14. }