<div class="card">
	<div class="content-wrapper">
		<h2 class="heading">CSS Modal</h2>
		<p>This demo shows how to open a modal without using JavaScript. While it's a cool trick, it's not 100% accessible. JavaScript is needed to set focus on the modal and to create a focus trap.</p>
	</div>
	<a href="#modal" role="button" class="button button__link">Modal Trigger</a>
</div>

<!-- Modal -->
<div class="modal-wrapper" id="modal">
	<div class="modal-body card">
		<div class="modal-header">
			<h2 class="heading">Modal Header</h2>
			<a href="#!" role="button" class="close" aria-label="close this modal">
				<svg viewBox="0 0 24 24">
					<path d="M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z" />
				</svg>
			</a>
		</div>
		<p>Simple example using the <code>:target</code> selector to open a modal.</p>
	</div>
	<a href="#!" class="outside-trigger"></a>
</div>
$opacity-transition: opacity $speed ease-in-out;

.modal-header {
	align-items: baseline;
	display: flex;
	justify-content: space-between;
}

.close {
	background: none;
	border: none;
	cursor: pointer;
	display: flex;
	height: 16px;
	text-decoration: none;
	width: 16px;

	svg {
		width: 16px;
	}
}

.modal-wrapper {
	align-items: center;
	background: rgba(0, 0, 0, 0.7);
	bottom: 0;
	display: flex;
	justify-content: center;
	left: 0;
	position: fixed;
	right: 0;
	top: 0;
}

#modal {
	opacity: 0;
	transition: $opacity-transition;
	visibility: hidden;

	&:target {
		opacity: 1;
		visibility: visible;

		.modal-body {
			opacity: 1;
			transform: translateY(1);
		}
	}

	.modal-body {
		max-width: 500px;
		opacity: 0;
		transform: translateY(-100px);
		transition: $opacity-transition;
		width: 100%;
		z-index: 1;
	}
}

.outside-trigger {
	bottom: 0;
	cursor: default;
	left: 0;
	position: fixed;
	right: 0;
	top: 0;
}

.button__link {
	text-decoration: none;
}
View Compiled

External CSS

  1. https://codepen.io/xirclebox/pen/c0f634aba1749dc2b7795f6dee888969.scss

External JavaScript

This Pen doesn't use any external JavaScript resources.