Real Estate Listing Card Template
Preview
Edit
Download
Run
Download Options
HTML File
Download as .html file
CSS File
Download as .css file
JavaScript File
Download as .js file
Combined HTML
All code in one HTML file
Project ZIP
All files in a ZIP archive
Cancel
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Elite Plots | Premium Real Estate Listings</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> </head> <body> <div class="container"> <div class="header"> <h1>Discover <span>Elite Plots</span></h1> <div class="filters"> <button class="filter-btn active" data-filter="all">All Plots</button> <button class="filter-btn" data-filter="featured">Featured</button> <button class="filter-btn" data-filter="premium">Premium</button> <button class="filter-btn" data-filter="value">Best Value</button> </div> </div> <div class="cards-container"> <!-- Plot Card 1 --> <div class="plot-card" data-category="featured"> <div class="card-badge featured"> <i class="fas fa-star"></i> Featured </div> <div class="image-container"> <img src="https://images.unsplash.com/photo-1560518883-ce09059eeffa?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1200&q=80" alt="Lakeside Plot" class="plot-image"> <div class="overlay"> <h3 class="plot-title">Lakeside Residency</h3> <p class="plot-subtitle">Waterfront living at its finest</p> </div> </div> <div class="card-content"> <div class="plot-details"> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-expand-arrows-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Plot Size</div> <div class="detail-value">2,400 sq.ft</div> </div> </div> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-map-marker-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Location</div> <div class="detail-value">Green Valley</div> </div> </div> </div> <div class="price-section"> <div class="price-label"> <span>Price per sq.ft</span> <span class="price-tag">Premium Location</span> </div> <div class="price-value">₹3,200 <span class="price-unit">/ sq.ft</span></div> <div class="total-price">Total: ₹76.8 Lakhs</div> </div> <button class="enquiry-btn" data-plot="Lakeside Residency"> <span>Enquire Now</span> <i class="fas fa-arrow-right"></i> </button> </div> </div> <!-- Plot Card 2 --> <div class="plot-card" data-category="premium"> <div class="card-badge premium"> <i class="fas fa-crown"></i> Premium </div> <div class="image-container"> <img src="https://images.unsplash.com/photo-1545324418-cc1a3fa10c00?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1200&q=80" alt="Hillview Plot" class="plot-image"> <div class="overlay"> <h3 class="plot-title">Hillview Estate</h3> <p class="plot-subtitle">Panoramic mountain views</p> </div> </div> <div class="card-content"> <div class="plot-details"> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-expand-arrows-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Plot Size</div> <div class="detail-value">4,500 sq.ft</div> </div> </div> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-map-marker-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Location</div> <div class="detail-value">Sunset Hills</div> </div> </div> </div> <div class="price-section"> <div class="price-label"> <span>Price per sq.ft</span> <span class="price-tag">Exclusive Area</span> </div> <div class="price-value">₹2,850 <span class="price-unit">/ sq.ft</span></div> <div class="total-price">Total: ₹1.28 Crores</div> </div> <button class="enquiry-btn" data-plot="Hillview Estate"> <span>Enquire Now</span> <i class="fas fa-arrow-right"></i> </button> </div> </div> <!-- Plot Card 3 --> <div class="plot-card" data-category="value"> <div class="card-badge value"> <i class="fas fa-badge-percent"></i> Best Value </div> <div class="image-container"> <img src="https://images.unsplash.com/photo-1464207687429-7505649dae38?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1200&q=80" alt="City Plot" class="plot-image"> <div class="overlay"> <h3 class="plot-title">Central City Plot</h3> <p class="plot-subtitle">Heart of the city convenience</p> </div> </div> <div class="card-content"> <div class="plot-details"> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-expand-arrows-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Plot Size</div> <div class="detail-value">1,800 sq.ft</div> </div> </div> <div class="detail-item"> <div class="detail-icon"> <i class="fas fa-map-marker-alt"></i> </div> <div class="detail-text"> <div class="detail-label">Location</div> <div class="detail-value">Downtown Central</div> </div> </div> </div> <div class="price-section"> <div class="price-label"> <span>Price per sq.ft</span> <span class="price-tag">Prime Location</span> </div> <div class="price-value">₹4,500 <span class="price-unit">/ sq.ft</span></div> <div class="total-price">Total: ₹81 Lakhs</div> </div> <button class="enquiry-btn" data-plot="Central City Plot"> <span>Enquire Now</span> <i class="fas fa-arrow-right"></i> </button> </div> </div> </div> </div> <!-- Enquiry Modal --> <div class="modal" id="enquiryModal"> <div class="modal-content"> <button class="close-modal" id="closeModal">×</button> <h3>Plot Enquiry</h3> <p id="modalPlotName">Submit your details and our representative will contact you within 24 hours.</p> <form id="enquiryForm"> <div class="form-group"> <label for="name">Full Name</label> <input type="text" id="name" class="form-control" placeholder="Enter your name" required> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" class="form-control" placeholder="Enter your email" required> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" class="form-control" placeholder="Enter your phone number" required> </div> <div class="form-group"> <label for="message">Message (Optional)</label> <textarea id="message" class="form-control" rows="3" placeholder="Any specific questions or requirements?"></textarea> </div> <button type="submit" class="submit-btn">Submit Enquiry</button> </form> </div> </div> </body> </html>
CSS
:root { --primary: #2563eb; --primary-dark: #1d4ed8; --secondary: #0f172a; --accent: #10b981; --light: #f8fafc; --gray-light: #e2e8f0; --gray: #94a3b8; --gray-dark: #64748b; --card-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05); --card-shadow-hover: 0 20px 40px -10px rgba(0, 0, 0, 0.1); --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); --radius: 16px; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', sans-serif; background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); color: var(--secondary); line-height: 1.6; min-height: 100vh; padding: 0; display: flex; flex-direction: column; align-items: center; } .container { width: 100%; max-width: 1400px; padding: 60px 40px; } /* Header Styles */ .header { text-align: center; margin-bottom: 70px; position: relative; } .header h1 { font-size: 3.2rem; font-weight: 700; color: var(--secondary); margin-bottom: 16px; letter-spacing: -0.5px; } .header h1 span { color: var(--primary); position: relative; } .header h1 span::after { content: ''; position: absolute; bottom: 5px; left: 0; width: 100%; height: 6px; background: rgba(37, 99, 235, 0.15); z-index: -1; border-radius: 3px; } .subtitle { font-size: 1.2rem; color: var(--gray-dark); max-width: 600px; margin: 0 auto 30px; font-weight: 400; } .filters { display: flex; justify-content: center; gap: 15px; flex-wrap: wrap; margin-top: 40px; } .filter-btn { padding: 10px 22px; background: white; border: 1px solid var(--gray-light); border-radius: 50px; color: var(--gray-dark); font-weight: 500; cursor: pointer; transition: var(--transition); } .filter-btn.active, .filter-btn:hover { background: var(--primary); color: white; border-color: var(--primary); box-shadow: 0 5px 15px rgba(37, 99, 235, 0.2); } /* Cards Container */ .cards-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); gap: 40px; margin-bottom: 80px; } /* Card Styles */ .plot-card { background: white; border-radius: var(--radius); overflow: hidden; box-shadow: var(--card-shadow); transition: var(--transition); position: relative; height: 100%; display: flex; flex-direction: column; } .plot-card:hover { transform: translateY(-12px); box-shadow: var(--card-shadow-hover); } .card-badge { position: absolute; top: 20px; left: 20px; padding: 8px 18px; font-size: 0.85rem; font-weight: 600; border-radius: 50px; z-index: 2; letter-spacing: 0.3px; } .featured { background: linear-gradient(90deg, var(--primary) 0%, #3b82f6 100%); color: white; } .premium { background: linear-gradient(90deg, #f59e0b 0%, #fbbf24 100%); color: white; } .value { background: linear-gradient(90deg, var(--accent) 0%, #34d399 100%); color: white; } .image-container { height: 240px; width: 100%; position: relative; overflow: hidden; } .plot-image { width: 100%; height: 100%; object-fit: cover; transition: var(--transition); } .plot-card:hover .plot-image { transform: scale(1.05); } .overlay { position: absolute; bottom: 0; left: 0; width: 100%; background: linear-gradient(to top, rgba(0,0,0,0.7), transparent); color: white; padding: 20px; } .plot-title { font-size: 1.6rem; font-weight: 700; margin-bottom: 5px; } .plot-subtitle { font-size: 1rem; font-weight: 400; opacity: 0.9; } /* Card Content */ .card-content { padding: 28px; flex-grow: 1; display: flex; flex-direction: column; } .plot-details { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 30px; } .detail-item { display: flex; align-items: center; gap: 14px; } .detail-icon { width: 50px; height: 50px; background: #f1f5f9; border-radius: 12px; display: flex; align-items: center; justify-content: center; color: var(--primary); font-size: 1.2rem; transition: var(--transition); } .plot-card:hover .detail-icon { background: var(--primary); color: white; transform: scale(1.05); } .detail-text { flex: 1; } .detail-label { font-size: 0.85rem; color: var(--gray-dark); margin-bottom: 4px; text-transform: uppercase; letter-spacing: 0.5px; } .detail-value { font-size: 1.2rem; font-weight: 700; color: var(--secondary); } /* Price Section */ .price-section { background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); padding: 22px; border-radius: 12px; margin-bottom: 25px; border-left: 4px solid var(--primary); } .price-label { font-size: 0.9rem; color: var(--gray-dark); margin-bottom: 8px; display: flex; justify-content: space-between; } .price-tag { background: var(--primary); color: white; padding: 4px 10px; border-radius: 4px; font-size: 0.8rem; font-weight: 600; } .price-value { font-size: 1.8rem; font-weight: 800; color: var(--secondary); line-height: 1; } .price-unit { font-size: 1rem; color: var(--gray-dark); font-weight: 500; } .total-price { font-size: 1rem; color: var(--accent); font-weight: 600; margin-top: 8px; } /* Button */ .enquiry-btn { display: flex; align-items: center; justify-content: center; gap: 12px; width: 100%; padding: 18px; background: linear-gradient(90deg, var(--primary) 0%, var(--primary-dark) 100%); color: white; border: none; border-radius: 12px; font-size: 1.05rem; font-weight: 600; cursor: pointer; transition: var(--transition); text-decoration: none; margin-top: auto; } .enquiry-btn:hover { box-shadow: 0 10px 20px rgba(37, 99, 235, 0.3); transform: translateY(-2px); } .enquiry-btn i { font-size: 1.1rem; transition: var(--transition); } .enquiry-btn:hover i { transform: translateX(5px); } /* Modal */ .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 1000; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.3s ease; } .modal.active { display: flex; opacity: 1; } .modal-content { background: white; width: 90%; max-width: 500px; border-radius: var(--radius); padding: 40px; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); transform: translateY(20px); transition: transform 0.4s ease; } .modal.active .modal-content { transform: translateY(0); } .modal h3 { font-size: 1.8rem; margin-bottom: 10px; color: var(--secondary); } .modal p { color: var(--gray-dark); margin-bottom: 25px; } .close-modal { position: absolute; top: 20px; right: 20px; background: none; border: none; font-size: 1.5rem; color: var(--gray); cursor: pointer; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; font-weight: 500; color: var(--secondary); } .form-control { width: 100%; padding: 14px; border: 1px solid var(--gray-light); border-radius: 8px; font-size: 1rem; transition: var(--transition); } .form-control:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } .submit-btn { width: 100%; padding: 16px; background: var(--primary); color: white; border: none; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: var(--transition); } .submit-btn:hover { background: var(--primary-dark); } /* Responsive */ @media (max-width: 1200px) { .cards-container { grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); } } @media (max-width: 768px) { .container { padding: 40px 20px; } .header h1 { font-size: 2.5rem; } .cards-container { grid-template-columns: 1fr; max-width: 500px; margin: 0 auto 60px; } .plot-details { grid-template-columns: 1fr; gap: 20px; } .filters { gap: 10px; } }
JavaScript
// DOM Elements const filterButtons = document.querySelectorAll('.filter-btn'); const plotCards = document.querySelectorAll('.plot-card'); const enquiryButtons = document.querySelectorAll('.enquiry-btn'); const modal = document.getElementById('enquiryModal'); const closeModal = document.getElementById('closeModal'); const modalPlotName = document.getElementById('modalPlotName'); const enquiryForm = document.getElementById('enquiryForm'); // Filter functionality filterButtons.forEach(button => { button.addEventListener('click', () => { // Update active filter button filterButtons.forEach(btn => btn.classList.remove('active')); button.classList.add('active'); const filter = button.getAttribute('data-filter'); // Show/hide cards based on filter plotCards.forEach(card => { const category = card.getAttribute('data-category'); if (filter === 'all' || filter === category) { card.style.display = 'flex'; setTimeout(() => { card.style.opacity = '1'; card.style.transform = 'translateY(0)'; }, 10); } else { card.style.opacity = '0'; card.style.transform = 'translateY(20px)'; setTimeout(() => { card.style.display = 'none'; }, 300); } }); }); }); // Modal functionality enquiryButtons.forEach(button => { button.addEventListener('click', () => { const plotName = button.getAttribute('data-plot'); modalPlotName.textContent = `Interested in ${plotName}. Submit your details and our representative will contact you within 24 hours.`; modal.classList.add('active'); document.body.style.overflow = 'hidden'; }); }); // Close modal closeModal.addEventListener('click', () => { modal.classList.remove('active'); document.body.style.overflow = 'auto'; }); // Close modal when clicking outside modal.addEventListener('click', (e) => { if (e.target === modal) { modal.classList.remove('active'); document.body.style.overflow = 'auto'; } }); // Form submission enquiryForm.addEventListener('submit', (e) => { e.preventDefault(); // Get form values const name = document.getElementById('name').value; const email = document.getElementById('email').value; const phone = document.getElementById('phone').value; // In a real app, you would send this data to a server // For demo purposes, we'll show an alert and reset the form alert(`Thank you ${name}! Your enquiry has been submitted. We'll contact you at ${phone} or ${email} within 24 hours.`); // Reset form and close modal enquiryForm.reset(); modal.classList.remove('active'); document.body.style.overflow = 'auto'; }); // Add subtle hover effect to cards plotCards.forEach(card => { card.addEventListener('mouseenter', function() { this.style.zIndex = '10'; }); card.addEventListener('mouseleave', function() { this.style.zIndex = '1'; }); }); // Initialize with animation document.addEventListener('DOMContentLoaded', () => { plotCards.forEach((card, index) => { card.style.opacity = '0'; card.style.transform = 'translateY(30px)'; setTimeout(() => { card.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; card.style.opacity = '1'; card.style.transform = 'translateY(0)'; }, 100 + index * 150); }); });
Output Preview
Desktop
Mobile
Fullscreen