2009-04-14 14 views
8

Quiero hacer una entre navegadores (FF3, Internet Explorer 6, Safari, Opera), W3C válido (HTML y CSS ambos), estirable (horizontal verticalmente), sin JavaScript y con Semántica y marca HTML menor Round CORNER. Las imágenes se pueden usar para IE6.¿Cómo hacer un navegador cruzado, W3C válido, semántico, esquina ROUND no javascript?

He intentado y probado muchas técnicas disponibles en la comunidad. Pero todo tiene uno de los problemas mencionados anteriormente. Si alguien sabe lo que quiero, ¿por favor comparta conmigo?

Recuerda que quiero hacerlo sin ningún tipo de JavaScript, jquery o cualquier tipo de js.

Respuesta

21

El CSS3 dos principales motores de renderizado han apoyado desde hace bastante tiempo, lo que hace que las esquinas redondeadas tan simple como:

-moz-border-radius: 5px; 
-webkit-border-radius: 5px; 
border-radius: 5px; 

Por supuesto, esto no tiene ningún efecto sobre IE6 o 7 (funciona en IE8) u 8, por lo que debe implementar la desagradable división apilada con imágenes para las esquinas, que no se ajusta a sus requisitos semánticos.

No soy fanático de los hack-displays que implican javascript o css-hacks, así que uso CSS3 y compruebo que la versión cuadrada en IE7 parece aceptable. He estado haciendo esto por un tiempo ya que IE nunca solía soportar la transparencia PNG, lo que significaba que no se podía superponer muy bien una imagen de esquina redondeada en un fondo con patrones. IE8 es una gran mejora, por lo que el problema comienza a desaparecer, pero entiendo su deseo de hacerlo funcionar en IE6 y superior.

ACTUALIZACIÓN: Varios bits y piezas de CSS3 que se planearon originalmente para ser incluidos en IE8 en realidad se eliminaron de la versión final. border-radius fue una de las víctimas.

+0

Thx para su respuesta, sé que la solución IE6 necesitaba Js o imágenes. Quiero hacer una esquina redonda con imágenes pero quiero usar imágenes menores, marcado y semántico. –

+0

Actualización: acabo de ver en MSDN que CSS3 border-radius se ha eliminado de IE8. ¡Esté atento a un service pack o espere hasta IE9 para esta función! – Fenton

+0

@Sohnee: debe poner su actualización en su respuesta, donde puede estar seguro de que nadie se perderá. – alex

0

Puede utilizar la técnica descrita here (es para un widget del tablero de mandos de Apple, pero el HTML/CSS debe ser el mismo). Utiliza nueve imágenes y no requiere ningún JavaScript.

Steve

+0

Esto usa javascript y tantos div. –

+0

Solo utiliza JavaScript para la parte de animación: las esquinas redondeadas se realizan solo con HTML/CSS. Pero sí, requiere muchos divs. –

+0

Content
quiero este tipo de marcado –

0

No sé qué quiere decir con esquinas redondeadas o semánticas extensibles, pero puede utilizar los atributos de CSS frontera de radio para Webkit y Firefox, y simplemente usar una combinación de imágenes PNG y this HTML Component, que añade PNG alfa - Soporte de canal para IE6.

+0

quiero hacer sin Javascript para IE –

6

La respuesta breve es que no puede hacer todo lo que desea sin CSS3, que no está implementado en ninguna de las versiones de navegadores, sino en las versiones más recientes.

Entonces, la respuesta es usar CSS3 (como se detalla por Sohnee arriba) o aprender a amar las soluciones javascript/divs/images. Y asegúrese de que se muestre bien cuando un navegador con ninguno de estos lo mire ...

1

Esto debería permitirle obtener el resultado deseado. El antiguo método DIV apilado, con una única imagen de fondo grande. Debes crear una imagen de fondo muy grande, p. 2000 x 2000 píxeles, donde dibujará un rectángulo con esquinas redondeadas. Recomiendo guardarlo como .GIF con fondo transparente para garantizar la compatibilidad con IE6, ya que desea evitar JavaScript. Tenga en cuenta que los bordes, en el ejemplo, son solo para ayudar a determinar dónde aparecen los elementos y se pueden eliminar.

Lo probé en IE6, IE7, Firefox 2 y 3, Safari y Opera. Espero que esto ayude.

