>  기사  >  웹 프론트엔드  >  Node.js CSS+html은 간단한 달력을 구현합니다.

Node.js CSS+html은 간단한 달력을 구현합니다.

高洛峰
高洛峰원래의
2017-02-06 10:36:222506검색

캘린더 표시, 선택 등은 웹 페이지의 여러 곳에서 사용되며, 이 글에서는 간단한 캘린더를 구현하기 위해 html, css, javascript를 사용합니다. 완료되면 페이지 왼쪽의 효과와 유사하게 이전 달과 다음 달 간에 전환할 수 있습니다. 실제 상황에 따라 확대될 수도 있다.

js css+html实现简单的日历

html
html 부분은 비교적 간단하고 div를 선언하고 특정 html은 javascript로 생성됩니다. 전체적인 내용은 대략 이렇습니다.

<!doctype html>
<html>
<head>
  <meta charset=&#39;utf-8&#39;>
  <link rel=&#39;stylesheet&#39; href=&#39;外部的css文件路径&#39; />  
  <title>demo</title>
</head>
<body>
  <div class=&#39;calendar&#39; id=&#39;calendar&#39;></div>
  <script type=&#39;text/javascript&#39; src=&#39;外部的javascript文件路径&#39;></script>
</body>
</html>

css

/* 整体设置 */
*{margin:0px;padding:0px;}
 
/**
 * 设置日历的大小
 */
.calendar{
  width: 240px;
  height: 400px;
  display: block;
}
 
/**
 * 设置日历顶部盒子
 */
.calendar .calendar-title-box{
  position: relative;
  width: 100%;
  height: 36px;
  line-height: 36px;
  text-align:center;
  border-bottom: 1px solid #ddd;
}
 
/**
 * 设置上个月的按钮图标
 */
.calendar .prev-month {
  position: absolute;
  top: 12px;
  left: 0px;
  display: inline-block;
  width: 0px;
  height: 0px;
  border-left: 0px;
  border-top: 6px solid transparent;
  border-right: 8px solid #999;
  border-bottom: 6px solid transparent;
  cursor: pointer;
}
 
/**
 * 设置下个月的按钮图标
 */
.calendar .next-month {
  position: absolute;
  top: 12px;
  right: 0px;
  display: inline-block;
  width: 0px;
  height: 0px;
  border-right: 0px;
  border-top: 6px solid transparent;
  border-left: 8px solid #999;
  border-bottom: 6px solid transparent;
  cursor: pointer;
}
 
 
/* 设置日历表格样式 */
.calendar-table{
  width: 100%;
  border-collapse: collapse;
  text-align:center;
}
 
/* 表格行高 */
.calendar-table tr{
  height: 30px;
  line-height: 30px;
}
 
/* 当前天 颜色特殊显示 */
.currentDay {
  color: red;
}
 
/* 本月 文字颜色 */
.currentMonth {
  color: #999;
}
 
/* 其他月颜色 */
.otherMonth{
  color: #ede;
}

기본적으로 스타일 설정에 대해서는 할 말이 없고 몇 가지 간단한 설정만 있을 뿐입니다. 예를 들어, "지난 달"과 "다음 달"을 나타내는 특수 아이콘은 CSS의 테두리 속성을 사용하여 절대 위치와 스타일이 지정됩니다.

javascript Date 객체
정식 js 코드를 시작하기 전에 js의 Date 객체를 이해해야 합니다. Date 객체를 통해 연, 월, 일, 시, 분, 초를 얻을 수 있습니다. 타임스탬프 및 기타 정보

var d1 = new Date();  // 获取当前系统时间 我现在的时间是 2016年4月25日 星期一
d1.getFullYear();    // 获取年信息, 2016
d1.getMonth();      // 获取月信息(从0开始 范围:0-11) 3
d1.getDate();      // 获取天信息 此处结果:25
d1.getDay();      // 获取星期信息 (0-6) 此处结果: 1

초기화 중에 연도, 월, 일 정보를 직접 설정할 수도 있습니다

# 设置 2016年3月15日
var d2 = new Date(2016, 2, 15);    // 月是从0开始计数, 需要减一
d2.getFullYear();          // 2016
d2.getMonth();            // 2
d2.getDate();            // 15
d2.toLocaleDateString();      // "2016/3/15" 证明设置正确

