fantazer
6/11/2017 - 4:24 PM

Модальное окно SELF

Модальное окно SELF

.modal-layer
	.modal-filter
	.modal-wrap
		.modal(data-modal="order")
			.modal-content
				.modal-close
					+icon("close","icon")
				.modal-title Оставьте заявку
				.modal-text Обращаетесь к нам впервые? <br> Оформите обращение с помощью этой формы, мы перезвоним Вам и проконсультируем по любому Вашему вопросу совершенно бесплатно!
				form.validate-form( action="javascript:void(null);")
					.input-row
						input(type="text" name="name" placeholder="Ваше имя").input
					.input-row
						input(type="text" name="phone" placeholder="Ваш телефон").input
					.input-row
						textarea(name="info", cols="30", rows="5" placeholder="Сообщение").input
					.agree-row
						.check-el
							label.style-label.style-label--checkbox
								input(type="checkbox" name="agree").sytle-input
								.sytle-input-element
									+icon("checked","icon-check")
								.sytle-input-text=text
						.agree-row__text Согласен с
							a(href="#") условиями обработки персональных данных
					input(type="submit" value="Отправить заявку").modal-send
		//success message
		.modal(data-modal="true")
			.modal-content.modal-content--true
				.modal-close
					+icon("close-fat","icon")
				+icon("check-round","icon icon-msg")
				.modal-text-true Сообщение отправленно

a(href="#" data-modal="order").modal-get Открыть модальное окно
// modal
.modal-layer
	width: 100%
	//height: 100vh
	position: fixed
	z-index 1000
	top 0
	left 0
	visibility: hidden
	transition all 1s // duration for fade
	opacity 0

.modal-layer-show
	visibility: visible
	opacity 1

.modal-cont
	width: 100%
	height: 100%
	position: relative
	max-height 100%
	overflow: auto

.modal-filter
	position: absolute
	top: 0
	left: 0
	background: #18191da1
	width: 100%
	height: 100vh
	min-height 100vh

.modal
	+below(768px)
		width: 100%
		box-shadow 0 0 0
	transform scale(.9)
	position: absolute
	opacity 0
	transition transform .6s, opacity .8s
	max-width 420px
	z-index -1
	left -9999px
	.order__row
		margin-bottom: 20px
		border-bottom 0

.modal-content
	+below(640px)
		height: 100%
		padding: 30px 20px
		//overflow-y scroll
		width: calc(100% - 40px)
	margin: 20px auto
	background: white
	position: relative
	padding: 40px
	br(25px)

.modal__show
	opacity 1
	transform scale(1)
	position: relative
	z-index 1000
	left initial
	transition transform .6s, opacity .8s
	margin auto
	
.modal-close
	+below(768px)
		top 12px
		right 12px
	position: absolute
	top: 20px
	right: 20px
	cp()
	size 50px
	br(20px)
	flex(mid)
	z-index 10
	background: #f8f8f8
	&:hover
		.icon
			opacity: 1
	.icon
		tr()
		size 12px
		fill black
		opacity:.3

.modal-hide-animation
	transform scale(.9)
	opacity 0
	transition transform .6s, opacity .8s
.modal-open
	overflow: hidden
	overflow-y: scroll
	position: fixed
	top: 0
	left: 0
	right: 0
	bottom: 0
	width: 100%

.modal-wrap
	position: fixed
	width: 100%
	height: 100%
	overflow-y auto
	flex(mid)

.modal-title
	+below(768px)
		font-size: 20px
	margin-bottom: 20px
	text-align: center
	@extend .type--xl
	font-weight: 700

.modal-text
	+below(768px)
		width: 100%
		font-size: 12px
	text-align: center
	margin: 20px auto
	//width: 80%
	line-height: 1.6


.modal-send
	@extend .btn--md
	@extend .btn--mark
	width: 100%
// modal === end
//bower i jquery-validation --save-dev  - install validate
//closeModal() - закрыть окна
//initModal('data-name-attr') - Открыть нужное окно

// set height modal
//Решение бага с высотой во весь экран на моб
var vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);

//css -> 
// .el
//		height calc(var(--vh) * 100)

// set height modal === end

//modals
	var modalState = {
		"isModalShow": false, //state show modal
		"scrollPos": 0
	};
	var scrollWidth= window.innerWidth - $(document).width();
	var openModal = function () {
		if (!$('.modal-layer').hasClass('modal-layer-show')) {
			$('.modal-layer').addClass('modal-layer-show');
			modalState.scrollPos = $(window).scrollTop();
			$('body').css({
				overflowY: 'hidden',
				top: -modalState.scrollPos,
				width: '100%',
				paddingRight:scrollWidth
			});

		}
		modalState.isModalShow = true;
	};

	var closeModal = function () {
		$('.modal-layer').removeClass('modal-layer-show');
		$('body').css({
			overflow: '',
			position: '',
			top: modalState.scrollPos,
			paddingRight:0
		});
		$(window).scrollTop(modalState.scrollPos);
		$('.modal').addClass('modal-hide-animation');
		setTimeout(function(){
			$('.modal').removeClass('modal-hide-animation');
			$('.modal').removeClass('modal__show');
		},600);
		modalState.isModalShow = false;
	};

	var initModal = function (el) {
		openModal();

		$('.modal').each(function () {
			if ($(this).data('modal') === el) {
				$(this).addClass('modal__show')
			} else {
				$(this).removeClass('modal__show')
			}
		});
		var modalHeightCont = $(window).height();
		$('.modal-filter').height(modalHeightCont);

	};

	$('.modal-get').click(function () {
		var currentModal = $(this).data("modal");
		initModal(currentModal);
	});

	$('.modal-close, .modal-hide').click(function () {
		closeModal();
	});
	//modals===end

//validate
jQuery.validator.addMethod("getPhone", function(value, element) {
  // allow any non-whitespace characters as the host part
  return this.optional( element ) || /^(\s*)?(\+)?([- _():=+]?\d[- _():=+]?){5,18}(\s*)?$/.test( value );
	}, 'Введите правильный номер телефона');
$('.validate-form').each(function () {
	var curentForm = $(this);
	$(this).validate({
		highlight: function (element) { //даем родителю класс если есть ошибка
			$(element).parent().addClass("field-error");
		},
		unhighlight: function (element) {
			$(element).parent().removeClass("field-error");
		},
		rules: { //правила для полей
			name: {
				required: true,
			},
			phone: {
				required: true,
				minlength: 5,
				getPhone: true
			},
			comment: {
				required: true,
				minlength: 5,
			},
			agree: {
				required: true
			}
		},
		messages: {
			name: {
				required: 'Обязательное поле',
			},
			phone: {
				required: 'Обязательное поле',
				number: 'Введите правильный номер',
				minlength: 'Номер должен быть длиннее',
			},
			comment: {
				required: 'Обязательное поле',
				minlength: 'Сообщение должно быть длиннее',
			},
			agree: {
				required: false,
			}
		},
		submitHandler: function (form) {
			$.ajax({ //отправка ajax
				type: "POST",
				url: "sender.php",
				data: $(form).serialize(),
				timeout: 3000,
			});
			closeModal();
			initModal("truemessage");
			setTimeout(function () {
				closeModal();
				$(':input', '.validate-form') //очитска формы от данных
					.not(':button, :submit, :reset, :hidden')
					.val('')
					.removeAttr('checked')
					.removeAttr('selected')
			}, 2500)

		}
	});
});