メールソフトみたいなコード

 メールソフトみたいなコード

 <!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>メールソフトみたいなコード</title>
<style>
#content-container {
    width:300px;
    height:500px;
    border:1px solid gray; padding:5px;
}
#content-top {
    height:30px;
    display:flex;
}
#content {
    height:470px;
    overflow-y:auto;
}
#content-body {
    line-height:20em;
    border:1px solid gray; padding:5px;
}
#content-bottom {
    height:20px;
}
#button-container {
    height:100px;
    width:300px;
    border:1px solid gray; padding:5px;
    overflow-x: hidden;
    overflow-y: scroll;
}
.button{
    width:300px;
    border-bottom:1px solid gray;
    padding:5px;
}
</style>
<script>
// メールデータ(通常はサーバーから取得)
const email1 = {
    subject: "一つ目",
    body: '一つ目のコンテンツ1行目<br>一つ目のコンテンツ2行目<br>一つ目のコンテンツ3行目<br>',
};
const email2 = {
    subject: "二つ目",
    body: '二つ目のコンテンツ1行目<br>二つ目のコンテンツ2行目<br>二つ目のコンテンツ3行目<br>',
};
const email3 = {
    subject: "三つ目",
    body: '三つ目のコンテンツ1行目<br>三つ目のコンテンツ2行目<br>三つ目のコンテンツ3行目<br>',
};
const email4 = {
    subject: "四つ目",
    body: '四つ目のコンテンツ1行目<br>四つ目のコンテンツ2行目<br>四つ目のコンテンツ3行目<br>',
};
function changeContent(newContent) {
    document.getElementById('content-top').textContent = "subject: "+newContent.subject;
    const contentDiv = document.getElementById('content-body');
    contentDiv.innerHTML = newContent.body; //最初からhtml形式
    contentDiv.setAttribute("data-render", "html"); //html形式であることを示す
//    contentDiv.textContent = newContent.body; //最初はtext形式
//    contentDiv.setAttribute("data-render", "text"); //text形式であることを示す

//    以下はコンテンツのスクロールを一番上に戻すコード
    if (navigator.userAgent.indexOf('Firefox') == -1) {
        contentDiv.scrollIntoView(); //Firefoxでも使えるけれど、意図的に分けた
    }else{
//        contentDiv.scrollTop = 0; //誤ったコードでスクロール位置が維持されてしまう
        document.getElementById('content').scrollTop = 0;
    }
}
function changehtml() {
// ユーザーがsubjectをクリックしたら、メール本文をhtml形式かtext形式かに切り替えて表示
    const contentDiv = document.getElementById('content-body');
    if (contentDiv.getAttribute("data-render") === "html") {
        contentDiv.textContent = contentDiv.innerHTML;
        contentDiv.setAttribute("data-render", "text");
    } else {
        contentDiv.innerHTML = contentDiv.textContent;
        contentDiv.setAttribute("data-render", "html");
    }
}
</script>
</head>
<body>
<div id="button-container">
<div class="button" onclick="changeContent(email1)">
一つ目
</div>
<div class="button" onclick="changeContent(email2)">
二つ目
</div>
<div class="button" onclick="changeContent(email3)">
三つ目
</div>
<div class="button" onclick="changeContent(email4)">
四つ目
</div>
</div>
<div id="content-container">
<div id="content-top" onclick="changehtml()">
subject:
</div>
<div id="content">
<div id="content-body" data-render="html">
<p>上のボタンでコンテンツ変更</p>
</div>
<div id="content-bottom">
content-bottom
</div>
</div>
</div>
</body>
</html>

 

