Chyba statek dość dużo pływał, ale nadal istnieje rozwiązanie oparte na danych-URI.
Możesz wygenerować SVG zawierający obraz, który ma rozmiar większy niż obraz (np. Aby margines 60px zrobił tylko szerokość równą szerokości obrazu (40px) + pożądany margines (60px) = 100px):
następnym krokiem jest umieszczenie na swoim dysku wewnątrz SVG:
<image width="40" height="40" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFVJREFUeNrs2EENgEAQBMGBoOOsgLQTgaB1dV9Cggf2Ua2g3r2te5xJrvSsjg83mwLnnuYBAgICAgICAgICAgICAgICAgICAgIC/tV7+St9L389AgwA9YgGfH7VrXwAAAAASUVORK5CYII=" />
I wreszcie dodać SVG jako tło wizerunku z danymi URI:
#container {
width: 300px;
height: 100px;
border: 1px solid #ccc;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="40"><image width="40" height="40" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFVJREFUeNrs2EENgEAQBMGBoOOsgLQTgaB1dV9Cggf2Ua2g3r2te5xJrvSsjg83mwLnnuYBAgICAgICAgICAgICAgICAgICAgIC/tV7+St9L389AgwA9YgGfH7VrXwAAAAASUVORK5CYII=" /></svg>');
background-position: left center;
background-repeat: repeat-x;
}
Zobacz zaktualizowaną wersję Fiddle.
Można powiedzieć, że jest to dość duże i brudne rozwiązanie. Jest to jednak czyste rozwiązanie CSS, które nie wymaga tworzenia dodatkowych elementów HTML/JavaScript. Ma pewne wady:
- Musisz osadzić obraz z danymi-URI. Prawdopodobnie nie jest to rzecz, którą chciałbyś robić często.
- Rozwiązanie wygląda nieco ciężko.
- W przypadku IE9 należy zakodować SVG jako adres URL.
Możliwe rozwiązanie wszystkich tych problemów za pomocą preprocesorów CSS, np. Sass. Możesz utworzyć mixin, np .:
@mixin background-image-spaced($width, $height, $margin-right, $image) {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="#{$width + $margin-right}" height="#{$height}"><image width="#{$width}" height="#{$height}" xlink:href="data:image/png;base64,#{$image}" /></svg>');
}
body {
@include background-image-spaced(40px, 40px, 60px, 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFVJREFUeNrs2EENgEAQBMGBoOOsgLQTgaB1dV9Cggf2Ua2g3r2te5xJrvSsjg83mwLnnuYBAgICAgICAgICAgICAgICAgICAgIC/tV7+St9L389AgwA9YgGfH7VrXwAAAAASUVORK5CYII=');
}
Możesz dodać tutaj wiele rzeczy, np.wszystkie inne wartości marginesów, możesz zakodować obraz, aby go wstrzyknąć, zamiast pisać ręcznie za pomocą kompasu, patrz np. this article, aby uzyskać więcej informacji na temat tego procesu. To już wygląda o wiele lepiej i wygodniej w użyciu.
'background-repeat: space' jest jak' text-align: justify', dostosowuje odstępy między powtórzeniami obrazu do wielkości elementu, ale nie pozwala na zdefiniowanie tych spacji w dogodnym dla ciebie momencie. Modyfikowanie rozmiaru obrazu to obejście mojego problemu, zobaczmy, czy ktoś ma inne rozwiązanie. – fguillen