fixed Modal

630 阅读2分钟

如图所示:fixed Modal最后的实现效果。大小可随着页面进行缩放,当高度不足时,会出现垂直滚动条。

代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Modal</title>
		<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" />
	</head>
	<style>
		@import 'https://fonts.googleapis.com/css?family=Prompt:400,700';
		.modal {
			/* This way it could be display flex or grid or whatever also. */
			display: block;
			/* Probably need media queries here */
			width: 600px;
			max-width: 100%;
			height: 400px;
			max-height: 100%;
			position: fixed;
			z-index: 100;
			left: 50%;
			top: 50%;
			/* Use this for centering if unknown width/height */
			transform: translate(-50%, -50%);
			/* If known, negative margins are probably better (less chance of blurry text). */
			/* margin: -200px 0 0 -200px; */
			background: white;
			/*box-shadow: 0 0 60px 10px rgba(0, 0, 0, 0.9);*/
		}
		
		.closed {
			display: none;
		}
		
		.modal-overlay {
			position: fixed;
			top: 0;
			left: 0;
			width: 100%;
			height: 100%;
			z-index: 50;
			background: rgba(0, 0, 0, 0.5);
		}
		
		.modal-guts {
			position: absolute;
			top: 0;
			left: 0;
			width: 100%;
			height: 100%;
			overflow: auto;
			padding: 20px 50px 20px 20px;
		}
		
		* {
			box-sizing: border-box;
			margin: 0;
			padding: 0;
		}
		
		body {
			/*background-color: #556;*/
			/*background-image: linear-gradient(30deg, #445 12%, transparent 12.5%, transparent 87%, #445 87.5%, #445), linear-gradient(150deg, #445 12%, transparent 12.5%, transparent 87%, #445 87.5%, #445), linear-gradient(30deg, #445 12%, transparent 12.5%, transparent 87%, #445 87.5%, #445), linear-gradient(150deg, #445 12%, transparent 12.5%, transparent 87%, #445 87.5%, #445), linear-gradient(60deg, #99a 25%, transparent 25.5%, transparent 75%, #99a 75%, #99a), linear-gradient(60deg, #99a 25%, transparent 25.5%, transparent 75%, #99a 75%, #99a);*/
			background-size: 80px 140px;
			background-position: 0 0, 0 0, 40px 70px, 40px 70px, 0 0, 40px 70px;
			font-family: 'Prompt', sans-serif;
		}
		
		ul {
			margin: 10px 0 10px 30px;
		}
		
		li,
		p {
			margin: 0 0 10px 0;
		}
		
		h1 {
			margin: 0 0 20px 0;
		}
		
		.modal .close-button {
			position: absolute;
			/* don't need to go crazy with z-index here, just sits over .modal-guts */
			z-index: 1;
			top: 10px;
			/* needs to look OK with or without scrollbar */
			right: 20px;
			border: 0;
			background: black;
			color: white;
			padding: 5px 10px;
			font-size: 1.3rem;
		}
		
		.open-button {
			border: 0;
			position: absolute;
			top: 50%;
			left: 50%;
			transform: translate(-50%, -50%);
			background: lightgreen;
			color: white;
			padding: 10px 20px;
			border-radius: 10px;
			font-size: 21px;
		}
	</style>

	<body>
		<div class="modal-overlay" id="modal-overlay"></div>
		<div class="modal fade" id="modal">
			<button class="close-button" id="close-button"><i class="fa fa-remove"></i></button>
			<div class="modal-guts">
				<h1>Modal Example</h1>
				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repudiandae expedita corrupti laudantium aperiam, doloremque explicabo ipsum earum dicta saepe delectus totam vitae ipsam doloribus et obcaecati facilis eius assumenda, cumque.</p>
				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repudiandae expedita corrupti laudantium aperiam, doloremque explicabo ipsum earum dicta saepe delectus totam vitae ipsam doloribus et obcaecati facilis eius assumenda, cumque.</p>
			</div>
		</div>

		<button id="open-button" class="open-button">Open Button</button>

		<script type="text/javascript">
			var modal = document.querySelector("#modal");
			var modalOverlay = document.querySelector("#modal-overlay");
			var closeButton = document.querySelector("#close-button");
			var openButton = document.querySelector("#open-button");

			closeButton.addEventListener("click", function() {
				modal.classList.toggle("closed");
				modalOverlay.classList.toggle("closed");
			});

			openButton.addEventListener("click", function() {
				modal.classList.toggle("closed");
				modalOverlay.classList.toggle("closed");
			});
		</script>
	</body>

</html>