Skip to main content

Stretched link

Add .stretched-link to a link to make its containing block clickable via a ::after pseudo element. In most cases, this means that an element with position: relative; that contains a link with the .stretched-link class is clickable. Please note given how CSS position works, .stretched-link cannot be mixed with most table elements.

Cards have position: relative by default in Kyber, so in this case you can safely add the .stretched-link class to a link in the card without any other HTML changes.

Multiple links and tap targets are not recommended with stretched links. However, some position and z-index styles can help should this be required.

Result
Loading...
Live Editor
<div className="card" style={{ width: '18rem' }}>
	<Placeholder
		width="100%"
		height="180"
		className="card-img-top"
		text={false}
		title="Card image cap"
	/>
	<div className="card-body">
		<h5 className="card-title">Card with stretched link</h5>
		<p className="card-text">
			Some quick example text to build on the card title and make up the bulk of the card’s content.
		</p>
		<a href="#" className="btn btn-primary stretched-link">
			Go somewhere
		</a>
	</div>
</div>

Most custom components do not have position: relative by default, so we need to add the .position-relative here to prevent the link from stretching outside the parent element.

Result
Loading...
Live Editor
<div className="d-flex position-relative">
	<Placeholder
		width="144"
		height="144"
		className="flex-shrink-0 me-3"
		text={false}
		title="Generic placeholder image22222"
	/>
	<div>
		<h5 className="mt-0">Custom component with stretched link</h5>
		<p>
			This is some placeholder content for the custom component. It is intended to mimic what some
			real-world content would look like, and we’re using it here to give the component a bit of
			body and size.
		</p>
		<a href="#" className="stretched-link">
			Go somewhere
		</a>
	</div>
</div>
Result
Loading...
Live Editor
<div className="row g-0 bg-body-secondary position-relative">
	<div className="col-md-6 mb-md-0 p-md-4">
		<Placeholder
			width="100%"
			height="200"
			className="w-100"
			text={false}
			title="Generic placeholder image"
		/>
	</div>
	<div className="col-md-6 p-4 ps-md-0">
		<h5 className="mt-0">Columns with stretched link</h5>
		<p>
			Another instance of placeholder content for this other custom component. It is intended to
			mimic what some real-world content would look like, and we’re using it here to give the
			component a bit of body and size.
		</p>
		<a href="#" className="stretched-link">
			Go somewhere
		</a>
	</div>
</div>

Identifying the containing block​

If the stretched link doesn’t seem to work, the containing block will probably be the cause. The following CSS properties will make an element the containing block:

  • A position value other than static
  • A transform or perspective value other than none
  • A will-change value of transform or perspective
  • A filter value other than none or a will-change value of filter (only works on Firefox)
Result
Loading...
Live Editor
<div className="card" style={{ width: '18rem' }}>
	<Placeholder
		width="100%"
		height="180"
		className="card-img-top"
		text={false}
		title="Card image cap"
	/>
	<div className="card-body">
		<h5 className="card-title">Card with stretched links</h5>
		<p className="card-text">
			Some quick example text to build on the card title and make up the bulk of the card’s content.
		</p>
		<p className="card-text">
			<a href="#" className="stretched-link text-danger" style={{ position: 'relative' }}>
				Stretched link will not work here, because <code>position: relative</code> is added to the
				link
			</a>
		</p>
		<p className="card-text bg-body-tertiary" style={{ transform: 'rotate(0)' }}>
			This{' '}
			<a href="#" className="text-warning stretched-link">
				stretched link
			</a>{' '}
			will only be spread over the <code>p</code>-tag, because a transform is applied to it.
		</p>
	</div>
</div>