odecember1205
@odecember1205

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

HTMLとCSSでレスポンシブに対応したデザインを作っております

解決したいこと

現在、 HTMLとCSSでレスポンシブに対応したデザインを制作中です。
様々なインターネット記事や書籍を拝見しましたが、いまいち理解できず困っております。
具体的には、
以下の画像のようなスマホ表示版にすると、ハンバーガーメニューを表示してくれる方法にしたいです。
PCやタブレット版は下記のHTMLとCSSをそのままコピーしたものでいきます。
ハンバーガーのマークをクリックすると、メニューとリンクが縦に表示され、文字も改行されない仕様にしたいです。

スクリーンショット 2022-10-21 10.55.34.png

例)
Ruby on RailsでQiitaのようなWebアプリをつくっています。
記事を投稿する機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

出ているエラーメッセージを入力

該当するソースコード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>メニュー</title>
</head>
<body style="background-color:#f5f5f5 ;">
    <div class="page">
        <div class="header">
            <b>タイトル</b>
        </div>
    </div>
    <div class="container">
        <div class="menu">
            <div class="menuFarme">
            <ol>
                <li>メニュー1
                  <ol>
                    <li>
                        <a href="##">リンク1</a>
                    </li>
                    <li>
                        <a href="##">リンク2</a>
                    </li>
                    <li>
                        <a href="##">リンク3</a>
                    </li>
                    <li>
                        <a href="##">リンク4</a>
                    </li>
                  </ol>
                </li>


                <li>メニュー2
                <ol>
                    <li>
                        <a href="##">リンク1</a>
                    </li>
                    <li>
                        <a href="##">リンク2</a>
                    </li>
                    <li>
                        <a href="##">リンク3</a>
                    </li>
                </ol>
                </div>     
                </div>
        <div class="text">  
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
         </div>
        
      </div>
    
</body>
</html>

例)

.page{
    font-size: 20px;
}
.header{
    color: white;
    background-color: #4682b4;
    padding: 8px;
}

.container {
  color: black;
	line-height: 1.4em;
	display: table;
	margin: 0px;
	padding: 0px;
	width: 100%;
  }
  .menu {
    display: table-cell;
    width: 20%;
    padding: 0px;
    vertical-align: top; 
  }
  div.menu>.menuFrame>ol>li {
		font-weight: bold;
	}
  .menuFrame {
		background-color: #87cefa;
		padding: 0;
		margin: 0;
	}
  .text {
	display: table-cell;
	padding: 5px;
  }
  
  ol {
      counter-reset: item;
      margin-block-start: 0;
      margin-left: 5px;
      padding-left: 10px;
      padding-right: 10px;
      padding-top: 5px;
      padding-bottom: 5px;
      background-color: #87cefa;
    }
  
    div.menu>ol>li {
      font-weight: bold;
    }
 
  li{ 
     display: block;
     padding-bottom:10px;
     font-weight: normal;
     
  }
  li:before { 
    content: counters(item, ".") " "; counter-increment: item 
  }
  a{
    text-decoration: none;
    color: black;
    font-weight: normal;
    
  }
  ol li a:hover{
    color:#ff0000; 
    font-size: 25px;
  }

  .text{
     padding-left: 50px;
     font-family: sans-serif;
  }

  .text p{
    font-family: serif;
    font-size: 20px;
    line-height: 35px; /*行の高さを指定する*/
    text-indent: 1em;
  }
  h2{
    text-indent: 2em;
  }
  .red{
    color: #ff0000;
  }

  .line{
    font-size: 20px;
    font-family: serif;
    padding-left: 30px;
    padding-right: 10px;
    padding-top: 10px;
    padding-bottom: 10px;
    padding-left: 20px;
    line-height: 2;
  }
  
 

どなたかわかる方がいましたら、ソースコードを教えていただけますか。
よろしくお願い致します

0

8Answer

以前の質問でメディアクエリについての回答があったかと思うのですが、メディアクエリは試されましたでしょうか?

0Like

Comments

  1. @odecember1205

    Questioner

    そうですね。
    参考URLをクリックして拝見しましたが、いまいちよく分からないです。

    スマホ用のCSSとパソコン用CSS別々に用意するのですか。
    それとも、一つのStyle.cssでメディアクエリを書くのですか
  2. 1つのStyle.cssに記述していく形で実装可能です。
    (管理のしやすさからファイルを分けてもOKです。)

    @scripcryptorさんが返信に記載してある通り、メディアクエリでスマホ画面の時にだけ当てたいスタイルを記載すれば実装できると思います。

