2020/11/25

下からスライドして出てくる、高さ可変モーダル







内包要素の高さによって可変するモーダル
下からスライドして出てくる感じのモーダル の可変バージョンです。
スライドする動きも、cssからjsのanimateに変わってます。



See the Pen 下からスライドして出てくる可変モーダル by takapen (@takapen) on CodePen.








html
btn

コンテンツ

close

btn2

コンテンツ2
コンテンツ2
コンテンツ2
コンテンツ2
コンテンツ2
コンテンツ2
コンテンツ2
コンテンツ2

close




css

/*モーダル用*/
.js-modal__bg {
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.6);
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  display: none;
}
.js-modal__main {
  width: calc(100% - 32px);
  height: auto;
  padding: 16px;
  bottom: -81%;
  left: 0;
  background: #fff;
  border-radius:4px 4px 0 0 ;
  position: fixed;
  z-index: 11;
  opacity: 0;
}
.js-modal__btn {
    color:#76952f;
  cursor: pointer;
  -webkit-tap-highlight-color:rgba(0,0,0,0);
}
.js-modal__btn--close {
    margin-top: 40px;
    text-align: center;
    text-decoration: underline;
}
.js-modal__btn--close--fix {
  width: 30px;
  height: 30px;
  //background: #333;
  border-radius: 50%;
  position: absolute;
  top: -50px;
  right: 5px;
  z-index: 101;
  cursor:pointer;
  -webkit-tap-highlight-color:rgba(0,0,0,0);
}
.js-modal__btn--close--fix:before{
  content:"";
  width: 20px;
  height: 20px;
  border-right:3px solid #fff;
  transform: rotate(-45deg);
  position: absolute;
  top:12px;
  left:-3px;
}
.js-modal__btn--close--fix:after{
  content:"";
  width: 20px;
  height: 20px;
  border-right:3px solid #fff;
  transform: rotate(45deg);
  position: absolute;
  top:-2px;
  left:-3px;
}



jQuery
$(function(){
  var modalBtn = $('.js-modal__btn');
  var modalBtnClose = $('.js-modal__btn--close');
  var modalBtnCloseFix = $('.js-modal__btn--close--fix');
  var modalBg = $('.js-modal__bg');
  var modalMain = $('.js-modal__main');

  modalBtn.on('click', function (e) {
    $(this).next(modalBg).fadeIn();
    $(this).next(modalBg).next(modalMain).animate({
      'bottom': '0',
      'opacity': '1'
    }, 400);
  });
  modalBtnClose.on('click', function (e) {
    modalBg.fadeOut();
    modalMain.animate({
      'bottom': '-80%',
      'opacity': '0'
    }, 400);
  });
  modalBtnCloseFix.on('click', function (e) {
    modalBg.fadeOut();
    modalMain.animate({
      'bottom': '-80%',
      'opacity': '0'
    }, 400);
  });
  modalMain.on('click', function (e) {
    e.stopPropagation();
  });
  modalBg.on('click', function () {
    $(this).fadeOut();
    $(this).next(modalMain).animate({
      'bottom': '-80%',
      'opacity': '0'
    }, 400);
  });
});