アップデート版

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>メールソフトみたいなコード</title>
<style>
#content-container {
    width:300px;
    height:500px;
    border:1px solid gray; padding:5px;
}
#content-top {
    height:30px;
    overflow:auto;
    display:flex;
    justify-content: space-between;
    align-items: flex-start;
}
#content-top button {
    float:right;
    white-space: nowrap;
}
#content {
    height:470px;
    overflow-y:auto;
}
#content-body {
    line-height:20em;
    border:1px solid gray; padding:5px;
    overflow-anchor: none;
}
#content-bottom {
    height:20px;
}
#button-container {
    height:100px;
    width:300px;
    border:1px solid gray; padding:5px;
    overflow-x: hidden;
    overflow-y: scroll;
}
.button{
    width:300px;
    height:25px;
    border-bottom:1px solid gray;
    padding:5px;
    display:flex;
    justify-content: space-between;
    align-items: flex-start;
}
.button div {
    white-space: nowrap;
    overflow:hidden;
}
.button button {
    margin-right: 20px;
    float:right;
    white-space: nowrap;
}
.selected {
  background-color: #ddd; /* 選択されたメールの背景色を灰色に設定 */
}
</style>
<script>
if (history.scrollRestoration) {
  history.scrollRestoration = 'manual'; // Firefoxで、button-containerのスクロールをリセットする。
}
window.onload = function() {
  // メールデータ(通常はサーバーから取得)
  const emails = [
    {
      subject: "一つ目",
      body: '一つ目のコンテンツ1行目<br>一つ目のコンテンツ2行目<br>一つ目のコンテンツ3行目<br>',
    },
    {
      subject: "二つ目",
      body: '二つ目のコンテンツ1行目<br>二つ目のコンテンツ2行目<br>二つ目のコンテンツ3行目<br>',
    },
    {
      subject: "三つ目三つ目三つ目三つ目三つ目三つ目三つ目三つ目",
      body: '三つ目のコンテンツ1行目<br>三つ目のコンテンツ2行目<br>三つ目のコンテンツ3行目<br>',
    },
    {
      subject: "四つ目",
      body: '四つ目のコンテンツ1行目<br>四つ目のコンテンツ2行目<br>四つ目のコンテンツ3行目<br>',
    }
  ];

  // button-containerを取得
  const buttonContainer = document.getElementById('button-container');

  // 各メールデータに対してボタンを生成
  emails.forEach((email, index) => {
    const button = document.createElement('div');
    button.className = 'button';
    const subject = document.createElement('div');
    subject.textContent = email.subject;
    button.appendChild(subject);
    button.onclick = function() {
      // すべてのメールから'selected'クラスを削除
      document.querySelectorAll('.button').forEach((btn) => {
        btn.classList.remove('selected');
      });
      // 選択されたメールに'selected'クラスを追加
      this.classList.add('selected');
      // コンテンツを変更
      changeContent(email);
    };
    const deleteButton = document.createElement('button');
    deleteButton.textContent = '削除';
    deleteButton.onclick = function(event) {
      event.stopPropagation();
      const nextButton = button.nextElementSibling || button.previousElementSibling;
      if (button.classList.contains('selected') && nextButton) {
        nextButton.click();
      }
      buttonContainer.removeChild(button);
      if (buttonContainer.children.length === 0) {
        changeContent({subject: '', body: '空です'});
      }
    };
    button.appendChild(deleteButton);
    buttonContainer.appendChild(button);
  });
};
function changeContent(newContent) {
    const contenttop = document.getElementById('content-top');
    contenttop.firstElementChild.textContent = "subject: "+newContent.subject;
    const contentDiv = document.getElementById('content-body');
    contentDiv.innerHTML = newContent.body; //最初からhtml表示(通常のレンダリング)
    contentDiv.setAttribute("data-render", "html"); //html表示であることを示す
//    contentDiv.textContent = newContent.body; //最初はtext表示(htmlタグも表示)
//    contentDiv.setAttribute("data-render", "text"); //text表示であることを示す

//    以下はコンテンツのスクロールを一番上に戻すコード
    if (navigator.userAgent.indexOf('Firefox') == -1) {
        contentDiv.scrollIntoView(); //Firefoxでも使えるけれど、意図的に分けた
    }else{
//        contentDiv.scrollTop = 0; //誤ったコードでスクロール位置が維持されてしまう
        document.getElementById('content').scrollTop = 0;
//        contentDiv.scrollIntoView(); //Firefoxでも同じコードにした
    }
}
function changehtml() {
// ユーザーがsubjectをクリックしたら、メール本文をhtmlかtextに切り替えて表示
    const contentDiv = document.getElementById('content-body');
    if (contentDiv.getAttribute("data-render") === "html") {
        contentDiv.textContent = contentDiv.innerHTML;
        contentDiv.setAttribute("data-render", "text");
    } else {
        contentDiv.innerHTML = contentDiv.textContent;
        contentDiv.setAttribute("data-render", "html");
    }
}
</script>
</head>
<body>
<div id="button-container">
</div>
<div id="content-container">
<div id="content-top">
<div>subject:</div>
<button onclick="changehtml()">W|T</button>
</div>
<div id="content">
<div id="content-body" data-render="html">
<p>上のボタンでコンテンツ変更</p>
</div>
<div id="content-bottom">
content-bottom
</div>
</div>
</div>
</body>
</html>

コメント