Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

CSS e imágenes de fondo

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

Cuando hablamos del frontend de un sitio, nos referimos principalmente a dos cosas: CSS y JavaScript. Empecemos por la parte CSS... que es muy sencilla con AssetMapper. Crea un archivo CSS dentro del directorio assets/ e inclúyelo con una etiqueta link a la antigua usanza que utilice la ruta lógica del archivo. Y ya está. Cero magia.

Esto es un poco diferente de Encore. Con un sistema de compilación como Encore, puede que estés familiarizado con hacer cosas como esta: import './styles/app.css. Ese tipo de cosas no funcionan en un entorno de navegador. Las declaraciones de importación son para importar archivos JavaScript, punto. De acuerdo, técnicamente puedes cargar CSS de forma perezosa, pero ése es un caso extremo del que no necesitamos preocuparnos ahora.

La cuestión es que no puedes importar archivos CSS desde archivos JavaScript y no pasa nada: añadir una etiqueta link funciona de maravilla.

Referenciar imágenes desde dentro de archivos CSS

Vale: ya sabemos que podemos hacer referencia a cualquier archivo del directorio assets/ utilizando la funciónasset()... lo que ya hemos hecho dos veces.

Pero, ¿y si necesitamos hacer referencia a un archivo -como esta imagen- desde dentro de un archivo CSS?

... lines 1 - 20
<body class="bg-gray-800 text-white">
... lines 22 - 49
<img src="{{ asset('images/penguin.png') }}">
... lines 51 - 69
</body>
... lines 71 - 72

Echa un vistazo. Aquí arriba, tenemos un pequeño icono de registro en la esquina superior izquierda. Cámbialo por un span con class="bg-logo" para que podamos incluir nuestra imagen del pingüino en su lugar. Copia ese encabezado de clase bg-logo en app.css, añade .bg-logo y... añadiré algunos estilos básicos.

... lines 1 - 20
<body class="bg-gray-800 text-white">
... lines 22 - 25
<a href="{{ path('app_homepage') }}" class="flex">
<span class="bg-logo"></span>
... line 28
</a>
... lines 30 - 69
</body>
... lines 71 - 72

La gran pregunta es: ¿cómo podemos establecer la imagen de fondo... ya que elpenguin.png final tendrá un nombre de archivo versionado? La respuesta es: exactamente como lo harías normalmente: url() y luego la ruta relativa al archivo: ../images/penguin.png.

... lines 1 - 3
.bg-logo {
display: inline-block;
width: 32px;
height: 32px;
background-image: url('../images/penguin.png');
background-size: contain;
background-repeat: no-repeat;
}

Así es exactamente como se hace en Encore y exactamente como se haría si estos archivos se sirvieran directamente a nuestro navegador. Simplemente tenemos que escribir el código "correcto" y funcionará.

Añadamos 2 estilos más para el fondo... ¡y a probar! Actualiza y... ¡sí, funciona! Inspecciona la imagen... y luego mira el archivo CSS final. Abrámoslo en una nueva pestaña.

¡Perfecto! En su mayor parte, los archivos finales coinciden exactamente con los archivos de origen. Sin magia. Sin embargo, en este caso, AssetMapper hizo un pequeño cambio. En el archivo original, nos referíamos a ../images/penguin.png. Pero aquí tenemos../images/penguin-versionhash.png. Sí, AssetMapper hizo ese pequeño cambio para que las cosas siguieran funcionando, a pesar de los nombres de archivo versionados.

La cuestión es: puedes codificar como si nada... y todo funciona.

A continuación: ¡invitemos a la fiesta a CSS de terceros como Bootstrap y fuentes!

Leave a comment!

0
Login or Register to join the conversation
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=8.1",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "babdev/pagerfanta-bundle": "^4.0", // v4.2.0
        "doctrine/doctrine-bundle": "^2.7", // 2.10.0
        "doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.4
        "doctrine/orm": "^2.12", // 2.15.2
        "knplabs/knp-time-bundle": "^1.18", // v1.20.0
        "pagerfanta/doctrine-orm-adapter": "^4.0", // v4.1.0
        "pagerfanta/twig": "^4.0", // v4.1.0
        "stof/doctrine-extensions-bundle": "^1.7", // v1.7.1
        "symfony/asset": "6.3.*", // v6.3.0
        "symfony/asset-mapper": "6.3.*", // v6.3.0
        "symfony/console": "6.3.*", // v6.3.0
        "symfony/dotenv": "6.3.*", // v6.3.0
        "symfony/flex": "^2", // v2.3.1
        "symfony/framework-bundle": "6.3.*", // v6.3.0
        "symfony/http-client": "6.3.*", // v6.3.0
        "symfony/monolog-bundle": "^3.0", // v3.8.0
        "symfony/proxy-manager-bridge": "6.3.*", // v6.3.0
        "symfony/runtime": "6.3.*", // v6.3.0
        "symfony/stimulus-bundle": "^2.9", // v2.9.1
        "symfony/twig-bundle": "6.3.*", // v6.3.0
        "symfony/ux-turbo": "^2.9", // v2.9.1
        "symfony/web-link": "6.3.*", // v6.3.0
        "symfony/yaml": "6.3.*", // v6.3.0
        "twig/extra-bundle": "^2.12|^3.0", // v3.6.1
        "twig/twig": "^2.12|^3.0" // v3.6.1
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.4
        "symfony/debug-bundle": "6.3.*", // v6.3.0
        "symfony/maker-bundle": "^1.41", // v1.49.0
        "symfony/stopwatch": "6.3.*", // v6.3.0
        "symfony/web-profiler-bundle": "6.3.*", // v6.3.0
        "zenstruck/foundry": "^1.21" // v1.33.0
    }
}
userVoice