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!

メニュー画面のインターフェイスを変更したいです

解決したいこと

メニューバーを以下のように変更したいです。

① メニューのリンクをクリック後リンクに色を付けたいです。
② 下にスクロールしてもメニューは常に固定されたいです。

該当するソースコード

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name=”viewport” content=”width=device-width,initial-scale=1″>
    <link rel="stylesheet" href="style.css">
    <title>タイトル</title>
</head>

<body>
    <div class="header">
        <h1>タイトル</h1>
    </div>

        <div class="menu">
            <ul id="list">
                <li>
                    <p class="title">メニュー</p>
                </li>
                <li>
                    <a href="page0.html">リンク1</a>
                </li>
                <li>
                    <a href="##">1. リンク</a>
                    <ul>
                        <li><a href="page1.1.html">1.1 リンク</a></li>
                        <li><a href="page1.2.html">1.2 リンク</a></li>
                            <ul>
                                <li><a href="page1.2.1.html">1.2.1 リンク</a></li>
                                <li><a href="page1.2.2.html">1.2.2 リンク</a></li>
                            </ul>
                    </ul>
                </li>
                <li>
                    <a href="page2.html">2. メニュー</a>
                </li>
                
        </div>        
    </div>

   
        <div class="contents">
           <p>コンテンツ</p>
               

        </div>

        
        <div class="area">
            <a class="button1" href="page3.3.1.html">前へ</a>
            <a class="button2" href="page3.3.3.html">次へ</a>
          </div>
    </div>    


       
    </body>
</html>

例)

*{
    margin: 0;
    padding: 0;
}

.header{
    background-color: #37538C;
    color: #ffffff;
    font-size: 10px;
    padding: 10px;
    position: fixed;
    width: 100%;
}

.menu{
	float: left;
	width: 25%;
	margin-top: 4em;
	margin-left: .5em;
}

#list{
	width: auto;
	height: auto;
	margin: 0;
	padding: 0;
	list-style-type: none;
	border: 2px solid #97C1E5;
	font-family: serif;
}
li a {
	display: block;
	padding: 4px 16px;
	text-decoration: none;
	color: #000000;
}
li:last-child {
	border-bottom: none;
}
li .title {
	color: #000000;
	background-color: #97C1E5;
    font-size: 20px;
}
li a:hover{
    
    background-color:  #eee;
}
li a:active{
    background-color: #aad8d3;
}

.menu ul li ul li a {
	padding-left: 2.5em;
	font-size: 1em;
}
.menu ul li ul ul li a {
    padding-left: 4.5em;
    font-size: 1em;
}

.after{
	clear:both;
}

.contents{
	float: left;
	width: 70%;
	margin-top:  2em;
} 

自分で試したこと

① : li a:activeにしましたが、マウスが押されている間は色が変化しますが、離した時に元に戻ります。つまり、現在どこのページを開いているのか判断するために、リンクの部分を色を付けたいです。
② : position:fixedにしましたが、コンテンツ部分の表示がおかしくなります。

よろしくお願い致します。

0

9Answer

①訪問したリンクの色を変えるには、疑似クラス:visitedで実装できます。

②menuにposition: fixed;を指定することで、スクロール時にメニューは固定されるようにはなりました。
「コンテンツ部分の表示がおかしくなる」とありますが、どうおかしいのか、どういう形が理想の形になのかの記載があると、もう少し回答者が回答しやすくなると思います。

See the Pen Untitled by yotty (@yotty) on CodePen.

1Like

ご回答ありがとうございます。
しかし、どちらの質問も解決に至りませんでした。
もう少し詳細に説明致します。

① リンクの色を変える
 スクリーンショット 2022-11-25 19.27.40.png

マウスを押している間は、
li a:active{
background-color: #aad8d3;
}
が効きますが、マウスから手を離すと、元に戻ります。

そこで、
li a:visited{
color: #aad8d3;
}
にすると、以下のようになってしまいます。

スクリーンショット 2022-11-25 19.30.35.png

やりたいことは、リンクをクリック後真っ白ではなく、色をつけて現在いる場所を分るようにしたいです。


menu{
position:fixed;
}
にしますと、
スクリーンショット 2022-11-25 19.33.00.png

となり、コンテンツと重なってしまいます。

これを重ならなように表示させ、コンテンツが下の方になってもメニューは固定されて表示されたいです。
headerと同じです。

