手写JavaScript实现日历选择器 datePicker(鼠标上下拖动选择内容)

上次写这个的时候的博客:https://www.cnblogs.com/hiuman/p/7347406.html

上次是网上搜的插件,这次是自己写的。

欢迎指点~


效果图:

 

 可以通过 https://littlehiuman.github.io/09-DatePicker/ 查看效果。

https://github.com/littleHiuman/littleHiuman.github.io 求点star~~~


代码如下:

css:

 

input {
  height: 30px;
  outline: none;
}

.fixed_bg {
  position: fixed;
  top: 0;
  left: 0;
  display: none;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
}

.fixed_bg .alert {
  position: fixed;
  top: 50%;
  left: 50%;
  overflow: hidden;
  width: 250px;
  height: 160px;
  margin-top: -75px;
  margin-left: -125px;
  border-radius: 10px;
  background: #fafafa;
}

.fixed_bg #curr {
  display: none;
}

.fixed_bg .alert_title {
  line-height: 40px;
  position: relative;
  width: 100%;
  height: 40px;
  text-align: center;
  color: #fff;
  background: #387bf0;
}

.fixed_bg .alert_sure,
.fixed_bg .alert_close {
  cursor: pointer;
  position: absolute;
}

.fixed_bg .alert_sure {
  right: 10px;
}

.fixed_bg .alert_close {
  left: 10px;
  width: 20px;
}

.fixed_bg .alert_con {
  position: relative;
  width: 100%;
  height: 120px;
}

.fixed_bg .alert_list_wrap {
  position: absolute;
  top: 8px;
  left: 50%;
  width: 40px;
  height: 100px;
  margin-left: -20px;
  overflow: hidden;
}

.fixed_bg .alert_list_curr_top,
.fixed_bg .alert_list_curr_bottom {
  position: absolute;
  width: 40px;
  height: 2px;
  background: red;
}

.fixed_bg .alert_list_curr_top {
  top: 33px;
}
.fixed_bg .alert_list_curr_bottom {
  top: 67px;
}

.fixed_bg .alert_list_msg_con {
  position: absolute;
  top: 34px;
  width: 100%;
}

.fixed_bg .alert_list_msg_con a {
  font-weight: bold;
  line-height: 34px;
  display: block;
  width: 100%;
  height: 34px;
  text-align: center;
  transition: top 2s;
}

.fixed_bg .alert_list_msg_descr {
  position: absolute;
  top: 0;
  left: -1px;
  width: 100%;
  height: 100%;
  background: -webkit-gradient(
    linear,
    0% 100%,
    0% 0%,
    from(rgb(235, 235, 235)),
    color-stop(0.35, rgba(235, 235, 235, 0)),
    color-stop(0.65, rgba(235, 235, 235, 0)),
    to(rgb(235, 235, 235))
  )
}

 

 

 

js:

 

var content = ''
var oInputGroup = document.getElementsByClassName('choose')
var fixed_bg = document.getElementsByClassName('fixed_bg')[0]
var alert_close = document.getElementsByClassName('alert_close')[0]
var alert_sure = document.getElementsByClassName('alert_sure')[0]
var alert_list_msg_con = document.getElementsByClassName('alert_list_msg_con')[0]
var spanCurr = document.getElementById('curr')
var eachHeight = +getComputedStyle(alert_list_msg_con.children[0], null).height.slice(0, -2)

setIndex()

for (var i = 0; i < oInputGroup.length; i++) {
  oInputGroup[i].onclick = function() {
    var _this = this
    fixed_bg.style.display = 'block'
    eventListen()
    alert_sure.onclick = function() {
      fixed_bg.style.display = 'none'
      setIndex()
      _this.value = content
    }
  }
}
alert_close.onclick = function() {
  fixed_bg.style.display = 'none'
}

function setIndex() {
  var conTop = getComputedStyle(alert_list_msg_con, null).top.slice(0, -2)
  var conIndex = -((conTop - eachHeight) / eachHeight)
  spanCurr.innerText = Math.round(conIndex)
}

function eventListen() {var sign = ''
  var sMoveStart = ''

  window.onmousedown = function(event) {
    event = event || window.event
    if (sign == 'mouseup' || sign == '') {
      sign = 'mousedown'
      sMoveStart = event.screenY

      window.onmousemove = function(event) {
        event = event || window.event
        if (sign == 'mousedown') {
          var currIndex = +spanCurr.innerText
          var currTop = -(currIndex * eachHeight) + eachHeight

          var sMoveLenth = event.screenY - sMoveStart
          var temp = currTop + sMoveLenth
          var resultIndex = Math.round(-((temp - eachHeight) / eachHeight))

          alert_list_msg_con.style.top = temp + 'px'
        }
      }
    }
    window.onmouseup = function() {
      if (sign == 'mousedown') {
        sign = 'mouseup'

        setIndex()
        var conIndex = spanCurr.innerText
        alert_list_msg_con.style.top = (-(conIndex * eachHeight) + eachHeight) + 'px'
        content = alert_list_msg_con.children[conIndex].innerText
      }
    }
  }
}

 

 

 

html:

 

<input class="choose" type="text" placeholder="请选择" />

<div class="fixed_bg">
  <div class="alert">
    <span id="curr"></span>
    <div class="alert_title">
      <span class="alert_close">x</span>
      <span>请选择</span>
      <span class="alert_sure">确定</span>
    </div>
    <div class="alert_con">
      <div class="alert_list_wrap">
        <div class="alert_list_msg_con">
          <a>1</a>
          <a>2</a>
          <a>3</a>
          <a>4</a>
          <a>5</a>
          <a>6</a>
          <a>7</a>
          <a>8</a>
        </div>
        <div class="alert_list_msg_descr"></div>
        <div class="alert_list_curr_top"></div>
        <div class="alert_list_curr_bottom"></div>
      </div>
    </div>
  </div>
</div>
posted @ 2017-01-17 19:45  hiuman  阅读(695)  评论(0编辑  收藏  举报