<html> 
<head> 
    <style type="text/css"> 
    .RoundRectInside 
    { 
     width: 100%; 
     background: url(BigBackground.gif) top left no-repeat; 
     overflow: hidden; 
    } 

    .RoundRectOutside 
    { 
     width: 20em; 
     height: 20em; 
     background: url(BigBackground.gif) bottom left no-repeat; 
     overflow: hidden; 
     position: relative; 
    } 

    .RoundRectTopRight 
    { 
     float: right; 
     /* Width and Height should correspond to width and height of rounded corner */ 
     width: 30px; 
     height: 30px; 
     background: url(BigBackground.gif) top right no-repeat; 
     overflow: hidden; 
     position: absolute; 
     top: 0; 
     right: 0; 
    } 

    .RoundRectBottomRight 
    { 
     float: right; 
     /* Width and Height should correspond to width and height of rounded corner */ 
     width: 30px; 
     height: 30px; 
     background: url(BigBackground.gif) bottom right no-repeat; 
     overflow: hidden; 
     position: absolute; 
     bottom: 0; 
     right: 0; 
    } 
    </style> 
</head> 

<body> 
    <div class="RoundRectOutside"> 
    <div class="RoundRectInside"> 
     <div>Content goes here</div> 
     <div class="RoundRectTopRight"></div> 
    </div> 
    <div class="RoundRectBottomRight"></div> 
    </div> 
</body> 

</html> 
+0

Thx para esto voy a probar esto, pero tengo una buena solución con una pequeña imagen, pero en este borde de color no es posible.http: //apptools.com/examples/roundedbox. php –

+0

por favor dame un enlace en vivo de tu ejemplo. no entendí bien He probado, pero no funciona, ya muestra un borde rojo en el cuadro –

+0

Lamentablemente, no tengo ningún servidor donde pueda cargarlo. Sin embargo, como escribí en mi respuesta , aparece un borde rojo porque puse un atributo "border" en CSS, para ayudar a determinar la posición de los elementos. Modifiqué mi publicación y eliminé el borde, intenté copiarlo ahora. – Diego

0

estoy bastante seguro de que los mínimos no js redondeadas técnica de esquina para IE6/7 requiere 2 imágenes pequeñas (superior e inferior) y 1 div extra para cajas de ancho fijo, y 3 pequeñas imágenes (abajo, izquierda y derecha) y 3 divs adicionales para un cuadro de ancho variable.

Ancho fijo

<div class="box"> 
<div class="bottom"> 
gjkgjk 
</div> 
</div> 

.box {background:url(image to round off the top) top left no-repeat:padding:0;} 
.box .bottom {background:url(image to round off the bottom) bottom left no-repeat:margin:0;width:100px} 

anchura variable

<div class="box"> 
<div class="top-right"> 
<div class="bottom-left"> 
<div class="bottom-right"> 
gjkgjk 
</div> 
</div> 
</div> 
</div> 

.box {background:url(image to round off the top-left) top left no-repeat:padding:0;} 
.box .right{background:url(image to round off the top-right) top right no-repeat:padding:0;margin:0;} 
.box .bottom-left {background:url(image to round off the bottom-left) bottom left no-repeat:margin:0;padding:0;} 
.box .bottom-right {background:url(image to round off the bottom-right) bottom right no-repeat:margin:0;padding:0;} 

Si desea un borde redondeado en lugar de sólo un fondo sólido redondeada lo anterior puede ser ajustado usando frontera, margen negativo, la posición relativa/absoluta , el ancho y la posición de la imagen de fondo para que funcione, pero no puedo recordar de qué manera.

+0

necesito estirable así que el # 1 no es para mí y para la solución # 2 encontré una mejor manera, vea mi respuesta debajo de –

0

Esto es lo mejor que he encontrado hasta ahora.

http://apptools.com/examples/roundedbox.php

Es un navegador de la Cruz, el W3C válida y utilizar sólo una imagen . pero no podemos hacer frontera con esto.

Esta solución para un ancho fijo con borde.

se utilizan poco marcado ` contenido

` con CSS válido, html http://www.askthecssguy.com/examples/roundedCorners/index.html

+0

Si mira mi método, puede hacerlo con menos marcado. – VirtuosiMedia

+0

Solo una nota: el ejemplo en * askthecssguy.com * no se escala muy bien, ya que utiliza anchos fijos. Por lo tanto, no es realmente "estirable". – Diego

0

Si utiliza un PNG8 con transparencia alfa, las imágenes pueden tener transparencia en IE6. Las advertencias son que solo se pueden tener imágenes totalmente transparentes u opacas (cualquier elemento intermedio se volverá 100% transparente) y que no se puede usar una paleta de colores o degradados de gran tamaño.