ソースコードは先程お渡ししたものと同じです。
コンテンツの部分は以下のようにしました。

        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
        <p class="sentence">テキスト</p>
    </div>

よろしくお願い致します。

0Like

①訪問したかどうかではなく、現在いるページのメニューの色を変えたいのであればこちらのサイトのやり方が参考になると思います。

ページごとにクラス指定を変えたり、JavaScriptで実装したりいろいろ方法はあると思います。

②常に左側にメニューを表示して重ならないようにしたいのであれば、余白を利用するかダミーの要素を置くなどして重ならないようにするのはいかがでしょうか?

See the Pen Untitled by yotty (@yotty) on CodePen.

0Like

①に関してご質問です。
JavaScriptを使って実装してみましたが、変化は見られませんでした。
やりたいことは、マウスがリンクに乗っかった時は、#eeeの色で、
リンクをクリックすると、#97C1E5の色に変更できるようにしたいです。
現在いるページを分るためにです。
どこが間違っているか教えていただきたいです。
よろしくお願い致します。

「.menu #list > ul > li > a.is-current {
background-color: #0099cc;
color: #fff;
}

このソースコードをそのままCSSで書いたやり方をしましたが、変化は見られませんでした。

該当するソースコード

<div class="menu">
            <ul id="list">
                <li>
                    <p class="title">メニュー</p>
                </li>
                <li>
                    <a href="index.html">リンク</a>
                </li>
                <li>
                    <a href="page1.html">リンク</a>
                    <ul>
                        <li><a href="page1.1.html">1.1 リンク</a></li>
                        <li><a href="page1.2.html">1.2 リンク</a></li>
                            <ul>
                                <li><a href="page1.2.1.html">1.2.1 リンク</a></li>
                                <li><a href="page1.2.2.html">1.2.2 リンク</a></li>
                            </ul>
                    </ul>
                </li>
          </ul>
      </div>


     <script>
        $(function(){
            $("ul #list li").click(function(){
                $("ul #list li.selected").removeClass("selected");
                $(this).addClass("selected");
            });
        });
     </script>
   </body>
</html>

該当するソースコード

li a {
	display: block;
	padding: 4px 16px;
	text-decoration: none;
	color: #000000;
}

li .title {
	color: #000000;
	background-color: #97C1E5;
    font-size: 20px;
}
li a:hover{
    
    background-color:  #eee;
}
.menu ul li ul li a {
	padding-left: 1.8em;
	font-size: 1em;
}
.menu ul li ul ul li a {
    padding-left: 2.8em;
    font-size: 1em;
}

ul #list li{
    background-color: #37538C;
}
ul #list li.selected{
    background-color: red;
}

0Like

クリックと同時に次のページに遷移するので、クリックイベントに色を変更したとしてもなかったことになります。
JavaScriptで色付けを行うのであれば、表示時に今どのページにいるのかを判断してメニューに色づけるというような処理が必要です。

汎用性はなくなりますが、どのページにいるのかの判断がなくても、それぞれのページで異なるコードを記述しておくことでも実装は可能かと思います。

0Like

該当するソースコード

<div class="menu">
            <ul id="list">
                <li>
                    <p class="title">メニュー</p>
                </li>
                <li class="current">
                    <a href="index.html">リンク</a>
                </li>
                <li>
                    <a href="page1.html">リンク</a>
                    <ul>
                        <li><a href="page1.1.html">1.1 リンク</a></li>
                        <li><a href="page1.2.html">1.2 リンク</a></li>
                            <ul>
                                <li><a href="page1.2.1.html">1.2.1 リンク</a></li>
                                <li><a href="page1.2.2.html">1.2.2 リンク</a></li>
                            </ul>
                    </ul>
                </li>
          </ul>
      </div>


     <script src="hoge.js"></script>
   </body>
</html>

該当するソースコード

li.current>a {
    color: #fff;
   background-color: #37538C;
  
  }
li>a:hover{
    background-color: #37538C;
    color: #fff;
}

該当するソースコード

href = location.href;

var links = document.querySelectorAll("li > a");

for (var i = 0; i < links.length; i++) {
  if (links[i].href == href) {
    document.querySelectorAll("> li")[i].classList.add("current");
  }
}

