Designing Responsive WordPress Pages with HTML and CSS
In this article, we'll explore how developers can design responsive WordPress pages using HTML and CSS, providing practical tips for both new and experienced developers.

Most UI elements aren’t hard to build, they’re just time-consuming enough that you don’t feel like doing it again.
So instead of reinventing the same button, here are 10 UI elements you can copy-paste straight into your project.
Simple, polished, and ready to drop into your next build.
Best for: primary call-to-actions that shouldn’t feel boring (or ignored).
.Btn {
position: relative;
width: 150px;
height: 55px;
border-radius: 45px;
border: none;
background-color: rgb(151, 95, 255);
color: white;
box-shadow: 0px 10px 10px rgb(210, 187, 253) inset,
0px 5px 10px rgba(5, 5, 5, 0.212),
0px -10px 10px rgb(124, 54, 255) inset;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.Btn::before {
width: 70%;
height: 2px;
position: absolute;
background-color: rgba(250, 250, 250, 0.678);
content: "";
filter: blur(1px);
top: 7px;
border-radius: 50%;
}
.Btn::after {
width: 70%;
height: 2px;
position: absolute;
background-color: rgba(250, 250, 250, 0.137);
content: "";
filter: blur(1px);
bottom: 7px;
border-radius: 50%;
}
.Btn:hover {
animation: jello-horizontal 0.9s both;
}
@keyframes jello-horizontal {
0% {
transform: scale3d(1, 1, 1);
}
30% {
transform: scale3d(1.25, 0.75, 1);
}
40% {
transform: scale3d(0.75, 1.25, 1);
}
50% {
transform: scale3d(1.15, 0.85, 1);
}
65% {
transform: scale3d(0.95, 1.05, 1);
}
75% {
transform: scale3d(1.05, 0.95, 1);
}
100% {
transform: scale3d(1, 1, 1);
}
}
Best for: secondary actions, “learn more” buttons, or anywhere you want subtle interaction without stealing the spotlight.
.button {
position: relative;
transition: all 0.3s ease-in-out;
box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.2);
padding-block: 0.5rem;
padding-inline: 1.25rem;
background-color: rgb(0 107 179);
border-radius: 9999px;
display: flex;
align-items: center;
justify-content: center;
color: #ffff;
gap: 10px;
font-weight: bold;
border: 3px solid #ffffff4d;
outline: none;
overflow: hidden;
font-size: 15px;
cursor: pointer;
}
.icon {
width: 24px;
height: 24px;
transition: all 0.3s ease-in-out;
}
.button:hover {
transform: scale(1.05);
border-color: #fff9;
}
.button:hover .icon {
transform: translate(4px);
}
.button:hover::before {
animation: shine 1.5s ease-out infinite;
}
.button::before {
content: "";
position: absolute;
width: 100px;
height: 100%;
background-image: linear-gradient(
120deg,
rgba(255, 255, 255, 0) 30%,
rgba(255, 255, 255, 0.8),
rgba(255, 255, 255, 0) 70%
);
top: 0;
left: -100px;
opacity: 0.6;
}
@keyframes shine {
0% {
left: -100px;
}
60% {
left: 100%;
}
to {
left: 100%;
}
}
Best for: dashboards, profile cards, or layouts that need depth.
.card {
box-sizing: border-box;
width: 190px;
height: 254px;
background: rgba(217, 217, 217, 0.58);
border: 1px solid white;
box-shadow: 12px 17px 51px rgba(0, 0, 0, 0.22);
backdrop-filter: blur(6px);
border-radius: 17px;
text-align: center;
cursor: pointer;
transition: all 0.5s;
display: flex;
align-items: center;
justify-content: center;
user-select: none;
font-weight: bolder;
color: black;
}
.card:hover {
border: 1px solid black;
transform: scale(1.05);
}
.card:active {
transform: scale(0.95) rotateZ(1.7deg);
}
Best for: loading states that don’t make users question their life choices while waiting.
<div class="relative flex w-64 animate-pulse gap-2 p-4">
<div class="h-12 w-12 rounded-full bg-slate-400"></div>
<div class="flex-1">
<div class="mb-1 h-5 w-3/5 rounded-lg bg-slate-400 text-lg"></div>
<div class="h-5 w-[90%] rounded-lg bg-slate-400 text-sm"></div>
</div>
<div class="absolute bottom-5 right-0 h-4 w-4 rounded-full bg-slate-400"></div>
</div>
Best for: settings, preferences, or any yes/no interaction that should feel instant and satisfying.
/* Remove this container when use*/
.component-title {
width: 100%;
position: absolute;
z-index: 999;
top: 30px;
left: 0;
padding: 0;
margin: 0;
font-size: 1rem;
font-weight: 700;
color: #888;
text-align: center;
}
/* The switch - the box around the slider */
.container {
width: 51px;
height: 31px;
position: relative;
}
/* Hide default HTML checkbox */
.checkbox {
opacity: 0;
width: 0;
height: 0;
position: absolute;
}
.switch {
width: 100%;
height: 100%;
display: block;
background-color: #e9e9eb;
border-radius: 16px;
cursor: pointer;
transition: all 0.2s ease-out;
}
/* The slider */
.slider {
width: 27px;
height: 27px;
position: absolute;
left: calc(50% - 27px/2 - 10px);
top: calc(50% - 27px/2);
border-radius: 50%;
background: #FFFFFF;
box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.15), 0px 3px 1px rgba(0, 0, 0, 0.06);
transition: all 0.2s ease-out;
cursor: pointer;
}
.checkbox:checked + .switch {
background-color: #34C759;
}
.checkbox:checked + .switch .slider {
left: calc(50% - 27px/2 + 10px);
top: calc(50% - 27px/2);
}
Best for: dark mode UIs, hero sections,…
.uiverse {
--duration: 7s;
--easing: linear;
--c-color-1: rgba(255, 163, 26, 0.7);
--c-color-2: #1a23ff;
--c-color-3: #e21bda;
--c-color-4: rgba(255, 232, 26, 0.7);
--c-shadow: rgba(255, 223, 87, 0.5);
--c-shadow-inset-top: rgba(255, 223, 52, 0.9);
--c-shadow-inset-bottom: rgba(255, 250, 215, 0.8);
--c-radial-inner: #ffd215;
--c-radial-outer: #fff172;
--c-color: #fff;
-webkit-tap-highlight-color: transparent;
-webkit-appearance: none;
outline: none;
position: relative;
cursor: pointer;
border: none;
display: table;
border-radius: 24px;
padding: 0;
margin: 0;
text-align: center;
font-weight: 600;
font-size: 16px;
letter-spacing: 0.02em;
line-height: 1.5;
color: var(--c-color);
background: radial-gradient(
circle,
var(--c-radial-inner),
var(--c-radial-outer) 80%
);
box-shadow: 0 0 14px var(--c-shadow);
}
.uiverse:before {
content: "";
pointer-events: none;
position: absolute;
z-index: 3;
left: 0;
top: 0;
right: 0;
bottom: 0;
border-radius: 24px;
box-shadow:
inset 0 3px 12px var(--c-shadow-inset-top),
inset 0 -3px 4px var(--c-shadow-inset-bottom);
}
.uiverse .wrapper {
-webkit-mask-image: -webkit-radial-gradient(white, black);
overflow: hidden;
border-radius: 24px;
min-width: 132px;
padding: 12px 0;
}
.uiverse .wrapper span {
display: inline-block;
position: relative;
z-index: 1;
}
.uiverse:hover {
--duration: 1400ms;
}
.uiverse .wrapper .circle {
position: absolute;
left: 0;
top: 0;
width: 40px;
height: 40px;
border-radius: 50%;
filter: blur(var(--blur, 8px));
background: var(--background, transparent);
transform: translate(var(--x, 0), var(--y, 0)) translateZ(0);
animation: var(--animation, none) var(--duration) var(--easing) infinite;
}
.uiverse .wrapper .circle.circle-1,
.uiverse .wrapper .circle.circle-9,
.uiverse .wrapper .circle.circle-10 {
--background: var(--c-color-4);
}
.uiverse .wrapper .circle.circle-3,
.uiverse .wrapper .circle.circle-4 {
--background: var(--c-color-2);
--blur: 14px;
}
.uiverse .wrapper .circle.circle-5,
.uiverse .wrapper .circle.circle-6 {
--background: var(--c-color-3);
--blur: 16px;
}
.uiverse .wrapper .circle.circle-2,
.uiverse .wrapper .circle.circle-7,
.uiverse .wrapper .circle.circle-8,
.uiverse .wrapper .circle.circle-11,
.uiverse .wrapper .circle.circle-12 {
--background: var(--c-color-1);
--blur: 12px;
}
.uiverse .wrapper .circle.circle-1 {
--x: 0;
--y: -40px;
--animation: circle-1;
}
.uiverse .wrapper .circle.circle-2 {
--x: 92px;
--y: 8px;
--animation: circle-2;
}
.uiverse .wrapper .circle.circle-3 {
--x: -12px;
--y: -12px;
--animation: circle-3;
}
.uiverse .wrapper .circle.circle-4 {
--x: 80px;
--y: -12px;
--animation: circle-4;
}
.uiverse .wrapper .circle.circle-5 {
--x: 12px;
--y: -4px;
--animation: circle-5;
}
.uiverse .wrapper .circle.circle-6 {
--x: 56px;
--y: 16px;
--animation: circle-6;
}
.uiverse .wrapper .circle.circle-7 {
--x: 8px;
--y: 28px;
--animation: circle-7;
}
.uiverse .wrapper .circle.circle-8 {
--x: 28px;
--y: -4px;
--animation: circle-8;
}
.uiverse .wrapper .circle.circle-9 {
--x: 20px;
--y: -12px;
--animation: circle-9;
}
.uiverse .wrapper .circle.circle-10 {
--x: 64px;
--y: 16px;
--animation: circle-10;
}
.uiverse .wrapper .circle.circle-11 {
--x: 4px;
--y: 4px;
--animation: circle-11;
}
.uiverse .wrapper .circle.circle-12 {
--blur: 14px;
--x: 52px;
--y: 4px;
--animation: circle-12;
}
@keyframes circle-1 {
33% {
transform: translate(0px, 16px) translateZ(0);
}
66% {
transform: translate(12px, 64px) translateZ(0);
}
}
@keyframes circle-2 {
33% {
transform: translate(80px, -10px) translateZ(0);
}
66% {
transform: translate(72px, -48px) translateZ(0);
}
}
@keyframes circle-3 {
33% {
transform: translate(20px, 12px) translateZ(0);
}
66% {
transform: translate(12px, 4px) translateZ(0);
}
}
@keyframes circle-4 {
33% {
transform: translate(76px, -12px) translateZ(0);
}
66% {
transform: translate(112px, -8px) translateZ(0);
}
}
@keyframes circle-5 {
33% {
transform: translate(84px, 28px) translateZ(0);
}
66% {
transform: translate(40px, -32px) translateZ(0);
}
}
@keyframes circle-6 {
33% {
transform: translate(28px, -16px) translateZ(0);
}
66% {
transform: translate(76px, -56px) translateZ(0);
}
}
@keyframes circle-7 {
33% {
transform: translate(8px, 28px) translateZ(0);
}
66% {
transform: translate(20px, -60px) translateZ(0);
}
}
@keyframes circle-8 {
33% {
transform: translate(32px, -4px) translateZ(0);
}
66% {
transform: translate(56px, -20px) translateZ(0);
}
}
@keyframes circle-9 {
33% {
transform: translate(20px, -12px) translateZ(0);
}
66% {
transform: translate(80px, -8px) translateZ(0);
}
}
@keyframes circle-10 {
33% {
transform: translate(68px, 20px) translateZ(0);
}
66% {
transform: translate(100px, 28px) translateZ(0);
}
}
@keyframes circle-11 {
33% {
transform: translate(4px, 4px) translateZ(0);
}
66% {
transform: translate(68px, 20px) translateZ(0);
}
}
@keyframes circle-12 {
33% {
transform: translate(56px, 0px) translateZ(0);
}
66% {
transform: translate(60px, -32px) translateZ(0);
}
}
Best for: portfolios, product cards, or anything where you want to hide extra info until it actually matters.
.card {
width: 190px;
height: 254px;
border-radius: 20px;
background: #f5f5f5;
position: relative;
padding: 1.8rem;
border: 2px solid #c3c6ce;
transition: 0.5s ease-out;
overflow: visible;
}
.card-details {
color: black;
height: 100%;
gap: .5em;
display: grid;
place-content: center;
}
.card-button {
transform: translate(-50%, 125%);
width: 60%;
border-radius: 1rem;
border: none;
background-color: #008bf8;
color: #fff;
font-size: 1rem;
padding: .5rem 1rem;
position: absolute;
left: 50%;
bottom: 0;
opacity: 0;
transition: 0.3s ease-out;
}
.text-body {
color: rgb(134, 134, 134);
}
/*Text*/
.text-title {
font-size: 1.5em;
font-weight: bold;
}
/*Hover*/
.card:hover {
border-color: #008bf8;
box-shadow: 0 4px 18px 0 rgba(0, 0, 0, 0.25);
}
.card:hover .card-button {
transform: translate(-50%, 50%);
opacity: 1;
}
Best for: featured content, highlights…
.card {
position: relative;
width: 190px;
height: 254px;
background: lightgrey;
box-shadow: #d11bff42 0 15px 40px -5px;
z-index: 1;
border-radius: 21px;
overflow: hidden;
}
.card__content {
background: linear-gradient(rgba(255, 255, 255, 0.473), rgba(150, 150, 150, 0.25));
z-index: 1;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 21px;
}
.card .blob {
position: absolute;
z-index: -1;
border-radius: 5em;
width: 200px;
height: 200px;
}
.card .blob:nth-child(2) {
left: -50px;
top: -90px;
background: #ff930f;
}
.card .blob:nth-child(3) {
left: 110px;
top: -20px;
z-index: -1;
background: #bf0fff;
}
.card .blob:nth-child(4) {
left: -40px;
top: 100px;
background: #ff1b6b;
}
.card .blob:nth-child(5) {
left: 100px;
top: 180px;
background: #0061ff;
}
Best for: sign-up forms, login screens, or anywhere you want users to feel like the form was actually designed
.form {
display: flex;
flex-direction: column;
gap: 10px;
background-color: #ffffff;
padding: 30px;
width: 450px;
border-radius: 20px;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
::placeholder {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
.form button {
align-self: flex-end;
}
.flex-column > label {
color: #151717;
font-weight: 600;
}
.inputForm {
border: 1.5px solid #ecedec;
border-radius: 10px;
height: 50px;
display: flex;
align-items: center;
padding-left: 10px;
transition: 0.2s ease-in-out;
}
.input {
margin-left: 10px;
border-radius: 10px;
border: none;
width: 85%;
height: 100%;
}
.input:focus {
outline: none;
}
.inputForm:focus-within {
border: 1.5px solid #2d79f3;
}
.flex-row {
display: flex;
flex-direction: row;
align-items: center;
gap: 10px;
justify-content: space-between;
}
.flex-row > div > label {
font-size: 14px;
color: black;
font-weight: 400;
}
.span {
font-size: 14px;
margin-left: 5px;
color: #2d79f3;
font-weight: 500;
cursor: pointer;
}
.button-submit {
margin: 20px 0 10px 0;
background-color: #151717;
border: none;
color: white;
font-size: 15px;
font-weight: 500;
border-radius: 10px;
height: 50px;
width: 100%;
cursor: pointer;
}
.button-submit:hover {
background-color: #252727;
}
.p {
text-align: center;
color: black;
font-size: 14px;
margin: 5px 0;
}
.btn {
margin-top: 10px;
width: 100%;
height: 50px;
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
font-weight: 500;
gap: 10px;
border: 1px solid #ededef;
background-color: white;
cursor: pointer;
transition: 0.2s ease-in-out;
}
.btn:hover {
border: 1px solid #2d79f3;
;
}
Best for: code snippets, dashboards, or saving users from manually selecting text.
/* tooltip settings 👇 */
.copy {
/* button */
--button-bg: #353434;
--button-hover-bg: #464646;
--button-text-color: #CCCCCC;
--button-hover-text-color: #8bb9fe;
--button-border-radius: 10px;
--button-diameter: 36px;
--button-outline-width: 1px;
--button-outline-color: rgb(141, 141, 141);
/* tooltip */
--tooltip-bg: #f4f3f3;
--toolptip-border-radius: 4px;
--tooltip-font-family: Menlo, Roboto Mono, monospace;
/* 👆 this field should not be empty */
--tooltip-font-size: 12px;
/* 👆 this field should not be empty */
--tootip-text-color: rgb(50, 50, 50);
--tooltip-padding-x: 7px;
--tooltip-padding-y: 7px;
--tooltip-offset: 8px;
/* --tooltip-transition-duration: 0.3s; */
/* 👆 if you need a transition,
just remove the comment,
but I didn't like the transition :| */
}
.copy {
box-sizing: border-box;
width: var(--button-diameter);
height: var(--button-diameter);
border-radius: var(--button-border-radius);
background-color: var(--button-bg);
color: var(--button-text-color);
border: none;
cursor: pointer;
position: relative;
outline: none;
}
.tooltip {
position: absolute;
opacity: 0;
visibility: 0;
top: 0;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
font: var(--tooltip-font-size) var(--tooltip-font-family);
color: var(--tootip-text-color);
background: var(--tooltip-bg);
padding: var(--tooltip-padding-y) var(--tooltip-padding-x);
border-radius: var(--toolptip-border-radius);
pointer-events: none;
transition: all var(--tooltip-transition-duration) cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
.tooltip::before {
content: attr(data-text-initial);
}
.tooltip::after {
content: "";
position: absolute;
bottom: calc(var(--tooltip-padding-y) / 2 * -1);
width: var(--tooltip-padding-y);
height: var(--tooltip-padding-y);
background: inherit;
left: 50%;
transform: translateX(-50%) rotate(45deg);
z-index: -999;
pointer-events: none;
}
.copy svg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.checkmark {
display: none;
}
/* actions */
.copy:hover .tooltip,
.copy:focus:not(:focus-visible) .tooltip {
opacity: 1;
visibility: visible;
top: calc((100% + var(--tooltip-offset)) * -1);
}
.copy:focus:not(:focus-visible) .tooltip::before {
content: attr(data-text-end);
}
.copy:focus:not(:focus-visible) .clipboard {
display: none;
}
.copy:focus:not(:focus-visible) .checkmark {
display: block;
}
.copy:hover,
.copy:focus {
background-color: var(--button-hover-bg);
}
.copy:active {
outline: var(--button-outline-width) solid var(--button-outline-color);
}
.copy:hover svg {
color: var(--button-hover-text-color);
}
You don’t need to rebuild the same components every time.
Copy what works, customize it, and spend your time on the parts users actually notice.
In this article, we'll explore how developers can design responsive WordPress pages using HTML and CSS, providing practical tips for both new and experienced developers.
This guide covers essential topics that we need to know to make high-quality designs **that are **consistent with Apple’s guidelines.
Why did we bother building all these fancy web interfaces, when all we ever needed was a text box?