質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3948閲覧

縦型カレンダー スクロールで日付計算

somatech0428

総合スコア37

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/07/13 15:35

編集2018/07/14 08:17

カレンダーの日付が取れなくて困っています。

lang

1$(function(){ 2'use strict'; 3var $calendar = $('#calendar'); 4var myWeekTbl = new Array('日','月','火','水','木','金','土'); // 曜日テーブル定義 5var myMonthTbl= new Array(31,28,31,30,31,30,31,31,30,31,30,31); // 月テーブル定義 6var myDate = new Date(); 7var myToday = myDate.getDate(); // 今日の'日'を退避 8var todayMyMonth = myDate.getMonth(); // 月を取得(0月~11月) 9 10function setCalender(l){ 11myDate = new Date(2018,l); // 今日の日付データ取得 12var myYear = myDate.getFullYear(); // 年を取得 13((myYear % 4)===0 && (myYear % 100) !==0) || (myYear % 400)===0 ? myMonthTbl[1] = 29: 28; // うるう年だったら... 14 // 2月を29日とする 15var myMonth = myDate.getMonth(); // 月を取得(0月~11月) 16myDate.setDate(1); // 日付を'1日'に変えて、 17var myWeek = myDate.getDay(); // '1日'の曜日を取得 18var myTblLine = Math.ceil((myWeek+myMonthTbl[myMonth])/7); // カレンダーの行数 19var myTable = new Array(7*myTblLine); // 表のセル数を用意 20for(var i=0; i<7*myTblLine; i++){ 21 myTable[i]=''; // セルを全て空にする 22} 23for(i=0; i<myMonthTbl[myMonth]; i++){ 24myTable[i+myWeek]=i+1; // 日付を埋め込む 25} 26 27var source = ''; 28var td = '<div class="div-day">'; 29var tdC = '</div>'; 30 31for(i=0; i<myTblLine; i++){ // 表の「行」のループ 32 for (var j = 0; j < 7; j++) { 33 var mydat = myTable[j+(i*7)]; 34 if(todayMyMonth === myMonth && mydat === myToday){ 35 source += '<div class="today" id="today">' + mydat + tdC; 36 }else if(j === 0){ 37 source += '<div class="div-day">' + mydat + tdC; 38 }else if(j === 6){ 39 source += '<div class="div-day sat">' + mydat + tdC; 40 }else{ 41 source += td + mydat + tdC; 42 } 43 } 44} 45var weekTr; 46var tableSource = '<span class="flag"></span><table class="getid">' + '<tr><td colspan="7">' + myYear + '年' + (myMonth+1) + '月' + '</td></tr>' + source +'</table>'; 47 48 $calendar.append(tableSource); // 表の作成開始 49} 50for(var l=0; l<99; l++){ 51 setCalender(l); 52} 53 54}); 55 56// 空の要素削除 57$(function() { 58 $("div.div-day:empty").remove(); 59 $("div.sat-d:empty").remove(); 60 $("div.sun-d:empty").remove(); 61}); 62 63 //今日の日付データを変数hidukeに格納 64 var hiduke=new Date(); 65 var cale_date = document.getElementById('cale-date'); 66 67 68 //年・月・日・曜日を取得する 69 var year = hiduke.getFullYear(); 70 var month = hiduke.getMonth()-5; 71 var week = hiduke.getDay(); 72 var day = hiduke.getDate(); 73 74 75 $('#cale-date p').text(year + '年' + month + '月'); 76 77 78

lang

1 2 <div id="cale-date"> 3 <div id="calendar"> 4 <div class="div-day">31</div> 5 </div> 6 <script src="./js/jquery.inview.min.js"></script>

lang

1 2#calendar div{ 3 width: 14.28%; 4 height: 16vh; 5 border-top:1px solid #CCC; 6 /* border-left:1px solid #CCC; */ 7 border-right:1px solid #CCC; 8 float: left; 9 color: #7b7b7b; 10 font-size: 14px; 11 padding-top: 8px; 12} 13 14#cale-date p{ 15 position: fixed; 16 top: 18px; 17 left: 50%; 18 font-size: 20px; 19 color: #fff; 20 transform: translateX(-50%); 21 z-index: 9999; 22}

レイアウトが崩れていて申し訳ありません。
なんとかこの縦型カレンダーをスクロールしたら日付を計算して、その当月がきたら一ヶ月進む、前月に行ったら一ヶ月戻るというようなものが作りたいです。
#cale-dateここの日付の部分です。

ご助力いただけると幸いです。
どうかお願いいたします。

こちらが画像になります。
イメージ説明

■カレンダーの仕様
・当月の6月前からカレンダーを生成(現在は2018年のはじめから生成)、2028年まで生成。
・月と月の間の日にちは開けず、詰めて縦に日にちを表示。
・下にスクロールして次の月を表示させて行く。
・ヘッダー部分に現在表示されている年月を表示させる。
・該当付きに1日がヘッダー部分に隣接したらヘッダー部分の日付が該当月の表示になる。該当月の1日がヘッダー部分から下に離れたら、前月の年月が表示される。
・ページを読み込んだら、現在の日付にリンクさせる

※コード参考元サイト:https://www.frontendmemo.xyz/entry/2017/02/04/044306
※目標アプリ:https://lifebear.com/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/13 15:52

閏年に対応しないでいいんですか?
somatech0428

2018/07/13 16:40

年を取得のところでとれてませんでしょうか?間違っていたらすみません・・・
somatech0428

2018/07/13 16:40

ちなみにスマホのみの仕様です。
退会済みユーザー

退会済みユーザー

2018/07/13 16:43

なるほどわざわざそこで計算していたのね。失礼しました。
退会済みユーザー

退会済みユーザー

2018/07/13 16:55

コードをざっと眺めただけではイメージつかないので、スクリーンショットとか貼ってもらえます?
somatech0428

2018/07/14 00:21

shibuya様、投稿を編集しました。
somatech0428

2018/07/14 04:27

やはり自動生成でカレンダーの日付取得は難しいでしょうか…
退会済みユーザー

退会済みユーザー

2018/07/14 05:32

難しいというより、質問文からやりたいことが読み取りにくいのです。
somatech0428

2018/07/14 05:51

申し訳ありません。実現したいことなのですが、画像は今年の1月のカレンダーが出ていて画像したの1日が2月1日のカレンダーの日付になります。この2月1日の日付がヘッダー部分に隣接したら、ヘッダー部分の日付が「2018年2月」に変化するというような作りがしたいです。それ以降の月も同じです。年をまたぐ場合も変化をさせたいです。が、すべてjsで同じクラスが生成されているのでクラスをトリガーにすると、すべてのクラスが処理されてしまって一つづつ月が進むというようなことができない状況になっています。
somatech0428

2018/07/14 05:53

なので、スクロール量かなにかに応じて日付を操作しなければならないと感じていて・・・。何かお知恵をかしていただけたらと・・・
退会済みユーザー

退会済みユーザー

2018/07/14 05:54

「この2月1日の日付がヘッダー部分に隣接したら、ヘッダー部分の日付が「2018年2月」に変化するというような作りがしたいです。」これは上方向にスクロールした時の話ですよね?下のときどうするの?とか細かな仕様が不明なのです。
somatech0428

2018/07/14 05:58

すみません。下にスクロールした場合は前月の表示に戻る仕様にしたいです。
退会済みユーザー

退会済みユーザー

2018/07/14 06:00

どのタイミングで戻すの?
somatech0428

2018/07/14 06:08

2月1日がヘッダーから下に離れたら前月(1月の表示)にしたいです・・・。動きのイメージはこのアプリのようにしたいです。 https://lifebear.com/
退会済みユーザー

退会済みユーザー

2018/07/14 06:10

仕様を簡潔にまとめて質問本文に反映してください。
somatech0428

2018/07/14 06:46

申し訳ありません。まだコーダー初心者なので、まとめられるかわかりませんが・・・追記してみます。
退会済みユーザー

退会済みユーザー

2018/07/14 06:49 編集

この欄は、「質問への追記・修正の依頼」とタイトルにあるように、要件を追記する場所ではないのです。 プログラミングの初心者でも、「質問することの初心者」ではないと思います。
guest

回答1

0

ベストアンサー

まだまだプロダクトレベルの品質ではないと思うけど、参考程度に。

html

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style type="text/css"> 7 #wrap { 8 width: 280px; 9 margin: 0 auto; 10 } 11 #calendar { 12 border: 1px solid #F88; 13 height: 197px; 14 overflow-y: scroll; 15 } 16 #calendar table { 17 border-collapse: collapse; 18 } 19 #calendar table th, 20 #calendar table td { 21 border: 1px solid #CCC; 22 text-align: center; 23 width: 2em; 24 } 25 #calendar table tr > td:first-child, 26 #calendar table thead tr:last-child > th:first-child { 27 background-color: #EEF; 28 } 29 #calendar table tr > td:last-child, 30 #calendar table thead tr:last-child > th:last-child { 31 background-color: #FEE; 32 } 33 34 </style> 35 </head> 36 <body> 37 <div id="wrap"> 38 <p>----/--</p> 39 <div id="calendar"> 40 41 </div> 42 </div> 43 <script type="text/javascript" src="http://code.jquery.com/jquery-3.1.1.min.js"></script> 44 <script type="text/javascript"> 45 46 var data = []; 47 48 function displayYM(y, m) { 49 $('#wrap p').text(y + '年' + (m + 1) + '月'); 50 } 51 52 /** 53 * カレンダーを作る 54 * @param {int} y55 * @param {int} m 月(0-11) 56 * @param {int} y_end57 * @param {int} m_end 月(0-11) 58 */ 59 function getCalendar(y, m, y_end, m_end) { 60 displayYM(y, m); 61 62 var first_dt_current = new Date(); 63 first_dt_current.setFullYear(y); 64 first_dt_current.setMonth(m); 65 first_dt_current.setDate(1); 66 var first_day_week = first_dt_current.getDay(); // ○月1日の曜日 67 68 // 1日を含む週の日曜日を取得 69 first_dt_current.setDate(first_dt_current.getDate() - first_day_week); 70 71 var next_dt = new Date(); 72 next_dt.setFullYear(y_end); 73 next_dt.setMonth(m_end + 1); 74 next_dt.setDate(1 + (6 - next_dt.getDay())); 75 76 var table = $('<table>'); 77 var tbody = $('<tbody>').appendTo(table); 78 79 while (first_dt_current < next_dt) { 80 81 // 日曜日なら行をたす 82 if (first_dt_current.getDay() === 0) { 83 var tbody_tr = $('<tr>').appendTo(tbody); 84 } 85 $('<td>').text(first_dt_current.getDate()).appendTo(tbody_tr); 86 if (first_dt_current.getDate() === 1) { 87 tbody_tr.addClass('has-first') 88 .data({ 89 y: first_dt_current.getFullYear(), 90 m: first_dt_current.getMonth() 91 }); 92 } 93 94 // 1日たす 95 first_dt_current.setDate(first_dt_current.getDate() + 1); 96 } 97 $("#calendar").append(table).find('tr.has-first').each(function (i, obj) { 98 data.push({ 99 position: $(this).position().top - $("#calendar").position().top - 2, 100 y: $(this).data('y'), 101 m: $(this).data('m') 102 }); 103 }); 104 } 105 106 $(function () { 107 getCalendar(2017, 0, 2018, 11); 108 109 $("#calendar").on('scroll', function (e) { 110 var scrl = $(this).scrollTop(); // #calendar のTOP 111 for (var i = 0; i < data.length; i++) { 112 if (i > 0 && scrl < data[i].position) { 113 var y = data[(i - 1)].y; 114 var m = data[(i - 1)].m; 115 displayYM(y, m); 116 break; 117 } 118 } 119 }); 120 }); 121 </script> 122 </body> 123</html>

javascript

1 2 while (first_dt_current < next_dt) { 3 4 // 日曜日なら行をたす 5 if (first_dt_current.getDay() === 0) { 6 var tbody_tr = $('<tr>').appendTo(tbody); 7 } 8 9 var td = $('<td>').text(first_dt_current.getDate()).appendTo(tbody_tr); 10 var today = new Date(); 11 if (today.getFullYear() === first_dt_current.getFullYear() && 12 today.getMonth() === first_dt_current.getMonth() && 13 today.getDate() === first_dt_current.getDate() 14 ) { 15 td.addClass('today'); 16 } 17 18 if (first_dt_current.getDate() === 1) { 19 tbody_tr.addClass('has-first') 20 .data({ 21 y: first_dt_current.getFullYear(), 22 m: first_dt_current.getMonth() 23 }); 24 } 25 26 // 1日たす 27 first_dt_current.setDate(first_dt_current.getDate() + 1); 28 }

投稿2018/07/14 09:17

編集2018/07/14 14:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

somatech0428

2018/07/14 09:29

大変ありがとうございます!! さっそく当てはめさせていただきます!!
退会済みユーザー

退会済みユーザー

2018/07/14 09:33 編集

プロダクトレベルじゃないって言ってるじゃないの。 コピペしてはるだけならこんなめんどくさいことしたくないんだわ。 コード書いてくれという依頼じゃん…
somatech0428

2018/07/14 09:40

もちろん参考にさせていただくという意味です! ありがとうございます!!
somatech0428

2018/07/14 11:10

すみません・・・ 図々しい発言かと思いますが、当日の日付はどうすれば判定できますでしょうか・・・
somatech0428

2018/07/14 13:39

申し訳ありません・・・ 作りがまだ良くわからなくて
退会済みユーザー

退会済みユーザー

2018/07/14 13:41

当日って実行している日付のこと?
somatech0428

2018/07/14 13:46

そうです! 実行している日付にidを付与したいです!
退会済みユーザー

退会済みユーザー

2018/07/14 13:51 編集

当日という意味合いならそこにidつけるのはおかしい。idってただ一つのものを特定するものだし、性質を表すものなら、classでしょう。 アクセスした日によって id が移動するのは不自然。
退会済みユーザー

退会済みユーザー

2018/07/14 13:50

while の中で、td に 'today' とでもつければOK。 似たような処理しているところあるので、そこを参考に。
somatech0428

2018/07/14 13:57

繰り返し構文の中で条件式を作ろうと考えたのですが・・・ var myDate = new Date(); var myToday = myDate.getDate(); var todayMyMonth = myDate.getMonth(); // 月を取得(0月~11月) var myMonth = myDate.getMonth(); // 月を取得(0月~11月) if(todayMyMonth === myMonth && 7 === myToday){ $('td').addClass('today'); } 勉強不足で見つけられず、このようなものを追記したのですがうまくいきませんでした。
退会済みユーザー

退会済みユーザー

2018/07/14 14:02

検索して見つかったコードの処理内容を理解しようとしています? それどう考えても条件おかしいでしょ。 年月日それぞれが一致していないといけないのに、条件が二つしかないし。 $('td') というセレクタじゃ、<td> 全てにclass が付与されてしまう。
somatech0428

2018/07/14 14:10

すみません。 条件式は正直、理解できていませんでした。 セレクタは$('td')ではなく、<td class="today">を直接挿入するかたちになるのでしょうか。
退会済みユーザー

退会済みユーザー

2018/07/14 14:13

> セレクタは$('td')ではなく、<td class="today">を直接挿入するかたちになるのでしょうか。 「試しにやってみる」ことを繰り返しやることが理解の助けになると思います。どうせ人に聞いてさらっと終わらせてしまえばそれっきりですが、スクラップ&ビルドを繰り返すことが一番身につく。 回答は追記しておいたけど、あえて見ないでやってみるのもいいんじゃない?
somatech0428

2018/07/14 14:23

はい!あたって砕けて勉強いたします。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問