JSFiddle - React, Tailwind, and code Playground

by satantx

HTML

<button data-popmod="#recall">#recall</button>
	<button data-popmod="#add">#add</button>

	<div id="add">
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
		tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
		quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
		consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
		cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
		proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
	</div>

	<div id="recall">
		<div class="text">Идея сверхчеловека стара как мир.<br>В течение веков и сотен веков своей истории человечество жило с идеей сверхчеловека. Сказания и легенды всех древних народов полны образов сверхчеловека. Герои мифов, титаны, полубоги, Прометей, принесший огонь с неба; пророки, мессии и святые всех религий; герои волшебных сказок и эпических песен; рыцари, которые спасали пленных принцесс, пробуждали спящих красавиц, побеждали драконов, сражались с гигантами и людоедами, – все это образы сверхчеловека.</div>
	</div>

CSS

* {
	padding: 0;
	margin: 0;
   box-sizing: border-box;
}

html {
	height: 100%;
}

body {
	position: relative;
	height: 100%;
	font-family: 'Segoe UI', Arial;
	font-size: 14px;
	background-image: -webkit-linear-gradient(45deg, #dde7eb, #ffebf7);
	background-image: linear-gradient(45deg, #dde7eb, #ffebf7);
	background-color: #E3E7ED;
}

.button-block {
	position: absolute;
	width: 220px;
	height: 40px;
	left: 50%; top: 50%;
	margin: -20px 0 0 -110px;
}

.button {
	display: block;
	line-height: 40px;
	border-radius: 3px;
	text-decoration: none;
	text-align: center;
	color: #333;
	background-color: rgba(255,255,255,.2);
	border: 1px solid rgba(0,0,0,.1);
}

.popmod-box {
	display: none;
	padding: 0;
	margin: 0;
}

.popmod-box * {
	box-sizing: border-box;
}

.popmod {
	display: none;
}

.popmod,
.popmod-shadow {
	position: fixed;
	left: 0; top: 0;
	width: 100%;
	height: 100%;
	background: rgba(0,0,0,.2);
}

.popmod-tb {
	display: table;
	width: 100%;
	height: 100%;
}

.popmod-td {
	width: 100%;
	height: 100%;
	vertical-align: middle;
	text-align: center;
	display: table-cell;
}

.popmod-main {
	width: 400px;
	margin: 0 auto;
	background: #fff;
	position: relative;
	text-align: left;
	padding: 20px;
	border-radius: 4px;
	z-index: 2;
	opacity: 0;
	box-shadow: 0 15px 35px rgba(50,50,93,.1), 0 5px 15px rgba(0,0,0,.07);
   /*transition: all .3s;*/
   /*transform: translate(30%) translateZ(600px) rotate(5deg);*/
   transform: rotate3d(1,1,0,15deg);
   transform-origin: 0 100%;
   will-change: transform,opacity;
   transition-property: transform,opacity;
   transition-duration: .5s;
}

.popmod-show .popmod-main {
	opacity: 1;
	transform: none; 
   /*transform: translate(0%) translateZ(0) rotate(0deg);*/
}

.popmod-shadow {
	position: absolute;
	background: none;
}

.popmod-close {
	position: absolute;
	width: 24px;
	height: 24px;
	right: -12px; top: -12px;
	border-radius: 12px;
	cursor: pointer;
	box-shadow: 0 1px 5px rgba(0,0,0,.2);
	z-index: 2;
}

JavaScript

$.fn.popmod = function(options) {
	var options = $.extend({
		 close: true,
		 closeText: 'x',
		 closeClass: 'close',
		 fadeCount: 200
	},
	options);

	var doc = $('body'),
		 wi = (function(){
	      var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo(doc),
	          widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
	      $outer.remove();
	      return 100 - widthWithScroll;
	  	 }());

	return this.each(function(){

		var popmodLink = $(this),
			 popmod = popmodLink.data('popmod'),
			 
			 closeClass = ''+options.closeClass+' popmod-close',
			 closeText = options.closeText,
			 fadeCount = options.fadeCount,
			 placeholder = 'popmod-placeholder';

		$(popmod).hide();

		$(popmodLink).on('click', function() {

			$('<div class="' + placeholder + '"></div>').insertAfter(popmod).hide();

			$modal = $('<div class="popmod"><div class="popmod-tb"><div class="popmod-td"><div class="popmod-main"></div><div class="popmod-shadow"></div></div></div></div>').appendTo(doc).fadeIn(fadeCount,function(){
				$(this).addClass('popmod-show');
			});

			if (options.close == true) $('.popmod-main').prepend('<div class="'+closeClass+'">'+closeText+'</div>');

		 	doc.addClass('hidden').css({'paddingRight': wi});

			$(popmod).appendTo($('.popmod-main')).show().addClass('ready');

			$modal.find('.popmod-close, .popmod-shadow').on('click', function() {
				$('.popmod').fadeOut(fadeCount,function(){
					$('.popmod-show').find(popmod).insertAfter($('.'+placeholder)).hide();
					$('.'+placeholder).remove();
					$(this).removeClass('popmod-show').remove();
				});

				doc.removeClass('hidden').css({'paddingRight': 0});
			});

			return false;
		});
		
	});
};