このやり方で試してみました。
確かに、currentクラスを設定したindex.htmlの部分のみクリックした時に背景色を変化することが出来ますが、私が実現したいことは「現在のページがどこなのか分るためにメニューのリンクを変えたいです」。
現在はindex.htmlのみcurrentクラスをつけていますが、これを他のliタグ全てにクラスを付与することは面倒であるため、どのようにすればクラス名付けずに実現できますか。
よろしくお願い致します。

0Like

currentクラスはJavaScript側で付与するので、htmlに記述する必要はないです。

JavaScriptのコードについてですが、現状のコードだとコンソールにエラーが出ていないでしょうか?

以下のセレクタの指定部分> liでエラーになっていると思います。

document.querySelectorAll("> li")[i].classList.add("current");

また、以下のように修正したとしても、メニューが階層構造になっていたり、リストの一番目がメニューのタイトルになっていてaタグをもっていなかったりと、まだうまく反映されないと思います。

var links = document.querySelectorAll("li > a");

for (var i = 0; i < links.length; i++) {
  if (links[i].href == href) {
    document.querySelectorAll("li")[i].classList.add("current");
    //もしくは
    document.querySelectorAll("#list > li")[i].classList.add("current");
  }
}

セレクタの内容は変えずにaタグ自身にcurrentクラスを付与したうえで、
cssも以下のような形に修正すればいったんはうまくいくと思います。

JavaScript
var links = document.querySelectorAll("li > a");

for (var i = 0; i < links.length; i++) {
  if (links[i].href == href) {
    document.querySelectorAll("li > a")[i].classList.add("current");
  }
}
CSS
#list .current {
    color: #fff;
    background-color: #37538C;
}

また余談ですが、現状jsファイルの読み込みがbodyの最後になっているのでうまくいっていますが、head内でファイル読み込みをおこなうとうまくいかなくなると思います。
jsファイルの読み込み場所によらないために、こういった処理はloadイベント内で記述しておくのが無難かと思います。

0Like

ご回答ありがとうございます。
実現できました。誠にありがとうございます。

もう1点別の質問がございます。

・レスポンシブに対応したボタンについて
    現在、画像のようにボタンを二つ配置しています。

   スクリーンショット 2022-11-29 15.19.04.png

こちらはパソコンサイズに見た場合になります。
しかし、スマホサイズに縮小すると、なぜか、文字が縦になり、「前へ」のボタンが大きくなっています。

スクリーンショット 2022-11-29 15.21.15.png

これを、スマホサイズに縮小しても文字は横で二つのボタンが同じ大きさになるようにしたいです。

該当するソースコード

<div class="area">
            <a class="button1" href="page1.html">前へ</a>
            <a class="button2" href="page1.2.html">次へ</a>
         </div>

該当するソースコード

.area{
    margin-left: 45%;

}
.button1{
    display: inline-block;
    width: 100px;
    padding: 10px;
    border-radius: 4px;
    background-color:#37538C;
    color: #fff;
    font-weight: bold;
    text-align: center;
    text-decoration: none;
    margin: 80px;
}
.button1::before{
    content: "";
    display: inline-block;
    width: 8px;
    height: 8px;
    border-top: 2px solid #fff;
    border-left: 2px solid #fff;
    transform: rotate(-45deg);
    margin-left: 5px;
    vertical-align: 1px;

}
.button2{
    display: inline-block;
    width: 100px;
    padding: 10px;
    border-radius: 4px;
    background-color:#37538C;
    color: #fff;
    font-weight: bold;
    text-align: center;
    text-decoration: none;
    margin: 100px;
}
.button2::after{
    content: "";
    display: inline-block;
    width: 8px;
    height: 8px;
    border-top: 2px solid #fff;
    border-right: 2px solid #fff;
    transform: rotate(45deg);
    margin-left: 10px;
    vertical-align: 1px;

}


@media screen and (max-width: 760px) {
.area{
        display: flex;
        margin-left: 30px;
    }
}

よろしくお願い致します。

0Like

今回はこのまま回答いたしますが、質問のタイトルとは違う内容になってしまう場合は、新たな質問として投稿したほうがいいのかなと思います。

ボタンについてですが、単純に高さを指定してあげるではだめでしょうか?
heightを指定すれば、同じ大きさのままにはなるようです。

また、余談ですが、デベロッパツールは活用されていますでしょうか?
スタイルを直接いじれますし、現在どんなスタイルが適用されているかも確認できます。
先の内容のようなJavaScriptについても、コンソールを確認できたりステップ実行できたりとデバッグにはかなり役に立つと思います。

0Like

Your answer might help someone💌