SolutionsCase StudiesAI ToolsResourcesAboutContact
Get Your Free AI Automation Audit Book a Free 30-Minute Strategy Call
Playground~/frontend Open editor

~/css/profile-cards

7 CSS Profile Cards

5 Pure CSS2 with JSPublished 2026-10-05Free · no sign-up

Seven profile cards: a centred team member card, a social profile with a cover banner and counts, a compact contact row with status, a frosted glass card, a freelancer card with skills and rate, a card that flips to contact details and an author byline for articles.

01. Centred Profile Card

ProfileCard

A team member card with an initials avatar, name, role, a short bio and two links. The links have visible text rather than icon-only buttons, and the card is an article with the person's name as its heading.

View code
<article class="pf1"><span class="av" aria-hidden="true">NK</span><h3>Noor Khan</h3><p class="r">Lead product designer</p><p class="b">Designs checkout flows and leads our weekly accessibility reviews.</p><p class="l"><a href="#noor-work">Portfolio</a><a href="#noor-email">Email</a></p></article>
.pf1 { width: 250px; max-width: 100%; box-sizing: border-box; padding: 24px 20px; border: 1px solid #e4e7ec; border-radius: 18px; background: #fff; text-align: center; font-family: Inter, system-ui, sans-serif; color: #101828; }
.pf1 .av { display: inline-grid; place-items: center; width: 72px; height: 72px; border-radius: 50%; background: linear-gradient(135deg, #c7d2fe, #a5b4fc); color: #312e81; font-weight: 800; font-size: 22px; }
.pf1 h3 { margin: 12px 0 2px; font-size: 18px; }
.pf1 .r { margin: 0; color: #6941c6; font-weight: 600; font-size: 14px; }
.pf1 .b { margin: 10px 0 14px; color: #475467; font-size: 14px; line-height: 1.5; }
.pf1 .l { display: flex; justify-content: center; gap: 8px; margin: 0; }
.pf1 a { padding: 8px 14px; border: 1px solid #d0d5dd; border-radius: 8px; color: #344054; font-size: 13px; font-weight: 600; text-decoration: none; }
.pf1 a:hover { background: #f9fafb; }
.pf1 a:focus-visible { outline: 3px solid #84adff; outline-offset: 2px; }

02. Profile with Cover Banner

ProfileSocial

A social-style profile: a gradient cover banner, an avatar overlapping its bottom edge, and post and follower counts. The counts are a description list, so each number is paired with its label for assistive technology.

View code
<article class="pf2"><div class="cov" aria-hidden="true"></div><span class="av" aria-hidden="true">JL</span><h3>Jules Laurent</h3><p class="h">@juleslaurent · Lyon</p><dl><div><dt>Posts</dt><dd>214</dd></div><div><dt>Followers</dt><dd>8.1k</dd></div><div><dt>Following</dt><dd>312</dd></div></dl><button type="button" aria-pressed="false">Follow</button></article>
.pf2 { width: 270px; max-width: 100%; box-sizing: border-box; border: 1px solid #28324f; border-radius: 18px; background: #121828; overflow: hidden; font-family: Inter, system-ui, sans-serif; color: #e2e8f0; text-align: center; padding-bottom: 18px; }
.pf2 .cov { height: 80px; background: linear-gradient(120deg, #f472b6, #8b5cf6, #22d3ee); }
.pf2 .av { display: inline-grid; place-items: center; width: 74px; height: 74px; margin-top: -37px; box-sizing: border-box; border: 4px solid #121828; border-radius: 50%; background: #334155; color: #fff; font-weight: 800; font-size: 20px; }
.pf2 h3 { margin: 6px 0 0; color: #fff; } .pf2 .h { margin: 2px 0 12px; color: #94a3b8; font-size: 13px; }
.pf2 dl { display: flex; justify-content: center; gap: 18px; margin: 0 0 14px; }
.pf2 dl div { display: flex; flex-direction: column-reverse; }
.pf2 dt { color: #94a3b8; font-size: 12px; } .pf2 dd { margin: 0; color: #fff; font-weight: 800; }
.pf2 button { padding: 9px 26px; border: 0; border-radius: 999px; background: #fff; color: #0f172a; font: 700 14px Inter, system-ui, sans-serif; cursor: pointer; }
.pf2 button[aria-pressed="true"] { background: transparent; color: #fff; box-shadow: inset 0 0 0 1px #475569; }
.pf2 button:focus-visible { outline: 3px solid #a5b4fc; outline-offset: 2px; }
var b = document.querySelector('.pf2 button');
b.onclick = function () { var on = b.getAttribute('aria-pressed') !== 'true'; b.setAttribute('aria-pressed', on); b.textContent = on ? 'Following' : 'Follow'; };

03. Horizontal Contact Card

ProfileContact

A compact contact row for a sidebar or team list: avatar, name, role and status. The green online dot is decorative and the status is also written in a visually hidden span, so colour is not the only way to tell.

View code
<article class="pf3"><span class="av" aria-hidden="true">OB<i></i></span><div><h3>Olu Bakare</h3><p>Support lead <span class="sr">· Online</span></p></div><a href="#message-olu" aria-label="Message Olu Bakare">Message</a></article>
.pf3 { display: flex; align-items: center; gap: 12px; width: 320px; max-width: 100%; box-sizing: border-box; padding: 12px; border: 1px solid #e4e7ec; border-radius: 14px; background: #fff; font-family: Inter, system-ui, sans-serif; }
.pf3 .av { position: relative; flex: none; display: grid; place-items: center; width: 46px; height: 46px; border-radius: 50%; background: #fef0c7; color: #93370d; font-weight: 800; }
.pf3 .av i { position: absolute; right: 0; bottom: 0; width: 12px; height: 12px; border: 2px solid #fff; border-radius: 50%; background: #17b26a; }
.pf3 div { flex: 1; min-width: 0; } .pf3 h3 { margin: 0; color: #101828; font-size: 15px; } .pf3 p { margin: 0; color: #475467; font-size: 13px; }
.pf3 .sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.pf3 a { padding: 8px 12px; border-radius: 8px; background: #101828; color: #fff; font-size: 13px; font-weight: 700; text-decoration: none; }
.pf3 a:focus-visible { outline: 3px solid #84adff; outline-offset: 2px; }

04. Glass Profile on a Gradient

ProfileGlass

A frosted glass profile card over colourful shapes, using backdrop-filter blur and a translucent dark tint. Text stays white on the darkened glass so contrast holds even where the background behind it is bright.

View code
<div class="pf4"><span class="blob a" aria-hidden="true"></span><span class="blob b" aria-hidden="true"></span><article><span class="av" aria-hidden="true">EV</span><h3>Elena Vargas</h3><p>Photographer · Mexico City</p><a href="#elena">View work</a></article></div>
.pf4 { position: relative; display: grid; place-items: center; width: 290px; max-width: 100%; height: 300px; font-family: Inter, system-ui, sans-serif; }
.pf4 .blob { position: absolute; border-radius: 50%; }
.pf4 .a { width: 150px; height: 150px; top: 10px; left: 10px; background: #f43f5e; }
.pf4 .b { width: 170px; height: 170px; right: 0; bottom: 0; background: #06b6d4; }
.pf4 article { position: relative; width: 220px; max-width: 100%; padding: 22px; box-sizing: border-box; border: 1px solid rgba(255,255,255,.25); border-radius: 20px; background: rgba(15,23,42,.45); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); color: #fff; text-align: center; }
.pf4 .av { display: inline-grid; place-items: center; width: 60px; height: 60px; border-radius: 50%; background: rgba(255,255,255,.2); font-weight: 800; }
.pf4 h3 { margin: 10px 0 2px; } .pf4 p { margin: 0 0 14px; color: #e2e8f0; font-size: 13px; }
.pf4 a { display: inline-block; padding: 8px 16px; border-radius: 999px; background: #fff; color: #0f172a; font-weight: 700; font-size: 13px; text-decoration: none; }
.pf4 a:focus-visible { outline: 3px solid #fff; outline-offset: 3px; }

05. Freelancer Card with Skills

ProfileTags

A freelancer card with an availability badge, a day rate and skill tags in a list. The rate uses a data element with a machine-readable value, and Book a call is a link because it goes to a booking page.

View code
<article class="pf5"><div class="top"><span class="av" aria-hidden="true">RS</span><p class="badge">Available from 1 Nov</p></div><h3>Ravi Shah</h3><p class="r">Shopify developer · <data value="450">$450</data> / day</p><ul><li>Liquid</li><li>Hydrogen</li><li>Checkout UI</li><li>Performance</li></ul><a href="#book-ravi">Book a call</a></article>
.pf5 { width: 280px; max-width: 100%; box-sizing: border-box; padding: 18px; border: 1px solid #e4e7ec; border-radius: 16px; background: #fff; font-family: Inter, system-ui, sans-serif; color: #101828; }
.pf5 .top { display: flex; justify-content: space-between; align-items: start; }
.pf5 .av { display: grid; place-items: center; width: 52px; height: 52px; border-radius: 14px; background: #d1fadf; color: #054f31; font-weight: 800; }
.pf5 .badge { margin: 0; padding: 4px 8px; border-radius: 999px; background: #ecfdf3; color: #067647; font-size: 12px; font-weight: 700; }
.pf5 h3 { margin: 12px 0 2px; } .pf5 .r { margin: 0 0 12px; color: #475467; font-size: 14px; }
.pf5 ul { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px; padding: 0; list-style: none; }
.pf5 li { padding: 4px 9px; border-radius: 6px; background: #f2f4f7; color: #344054; font-size: 12px; font-weight: 600; }
.pf5 a { display: block; padding: 10px; border-radius: 10px; background: #067647; color: #fff; text-align: center; font-weight: 700; text-decoration: none; }
.pf5 a:focus-visible { outline: 3px solid #75e0a7; outline-offset: 2px; }

06. Profile Card That Flips

Profile3D

The front shows the person and the back shows contact details, flipped by a button with aria-pressed rather than by hover, so it works on touch and with the keyboard. Both faces stay in the DOM and the hidden face is made inert.

View code
<div class="pf6"><div class="in"><section class="f"><span class="av" aria-hidden="true">MT</span><h3>Mei Tanaka</h3><p>Data engineer</p></section><section class="bk" inert><h3>Contact Mei</h3><p>mei@example.com<br>Tokyo, UTC+9</p></section></div><button type="button" aria-pressed="false">Show contact</button></div>
.pf6 { display: grid; justify-items: center; gap: 10px; perspective: 900px; font-family: Inter, system-ui, sans-serif; }
.pf6 .in { position: relative; width: 230px; max-width: 100%; height: 200px; transform-style: preserve-3d; transition: transform .6s ease; }
.pf6.flip .in { transform: rotateY(180deg); }
.pf6 section { position: absolute; inset: 0; display: grid; align-content: center; justify-items: center; gap: 4px; border-radius: 18px; backface-visibility: hidden; text-align: center; }
.pf6 .f { background: linear-gradient(160deg, #0f766e, #134e4a); color: #ccfbf1; }
.pf6 .bk { background: #f0fdfa; color: #134e4a; transform: rotateY(180deg); }
.pf6 .av { display: grid; place-items: center; width: 60px; height: 60px; border-radius: 50%; background: #ccfbf1; color: #134e4a; font-weight: 800; }
.pf6 h3 { margin: 6px 0 0; } .pf6 p { margin: 0; font-size: 14px; }
.pf6 .f h3 { color: #fff; }
.pf6 button { padding: 8px 14px; border: 1px solid #2dd4bf; border-radius: 999px; background: transparent; color: #99f6e4; font: 600 13px Inter, system-ui, sans-serif; cursor: pointer; }
.pf6 button:focus-visible { outline: 2px solid #99f6e4; outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .pf6 .in { transition: none; } }
var w = document.querySelector('.pf6'), b = w.querySelector('button'), f = w.querySelector('.f'), bk = w.querySelector('.bk');
b.onclick = function () { var on = w.classList.toggle('flip'); b.setAttribute('aria-pressed', on); b.textContent = on ? 'Show profile' : 'Show contact'; f.inert = on; bk.inert = !on; };

07. Author Byline Card

ProfileBlog

An author box for the end of an article: small avatar, the name as a link to the author page, a one-line bio and the update date in a time element. It is the kind of byline that helps readers, and search engines, see who wrote the piece.

View code
<aside class="pf7" aria-label="About the author"><span class="av" aria-hidden="true">AK</span><div><p class="n">Written by <a href="#author-amara">Amara Kone</a></p><p class="b">Writes about frontend performance and design systems.</p><p class="d">Updated <time datetime="2026-10-02">2 October 2026</time></p></div></aside>
.pf7 { display: flex; gap: 14px; width: 340px; max-width: 100%; box-sizing: border-box; padding: 16px 0; border-top: 1px solid #e4e7ec; border-bottom: 1px solid #e4e7ec; font-family: Inter, system-ui, sans-serif; }
.pf7 .av { flex: none; display: grid; place-items: center; width: 48px; height: 48px; border-radius: 50%; background: #fce7f6; color: #9e165f; font-weight: 800; }
.pf7 p { margin: 0; } .pf7 .n { color: #101828; font-weight: 600; } .pf7 a { color: #9e165f; }
.pf7 .b { margin: 2px 0; color: #475467; font-size: 14px; } .pf7 .d { color: #475467; font-size: 13px; }
.pf7 a:focus-visible { outline: 3px solid #f9a8d4; outline-offset: 2px; border-radius: 3px; }

About these CSS Profile Cards

Name as the heading

A profile card is about one person, so make their name the card's heading. People using screen readers can then list and jump between the people on a team page.

Avatars without photos

Initials in a coloured circle work at any size and need no image. Mark them aria-hidden="true" because the name is already in the heading; with a real photo, use an empty alt for the same reason.

Counts as a description list

Followers, posts and similar stats are label and value pairs, which is what <dl> is for. Visually you can still show the number above the label with flex-direction: column-reverse.

Status is more than a dot

A green dot for online means nothing to someone who cannot see colour. Add the status in text, even if it is visually hidden.

Frequently asked questions

Are the people in these demos real?

No. Names and details are placeholders; replace them with your own team.

Should the whole card be a link?

Only if it has a single destination. Cards with several links, such as portfolio and email, should keep separate links.

Does an author byline help SEO?

It helps readers judge who wrote something, which search engines also look for. Link it to an author page with more detail.