캘린더에는 각 날짜의 일수와 같은 문제가 포함됩니다. 월은 js에서 매우 간단합니다. 연도, 월, 일이 현재 달을 초과하면 js는 자동으로 다음 달로 계산합니다. 예를 들어 4월은 31일로 설정하면 됩니다. 얻은 날짜 유형은 자동으로 5월 1일로 계산됩니다. 5로 설정하면 js는 4월 30일로 처리하므로 5월-1일은 4월 29일입니다.

var d3 = new Date(2016, 3, 30);
d3.toLocaleDateString();      // "2016/4/30"
var d4 = new Date(2016, 3, 31);
d4.toLocaleDateString();      // "2016/5/1"
var d5 = new Date(2016, 3, 33);
d5.toLocaleDateString();      // "2016/5/3"
var d6 = new Date(2016, 4, 1);
d6.toLocaleDateString();      // "2016/5/1"
var d7 = new Date(2016, 4, 0);
d7.toLocaleDateString();      // "2016/4/30"
var d8 = new Date(2016, 4, -3);
d8.toLocaleDateString();      // "2016/4/27"

javascript
js에서 Date 객체의 기본 사용법을 이해하고 다음 단계는 코드입니다. 이제 구현 부분에 대한 전반적인 아이디어는 다음과 같습니다. 테이블. 제목의 내용은 dateObj에서 가져오고, 테이블의 날짜는 dateObj에서 가져옵니다. 연도와 월에 해당하는 첫 번째 정보를 모두 확인할 수 있으며, 테이블의 첫 번째 행에서 첫 번째 위치가 결정됩니다. 지난 달을 거꾸로 계산할 수 있으며, 며칠 동안의 데이터, 이번 달, 다음 달의 데이터가 푸시됩니다.
구체적인 단계:
1. dateObj 변수를 선언하고 현재 시스템 시간에 초기 값을 할당합니다.
2. 달력 div에서 html 요소를 렌더링합니다.
3. 1일에 대한 정보를 가져옵니다. dateObj를 통해 월, 그리고 이를 사용하여 테이블의 모든 날짜를 순회합니다
4. 이전 달 및 다음 달 아이콘에 이벤트 바인딩