実際の例があった方がわかりやすいと思うので、簡単な例を作ってみました。
ご参考までに:qiitan:

レスポンシブ.gif

0Like

Comments

  1. @odecember1205

    Questioner

    ありがとうございます。
    HTMLはviewport以外追加するコードは特にないですか。
    CSSだけで実装は可能ですか
  2. >HTMLはviewport以外追加するコードは特にないですか。

    スマホ用にハンバーガーメニューのアイコンを表示したいと思うので、その要素はHTMLに追加してあげた方がいいと思います。

    >CSSだけで実装は可能ですか
    可能だと思います。
    CSSだけでハンバーガーメニューを実装する方法など調べたらいろいろ出てくるので、参考になるサイトはいろいろあると思います。

    要件によってはクリックイベントなどを活用したほうがよく、JavaScriptでの実装したほうがいい場合もあるかもしれません。

    実装頑張ってみてください!

頂いたURLとこちらのサイトを参考にして作ってみました。
http://weboook.blog22.fc2.com/blog-entry-396.html

しかし、そもそも3本線(toggle)が表示されないです。
恐らく、menuとmenuFrameがごちゃごちゃになっているかもしれません。
何か不備な箇所がございましたら教えていただきたいです。

該当するソースコード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>メニュー</title>
</head>
<body style="background-color:#f5f5f5 ;">
    <div class="page">
        <div class="header">
            <b>タイトル</b>
        </div>
    </div>
    <div class="container">
        <div class="menu">
            <div class="toggle"><a href="#">menu</a></div>
            <div class="menuFarme">
            <ol>
                <li>メニュー1
                  <ol>
                    <li>
                        <a href="##">リンク1</a>
                    </li>
                    <li>
                        <a href="##">リンク2</a>
                    </li>
                    <li>
                        <a href="##">リンク3</a>
                    </li>
                    <li>
                        <a href="##">リンク4</a>
                    </li>
                  </ol>
                </li>


                <li>メニュー2
                <ol>
                    <li>
                        <a href="##">リンク1</a>
                    </li>
                    <li>
                        <a href="##">リンク2</a>
                    </li>
                    <li>
                        <a href="##">リンク3</a>
                    </li>
                </ol>
                </div>     
                </div>
        <div class="text">  
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
            <p>ダミーテキスト</p>
         </div>
        
      </div>
    
</body>
</html>

該当するソースコード

.page{
    font-size: 20px;
}
.header{
    color: white;
    background-color: #4682b4;
    padding: 8px;
}

