Jak vytvořit realistický scan efekt v CSS

1. Základní setup - papírové pozadí

body {
    background: #f8f8f8; /* Světle šedé pozadí místo bílé */
    text-rendering: optimizeSpeed; /* Vypne font smoothing pro scan efekt */
    -webkit-font-smoothing: none;
    -moz-osx-font-smoothing: unset;
}

.invoice-container {
    background: #fefcf9; /* Krémově bílá místo čisté bílé */
    transform: rotate(-0.1deg); /* Mírné otočení simulující scan */
    border: 1px solid rgba(200,200,200,0.3);
}

2. Papírová textura - základní vrstva

.invoice-container::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    background: 
        radial-gradient(circle at 20% 30%, rgba(0,0,0,0.01) 1px, transparent 1px),
        radial-gradient(circle at 80% 70%, rgba(0,0,0,0.008) 1px, transparent 1px),
        radial-gradient(circle at 40% 80%, rgba(0,0,0,0.006) 1px, transparent 1px),
        linear-gradient(90deg, transparent 98%, rgba(0,0,0,0.003) 99%, transparent 100%);
    background-size: 30px 30px, 25px 25px, 35px 35px, 100% 2px;
    pointer-events: none;
    opacity: 0.7;
}

3. Scan linie - horizontální artefakty

.invoice-container::after {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    background: repeating-linear-gradient(
        0deg,
        transparent,
        transparent 1px,
        rgba(0,0,0,0.004) 1px,
        rgba(0,0,0,0.004) 2px
    );
    pointer-events: none;
}

4. Stárnutí papíru v rozích

.invoice-container {
    background: 
        radial-gradient(circle at 0% 0%, rgba(139,69,19,0.01) 0%, transparent 20%),
        radial-gradient(circle at 100% 0%, rgba(139,69,19,0.008) 0%, transparent 20%),
        radial-gradient(circle at 0% 100%, rgba(139,69,19,0.006) 0%, transparent 20%),
        radial-gradient(circle at 100% 100%, rgba(139,69,19,0.01) 0%, transparent 20%),
        #fefcf9;
}

5. Textové efekty - simulace komprese

/* Mírné stíny na textu */
h1, h3, h4, strong {
    text-shadow: 0.2px 0.2px 0.2px rgba(0,0,0,0.05);
    color: #0f0f0f; /* Místo černé používej tmavě šedou */
    letter-spacing: 0.02em; /* Mírné rozestupy simulující kompresi */
}

/* Různé opacity pro simulaci scan nekonzistence */
.contact-left { opacity: 0.99; }
.contact-right { opacity: 0.98; }

6. Tabulka - správné bordery a pozadí

.services-table {
    width: 100%;
    border-collapse: separate; /* KLÍČOVÉ - lepší kontrola borderů */
    border-spacing: 0;
    border: 2px solid #888; /* Vnější border */
    transform: rotate(0.05deg); /* Mírné otočení tabulky */
}

.services-table th {
    background: #fefcf9; /* Stejné pozadí jako dokument */
    background-image: 
        radial-gradient(circle at 20% 30%, #f8f8f8 1px, transparent 1px),
        radial-gradient(circle at 80% 70%, #f9f9f9 1px, transparent 1px);
    background-size: 30px 30px, 25px 25px;
    border-right: 2px solid #888;
    border-bottom: 2px solid #888;
    text-shadow: 0.1px 0.1px 0.1px rgba(0,0,0,0.03);
}

.services-table td {
    border-right: 2px solid #888;
    border-bottom: 2px solid #888;
    background: #fefcf9; /* Stejné pozadí jako dokument */
    background-image: 
        radial-gradient(circle at 25% 35%, #f8f8f8 1px, transparent 1px),
        radial-gradient(circle at 75% 65%, #f9f9f9 1px, transparent 1px);
    background-size: 28px 28px, 23px 23px;
}

/* Odstraň bordery na posledních buňkách */
.services-table th:last-child,
.services-table td:last-child {
    border-right: none;
}

.services-table tr:last-child td {
    border-bottom: none;
}

/* Simulace misalignment jednotlivých řádků */
.services-table tbody tr:nth-child(3) { transform: translateX(0.2px); }
.services-table tbody tr:nth-child(5) { transform: translateX(-0.2px); }

7. Speciální handling pro obrázky (podpis)

.signature-section {
    position: relative;
    background: #fefcf9; /* Stejné pozadí jako dokument */
    padding: 15px;
    display: inline-block;
    transform: rotate(-0.05deg);
}

.signature-section::before {
    /* Stejná textura jako main dokument */
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    background: 
        radial-gradient(circle at 30% 40%, rgba(0,0,0,0.01) 1px, transparent 1px),
        radial-gradient(circle at 70% 60%, rgba(0,0,0,0.008) 1px, transparent 1px);
    background-size: 25px 25px, 30px 30px;
    pointer-events: none;
    opacity: 0.8;
}

.signature-section img {
    filter: contrast(0.95) brightness(1.02) sepia(0.02) saturate(0.9);
    opacity: 0.95;
    mix-blend-mode: multiply; /* Klíčové - míchá obrázek s pozadím */
    position: relative;
    z-index: 1;
}

💡 Tip: Klíčové CSS vlastnosti

⚠️ Pozor na

8. PDF kompatibilita

@media print {
    * {
        -webkit-print-color-adjust: exact !important;
        color-adjust: exact !important;
        print-color-adjust: exact !important;
    }
    body {
        background: #fefcf9 !important;
        padding: 10px !important;
    }
    .signature-section {
        background: #fefcf9 !important;
        background-image: 
            radial-gradient(circle at 30% 40%, #f8f8f8 1px, transparent 1px),
            radial-gradient(circle at 70% 60%, #f9f9f9 1px, transparent 1px) !important;
    }
}

9. Kompletní postup

  1. Změň barvy: #ffffff → #fefcf9, #000000 → #0f0f0f
  2. Přidej texturu: radial-gradient s malými tečkami
  3. Oprav tabulky: border-collapse: separate, 2px bordery
  4. Otočení: transform: rotate() na různé sekce
  5. Vypni font smoothing: text-rendering, -webkit-font-smoothing
  6. Opacity variace: 0.95-0.99 na různé elementy
  7. Ošetři obrázky: mix-blend-mode + matching pozadí
  8. PDF setup: @media print s color-adjust: exact
  9. Jemné stíny: text-shadow s malými hodnotami

10. Výsledek

Výsledný dokument bude vypadat jako nascanovaný s těmito charakteristikami:

Soubor aktualizován: 22/08/2025 - přidány tabulkové bordery a PDF kompatibilita