Dependiendo de su diseño, existe una posible solución alternativa o puede usar esto junto con la opción PNG8 anterior. Si su fondo es simple, puede hacer coincidir cualquier cosa fuera de las esquinas con el fondo. Usando esta técnica, puedes hacer fácilmente con una sola imagen para tus esquinas si haces uso de sprites. El margen de beneficio tendría un aspecto similar al siguiente:

<div id="content"> 
    <span class="lt"></span> 
    <span class="rt"></span> 
    <span class="lb"></span> 
    <span class="rb"></span> 
</div> 

Y el CSS:

#content {position:relative;} 

/*These styles are generic and can be reused over multiple corner types*/ 
.lt, .rt, .lb, .rb{ 
    background:url(../images/button_corners.png) no-repeat; 
    width:5px; 
    height:5px; 
    position:absolute; 
} 
.lt, .rt{top:0px;} 
.rt, .rb{right:0px;} 
.lt, .lb{left:0px;} 
.rb, .lb{bottom:0px;} 

/*The following would be used specifically for #content, but you could reuse a different part of the same image for a different container or button */ 

#content .lt{background-position:-200px 0px;} 
#content .rt{background-position:-245px 0px;} 
#content .lb{background-position:-200px -45px;} 
#content .rb{background-position:-245px -45px;} 

Hay ventajas y desventajas de este enfoque:

Ventajas

¡Es cruzada navegador, funciona con diseños líquidos y fijos, y puede usarlo para los elementos del menú (hover funcionará en IE6 para enlaces) o contenedores , no requiere JavaScript, y con un sprite CSS, puede hacerlo con una sola imagen, incluso con múltiples tipos de esquina.

Desventajas

No funcionará con cada diseño, las fronteras puede ser complicado o feo, que añade algunos elementos adicionales en el margen de beneficio, y si lo usa para un elemento de enlace con un efecto hover , IE6 tiene un parpadeo que solo se puede resolver con un poco de JavaScript. Sin embargo, de que JavaScript es sólo una línea y se puede incluir en un comentario condicional:

<script type="text/javascript">document.execCommand("BackgroundImageCache",false,true);</script> 
0

Si no les importa usar Javascript para apenas IE, puede utilizar los comentarios condicionales y Javascript para insertar de forma dinámica roundrects VML que pueden haz lo que quieras (o simplemente usa el VML estático con comentarios condicionales). El radio de borde CSS3 cubre Gecko, WebKit y KHTML. Opera requiere una imagen de fondo SVG.

He aquí un ejemplo sacado de uno de mis proyectos: http://entr0py.org/misc/reader/basic/

Me han dicho que todavía tiene algunos errores relacionados con WebKit fondo coloración, pero funciona muy bien en todo lo demás.

+0

parece extraño en IE 6 –

0

Hola recientemente tuve que superar el mismo problema, un widget redimensionable con esquinas redondeadas, borde interior, sombra paralela y fondo degradado. También tiene que funcionar en todos los navegadores (IE6 incluido).

Suponiendo que está utilizando photoshop y cuida sus archivos de origen correctamente, es bastante fácil. En total, requiere 4 imágenes (hasta 7 dependiendo de la forma en que admita IE6), todas pueden ser cortadas del archivo original de Photoshop, así que es bastante fácil.

Mira el siguiente enlace.

http://thatguynamedandy.com/blog/css-widget-rounded-corner-gradient-drop-shadow

3

La mejor solución hasta la fecha es CSS3Pie.

Le permite agregar esquinas redondeadas a IE utilizando CSS.

Puede usar CSS border-radius para todos los otros navegadores y CSS3Pie para IE.

Utiliza el estilo específico de IE behavior, por lo que no es CSS estándar, pero sí significa que obtiene HTML semánticamente correcto (no divs falsos para el diseño), y no necesita preocuparse por los plugins JQuery tampoco .

Es Javascript (de tipo), pero solo necesita ejecutarse en IE; todos los demás navegadores usarán CSS normal para manejarlo, y ni siquiera cargarán el código específico de IE.

(por cierto IE9 ahora hace apoyar la frontera de radio ... pero por supuesto, Internet Explorer 6/7/8 son todos todavía por ahí y será por algún tiempo)

+0

La pregunta es "no-javascript" –

+0

@Jitendra - también especificó HTML semántico. El hecho es que IE6/7/8 no puede hacerlo sin Javascript o marcado adicional. CSS3Pie es, de lejos, la solución menos molesta. – Spudley

Cuestiones relacionadas