.container {
  color: black;
	line-height: 1.4em;
	display: table;
	margin: 0px;
	padding: 0px;
	width: 100%;
  }
  .menu {
    display: table-cell;
    width: 20%;
    padding: 0px;
    vertical-align: top; 
  }
  div.menu>.menuFrame>ol>li {
		font-weight: bold;
	}
  .menuFrame  {
		background-color: #87cefa;
		padding: 0;
		margin: 0;
	}
  .text {
	display: table-cell;
	padding: 5px;
  }
  
  ol {
      counter-reset: item;
      margin-block-start: 0;
      margin-left: 5px;
      padding-left: 10px;
      padding-right: 10px;
      padding-top: 5px;
      padding-bottom: 5px;
      background-color: #87cefa;
    }
  
    div.menu>ol>li {
      font-weight: bold;
    }
 
  li{ 
     display: block;
     padding-bottom:10px;
     font-weight: normal;
     
  }
  li:before { 
    content: counters(item, ".") " "; counter-increment: item 
  }
  a{
    text-decoration: none;
    color: black;
    font-weight: normal;
    
  }
  ol li a:hover{
    color:#ff0000; 
    font-size: 25px;
  }

  .text{
     padding-left: 50px;
     font-family: sans-serif;
  }

  .text p{
    font-family: serif;
    font-size: 20px;
    line-height: 35px; /*行の高さを指定する*/
    text-indent: 1em;
  }
  h2{
    text-indent: 2em;
  }
  .red{
    color: #ff0000;
  }

  .line{
    font-size: 20px;
    font-family: serif;
    padding-left: 30px;
    padding-right: 10px;
    padding-top: 10px;
    padding-bottom: 10px;
    padding-left: 20px;
    line-height: 2;
  }
  
  /* .menu{
    float:left;
    width: 30%;
    margin: 0;
    padding: 0;
  }
  .menu li{
    margin: 0;
    padding: 8px 5px 5px;
    background-color: #8d990f;
    color: #fff;
    font-size: 12px;
    text-align: center;
  }
  .menuFrame li:nth-of-type(1){background-color: #8d990f;}
  .menuFrame li:nth-of-type(2){background-color: #99820f;}
  .menuFrame li:nth-of-type(3){background-color: #995f0f;}
  .menuFrame ol{
    list-style: none;
    margin: 0;
    padding: 0;
    background-color: #fff;
    border-left: 5px solid #8d990f;
  }

  .menuFrame ol:nth-of-type(1){background-color: #8d990f;}
  .menuFrame ol:nth-of-type(2){background-color: #99820f;}
  .menuFrame ol:nth-of-type(3){background-color: #995f0f;}
  
  .menu ol li{
    width: 100%;
    margin: 0;
    padding: 0;
  }
  .menu ol li a{
    display: block;
    margin: 0;
    padding: 8px 10px;
    color: #333;
    font-size: 12px;
    text-align: left;
    text-decoration: none;
  }

  .menu li a:hover{background-color: #eee;}
  .toggle{display: none;} */
  
  @media only screen and(max-width:1023px){
    .menu{
      float:none;
      width: 100%;
      background-color: #ebe7d2;
    }
    .menuFrame{display: none; position: relative;}
    .menuFrame:after{
      position: absolute;
      content: "";
      bottom: 0;
      left: 0;
      width: 100%;
      height: 1px;
      background-color: #d6cea3;
    }
    .menu li{
      clear: both;
      position: relative;
      z-index: 9999;
    }
    .menu ol{
      margin-bottom: -1px;
      border-left-width: 3px ;
      border-right-width: 3px ;
      border-right-style: solid ;
      background-color: #ebe7d2;
    }
    .menu ol:before,
    .menu ol:after{
      content: "";
      display: table;
    }
    .menu ol:after{clear: both;}
    .menu ol{*zoom: 1;}

    .menu ol li{
      float: left;
      width: 25%;
      border-right: 1px solid #d6cea3 ;
      border-bottom: 1px solid #d6cea3;
    }
    .menu ol li:nth-last-of-type(4n){border-right: 0;}
    .menu ol li a{
      text-align: center;
      padding: 12px 0px;
    }
    .menu ol li a:hover{ background-color: #f5f4ea;}

    #toggle{
      display: block;
      position: relative;
      width: 100%;
      background: #222;
    }
    #toggle a{
      display: block;
      position: relative;
      padding: 15px 0 10px;
      color: #fff;
      text-align: center;
      text-decoration: none;
    }
    #toggle:before{
      display: block;
      content: "";
      position: absolute;
      top: 50%;
      left: 10px;
      width: 20px;
      height: 20px;
      margin-top: -10px;
      background: #fff;
    }
    #toggle a:before, #toggle a:after{
      display: block;
      content: "";
      position: absolute;
      top: 50%;
      left: 10px;
      width: 20px;
      height: 4px;
      background: #222;
    }
    #toggle a:before{
      margin-top: -6px;
    }
    #toggle a:after{
      margin-top: 2px;
    }
  }
0Like

そもそも3本線(toggle)が表示されないです。

まず、andの後ろに半角スペースがなく、スタイルが正しく反映されない状態となっていると思います。

