2013-06-29 38 views
7

Proszę rozważyć mamy prosty plik SVG, zawierający kod zaokrąglonego prostokąta którego promień naroża równy 10:SVG jako granicy obrazu na ekranach Retina

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> 
    <rect fill="#FACE8D" x="0" y="0" width="100" height="100" rx="10" ry="10" /> 
</svg> 

Oto jak to wygląda w Chrome:

teraz możemy używać tego obrazu jako wartość dla border-image własności w CSS:

.box { 
    @include border-image(url('rounded-rectangle.svg') 10); 
    border-width: 10px; 
    background: #FFF; 
    width: 50px; 
    height: 50px; 
} 

Zobaczmy teraz, jak to wygląda w różnych przeglądarkach i na różnych urządzeniach: genialny, obraz rozciągnięty zgodnie z oczekiwaniami na granicach elementu.

Jednakże, kiedy zobaczymy te na urządzeniach z ekranami siatkówki, mamy trochę totalnej bzdury: SVG wydaje się być uprawiane dwa razy. Wszystko, co widzimy, to jeden ogromny kąt.

Jeśli zastąpimy SVG podobnym PNG, wszystko jest w porządku. Spójrz (iOS 5.1 malowane części wewnętrznych elementów z kolorem obrazu z jakiegoś powodu, to jednak nie jest przedmiotem tego pytania):

Live demo

Pytanie brzmi : czy można to załatwić? Może, mam złe SVG? Lub muszę ustawić meta-znacznik rzutni z kilkoma trudnymi rzeczami, aby zatrzymać skalowanie od border-image?

Problem jest dość ważny. Przede wszystkim SVG jest popularny głównie z powodu siatkówek. Jest to narzędzie do dekorowania rzeczy bez obawy, że będą wyglądać jak bzdury na podwójnych pikselach.

drugie, mechanika i składnia właściwości border-image jest dość podobna do własności zastrzeżonej w -webkit-mask-box-image, za pomocą którego jest jedynym sposobem, aby zaokrąglić narożniki bloków, które zawierają absolutnie pozycjonowane dzieci (na przykład Google Maps v3 mogą być zaokrąglone w Chromes i Safaries tylko przez niego). Ta własność jest bardzo cenna w rozwoju mobilnym dzięki komponentom sieciowym, gdy musimy ustawić jakiś skomplikowany kontur na elemencie interfejsu użytkownika. Niestety, przez tę właściwość podwaja się jej wymiary SVG, podobnie jak border-image.

AKTUALIZACJA. Wygląda na to, że ten problem może być spowodowany przez updated SVG processor wprowadzony w iOS 6.0: na siatkówce Wymiary SVG są obliczane w pikselach CSS, a współrzędne są obliczane na siatkówce. Są śledzone somebugs, które mają coś podobnego do mojego problemu.

+0

Just a strzał w ciemności, spróbuj zastępując wymiary z atrybutem 'viewBox':' ' – Duopixel

+0

Mam ten sam problem, a to nie rozwiązać problem dla mnie. – luksak

+0

Z teraz viewBox wartość "100" oznacza w teorii "100px". Powinno więc być naprawdę mniejsze. Wygląda jednak na to, że w rzeczywistości jest dwukrotnie większy. Czy próbowałeś konwertowania na jednostki fizyczne? Przy standardowej rozdzielczości SVG/CSS wynoszącej 96, 100 pikseli będzie wynosić około 1,04 cala. Spróbuj ustawić szerokość i wysokość SVG i rect na "1.04in" i zobacz, co się stanie. Promienie będą wynosić "0,1 cala". Prawdopodobnie długie ujęcie. –

Odpowiedz

3

Biorąc pod uwagę aktualizację o błędach iOS6, takie podejście może działać:

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> 
    <rect fill="#FACE8D" x="0" y="0" width="100%" height="100%" rx="10%" ry="10%" /> 
</svg> 
+0

prawidłowe. to powinno zadziałać –

+0

Bez powodzenia, daje takie same wyniki: [przypadek testowy ze zmodyfikowanym SVG] (http://cssdeck.com/labs/border-image-png-svg-percentage) –

2

Zapomnij obrazów Można to zrobić w prosty css

.box { 
    border: 10px solid #FACE8D; 
    -webkit-border-radius: 10px; 
    -moz-border-radius: 10px; 
    border-radius: 10px; 
    background: #FFF; 
    width: 50px; 
    height: 50px; 
} 

Obsługiwane od iOS 3.2 ...http://caniuse.com/border-radius

Jeśli potrzebujesz obrazu w celu granicy mieć wzór, można po prostu użyć Web Format obrazu bez przejrzystości i użyć border-radius na tym

+0

nie to, co OP zadał –

+1

rozwiązuje problem , po co komplikować? Jeśli chcesz mieć wzór na granicy, to można go połączyć z granicą png ... – OZZIE

+4

ponieważ założę się, że był to zwykły svg stworzony w celu zademonstrowania problemu, a nie rzeczywisty svg zostanie użyty –