(function(){
  /*
   * 用于记录日期,显示的时候,根据dateObj中的日期的年月显示
   */
  var dateObj = (function(){
    var _date = new Date();    // 默认为当前系统时间
    return {
      getDate : function(){
        return _date;
      },
      setDate : function(date) {
        _date = date;
      }
    };
  })();
 
  // 设置calendar div中的html部分
  renderHtml();
  // 表格中显示日期
  showCalendarData();
  // 绑定事件
  bindEvent();
 
  /**
   * 渲染html结构
   */
  function renderHtml() {
    var calendar = document.getElementById("calendar");
    var titleBox = document.createElement("div");  // 标题盒子 设置上一月 下一月 标题
    var bodyBox = document.createElement("div");  // 表格区 显示数据
 
    // 设置标题盒子中的html
    titleBox.className = &#39;calendar-title-box&#39;;
    titleBox.innerHTML = "<span class=&#39;prev-month&#39; id=&#39;prevMonth&#39;></span>" +
      "<span class=&#39;calendar-title&#39; id=&#39;calendarTitle&#39;></span>" +
      "<span id=&#39;nextMonth&#39; class=&#39;next-month&#39;></span>";
    calendar.appendChild(titleBox);    // 添加到calendar div中
 
    // 设置表格区的html结构
    bodyBox.className = &#39;calendar-body-box&#39;;
    var _headHtml = "<tr>" +
              "<th>日</th>" +
              "<th>一</th>" +
              "<th>二</th>" +
              "<th>三</th>" +
              "<th>四</th>" +
              "<th>五</th>" +
              "<th>六</th>" +
            "</tr>";
    var _bodyHtml = "";
 
    // 一个月最多31天,所以一个月最多占6行表格
    for(var i = 0; i < 6; i++) { 
      _bodyHtml += "<tr>" +
              "<td></td>" +
              "<td></td>" +
              "<td></td>" +
              "<td></td>" +
              "<td></td>" +
              "<td></td>" +
              "<td></td>" +
            "</tr>";
    }
    bodyBox.innerHTML = "<table id=&#39;calendarTable&#39; class=&#39;calendar-table&#39;>" +
              _headHtml + _bodyHtml +
              "</table>";
    // 添加到calendar div中
    calendar.appendChild(bodyBox);
  }
 
  /**
   * 表格中显示数据,并设置类名
   */
  function showCalendarData() {
    var _year = dateObj.getDate().getFullYear();
    var _month = dateObj.getDate().getMonth() + 1;
    var _dateStr = getDateStr(dateObj.getDate());
 
    // 设置顶部标题栏中的 年、月信息
    var calendarTitle = document.getElementById("calendarTitle");
    var titleStr = _dateStr.substr(0, 4) + "年" + _dateStr.substr(4,2) + "月";
    calendarTitle.innerText = titleStr;
 
    // 设置表格中的日期数据
    var _table = document.getElementById("calendarTable");
    var _tds = _table.getElementsByTagName("td");
    var _firstDay = new Date(_year, _month - 1, 1);  // 当前月第一天
    for(var i = 0; i < _tds.length; i++) {
      var _thisDay = new Date(_year, _month - 1, i + 1 - _firstDay.getDay());
      var _thisDayStr = getDateStr(_thisDay);
      _tds[i].innerText = _thisDay.getDate();
      //_tds[i].data = _thisDayStr;
      _tds[i].setAttribute(&#39;data&#39;, _thisDayStr);
      if(_thisDayStr == getDateStr(new Date())) {    // 当前天
        _tds[i].className = &#39;currentDay&#39;;
      }else if(_thisDayStr.substr(0, 6) == getDateStr(_firstDay).substr(0, 6)) {
        _tds[i].className = &#39;currentMonth&#39;;  // 当前月
      }else {    // 其他月
        _tds[i].className = &#39;otherMonth&#39;;
      }
    }
  }
 
  /**
   * 绑定上个月下个月事件
   */
  function bindEvent() {
    var prevMonth = document.getElementById("prevMonth");
    var nextMonth = document.getElementById("nextMonth");
    addEvent(prevMonth, &#39;click&#39;, toPrevMonth);
    addEvent(nextMonth, &#39;click&#39;, toNextMonth);
  }
 
  /**
   * 绑定事件
   */
  function addEvent(dom, eType, func) {
    if(dom.addEventListener) {  // DOM 2.0
      dom.addEventListener(eType, function(e){
        func(e);
      });
    } else if(dom.attachEvent){  // IE5+
      dom.attachEvent(&#39;on&#39; + eType, function(e){
        func(e);
      });
    } else {  // DOM 0
      dom[&#39;on&#39; + eType] = function(e) {
        func(e);
      }
    }
  }
 
  /**
   * 点击上个月图标触发
   */
  function toPrevMonth() {
    var date = dateObj.getDate();
    dateObj.setDate(new Date(date.getFullYear(), date.getMonth() - 1, 1));
    showCalendarData();
  }
 
  /**
   * 点击下个月图标触发
   */
  function toNextMonth() {
    var date = dateObj.getDate();
    dateObj.setDate(new Date(date.getFullYear(), date.getMonth() + 1, 1));
    showCalendarData();
  }
 
  /**
   * 日期转化为字符串, 4位年+2位月+2位日
   */
  function getDateStr(date) {
    var _year = date.getFullYear();
    var _month = date.getMonth() + 1;    // 月从0开始计数
    var _d = date.getDate();
     
    _month = (_month > 9) ? ("" + _month) : ("0" + _month);
    _d = (_d > 9) ? ("" + _d) : ("0" + _d);
    return _year + _month + _d;
  }
})();

이 예에는 다음이 있습니다. 테이블 이벤트에서 날짜를 클릭하는 것 외에는 바인드이벤트 함수에 다음 코드를 추가하면 클릭한 날짜의 정보를 얻을 수 있습니다.

var table = document.getElementById("calendarTable");
var tds = table.getElementsByTagName(&#39;td&#39;);
for(var i = 0; i < tds.length; i++) {
  addEvent(tds[i], &#39;click&#39;, function(e){
    console.log(e.target.getAttribute(&#39;data&#39;));
  });
}

위 내용은 전체 내용입니다. 이 기사가 모든 사람의 학습에 도움이 되기를 바라며, PHP 중국어 웹사이트를 지원해 주시길 바랍니다.

간단한 달력 관련 기사에 대한 더 많은 js css+html 구현을 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.