-  @media only screen and(max-width:1023px){
+  @media only screen and (max-width:1023px){

また、htmlではtoggleがclass指定されていますが、cssではidセレクタで指定されています。
html側でid=toggleとするか、css側で.toggleとすれば反映されると思います。



また、余談でハンバーガーメニューのアイコン部分についてですが、現状参考サイトをもとにbefore・afterの疑似要素を使い、白の正方形に黒の長方形を挟み込む形で表現していると思います。
「google material icon」などでハンバーガーメニューのアイコンは用意されているので、そういったものを活用するのがいいのではないかなと個人的に思います。
そのほか、単純に背景透過の画像などもありだと思います。

クリック時に三本線からバツ印にアニメーションするためなどの意図があれば、今のような実装でも構わないと思います!

0Like

ご回答ありがとうございます。
確かに、画面を小さくすると画像のように変更しました。
しかし、リンク画面が一切表示されません。
また、toggleボタンも押下出来ない状態です。
何か不備がありましたら、教えていただきたいです

スクリーンショット 2022-10-23 9.43.32.png

0Like

何か不備がありましたら、教えていただきたいです

すみません、どう変更を加えたのかがわからないので何が原因かはわからないです。
最新のソースやどこを変えたかなど提示していただければありがたいです。

0Like
.page{
    font-size: 20px;
}
.header{
    color: white;
    background-color: #4682b4;
    padding: 8px;
}

.container {
  color: black;
	line-height: 1.4em;
	display: table;
	margin: 0px;
	padding: 0px;
	width: 100%;
  }
  .menu {
    display: table-cell;
    width: 27%;
    padding: 0px;
    vertical-align: top; 
  }
  div.menu>.menuFrame>ol>li {
		font-weight: bold;
	}
  .menuFrame  {
		background-color: #87cefa;
		padding: 0;
		margin: 0;
	}
  .text {
	display: table-cell;
	padding: 5px;
  }
  
  ol {
      counter-reset: item;
      margin-block-start: 0;
      margin-left: 5px;
      padding-left: 10px;
      padding-right: 5px;
      padding-top: 5px;
      padding-bottom: 5px;
      background-color: #87cefa;
    }
  
    div.menu>ol>li {
      font-weight: bold;
    }
 
  li{ 
     display: block;
     padding-bottom:10px;
     font-weight: normal;
     font-family: serif;
     font-size: 20px;
      padding-right: 5px;
      line-height:35px;

     
  }
  li:before { 
    content: counters(item, ".") " "; counter-increment: item 
  }
  a{
    text-decoration: none;
    color: black;
    font-weight: normal;
    
  }
  ol li a:hover{
    color:#ff0000; 
    font-size: 25px;
  }

  .text{
     padding-left: 50px;
     font-family: sans-serif;
  }

  .text p{
    font-family: serif;
    font-size: 20px;
    line-height: 35px; /*行の高さを指定する*/
    text-indent: 1em;
  }
  h2{
    text-indent: 2em;
  }
  .red{
    color: #ff0000;
  }

  .line{
    font-size: 20px;
    font-family: serif;
    padding-left: 30px;
    padding-right: 10px;
    padding-top: 10px;
    padding-bottom: 10px;
    padding-left: 20px;
    line-height: 2;
  }
  
  @media only screen and (max-width:1023px){
    .menu{
      float:none;
      width: 100%;
      background-color: #ebe7d2;
    }
    .menuFrame{display: none; position: relative;}
    .menuFrame:after{
      position: absolute;
      content: "";
      bottom: 0;
      left: 0;
      width: 100%;
      height: 1px;
      background-color: #d6cea3;
    }
    .menu li{
      clear: both;
      position: relative;
      z-index: 9999;
    }
    .menu ol{
      margin-bottom: -1px;
      border-left-width: 3px ;
      border-right-width: 3px ;
      border-right-style: solid ;
      background-color: #ebe7d2;
    }
    .menu ol:before,
    .menu ol:after{
      content: "";
      display: table;
    }
    .menu ol:after{clear: both;}
    .menu ol{*zoom: 1;}

    .menu ol li{
      float: left;
      width: 25%;
      border-right: 1px solid #d6cea3 ;
      border-bottom: 1px solid #d6cea3;
    }
    .menu ol li:nth-last-of-type(4n){border-right: 0;}
    .menu ol li a{
      text-align: center;
      padding: 12px 0px;
    }
    .menu ol li a:hover{ background-color: #f5f4ea;}

    .toggle{
      display: block;
      position: relative;
      width: 100%;
      background: #222;
    }
    .toggle a{
      display: block;
      position: relative;
      padding: 15px 0 10px;
      color: #fff;
      text-align: center;
      text-decoration: none;
    }
    .toggle:before{
      display: block;
      content: "";
      position: absolute;
      top: 50%;
      left: 10px;
      width: 20px;
      height: 20px;
      margin-top: -10px;
      background: #fff;
    }
    .toggle a:before, #toggle a:after{
      display: block;
      content: "";
      position: absolute;
      top: 50%;
      left: 10px;
      width: 20px;
      height: 4px;
      background: #222;
    }
    .toggle a:before{
      margin-top: -6px;
    }
    .toggle a:after{
      margin-top: 2px;
    }
  }
 

申し訳ございません。こちらになります。 HTMLは変更なしです

0Like

リンク画面が一切表示されません。

以前のHTMLと先ほどいただいたCSSをそのままコピペしてみましたが、
私のほうではリンク画面は表示されたままでした。
デベロッパーツールで要素に適用されているスタイルなどを確認すれば、表示されない原因がわかると思います。

toggleボタンも押下出来ない状態です。

以前記載のあった、質問者様が参考にしていたサイトではJavaScript側のクリックイベントでメニューの開閉を制御していました。
JavaScriptの実装がまだなのであれば、参考サイトの「jQuery」の欄を参考に実装してみてください。

0Like

Your answer might help someone💌