[CSS] pijltje met outline

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:10
Ik probeer hier iets voor elkaar te brouwen waarvan ik aanvankelijk dacht: appeltje eitje. Maar ik ben er inmiddels al dik een uur mee bezig, en ik krijg het niet goed voor elkaar :D

Wat ik wil, is dit:

CSS pijltje - ontwerp

Natuurlijk kan ik hiervoor een (SVG) plaatje als achtergrond gebruiken, maar ik vind het veel fraaier om dit met puur CSS te doen. Mijn gedachte was als volgt: het element een border van 2px geven, en dan een :after en een :before met een gesimuleerde driehoek (door middel van borders), waarbij de :after 2 pixels kleiner is dan de :before, zodat ik het lijntje simuleer. Hier hoort de volgende CSS bij:


Cascading Stylesheet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
*, *::after, *::before {
    box-sizing: border-box;
}
.pijltje {
    position: relative;
    margin: 20px 0 0 0;
    display: inline-block;
    height: 36px;
    text-transform: uppercase;
    font-size: 14px;
    color: black;
    text-decoration: none;
    padding: 0 20px;
    line-height: 36px;
    background: #fff;
    border: 2px solid red;
}
.pijltje:before {
    display: block;
    content:'';
    border-top: 20px solid transparent;
    border-bottom: 20px solid transparent;
    border-left: 12px solid red;
    position: absolute;
    top: -4px;
    right: -12px;
}
.pijltje:after {
    display: block;
    content:'';
    border-top: 18px solid transparent;
    border-bottom: 18px solid transparent;
    border-left: 12px solid #fff;
    position: absolute;
    top: -2px;
    right: -10px;
}


Het resultaat komt in de buurt, maar is bepaald niet netjes te noemen:

CSS pijltje - resultaat

Dit is te bewonderen in deze JSFiddle.

Wie helpt mij om dit goed te krijgen? Welke denkfout maak ik?

omniscale.nl


Acties:
  • 0 Henk 'm!

  • Jogai
  • Registratie: Juni 2004
  • Laatst online: 16:25
Hier een update:
http://jsfiddle.net/wh16qx4v/1/
(gebaseerd op http://cssarrowplease.com/)

Maar die schuine lijnen zijn wat dunner, dat zal ook wel de reden zijn dat ze bij cssarrowplease de hoek kleiner als de box maken.

Meer inspiratie: http://codepen.io/search/pens?q=Arrow+box

Klik hier om op linkedIn lid te worden van de Freelance Tweakers groep.


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Als ik deze border-widht en margin-top toevoeg aan de .arrow_box:before werkt het wel.
Cascading Stylesheet:
1
2
3
4
5
6
7
.arrow_box:before {
    border-left-color: #f00;
    border-width: 20px;
    margin-top: -20px;
    border-width: 21px;
    margin-top: -21px;
}


Het blijft natuurlijk een beetje een hack imho

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Jogai
  • Registratie: Juni 2004
  • Laatst online: 16:25
Afvalzak schreef op woensdag 14 oktober 2015 @ 10:35:
Als ik deze border-widht en margin-top toevoeg aan de .arrow_box:before werkt het wel.
Cascading Stylesheet:
1
2
3
4
5
6
7
.arrow_box:before {
    border-left-color: #f00;
    border-width: 20px;
    margin-top: -20px;
    border-width: 21px;
    margin-top: -21px;
}


Het blijft natuurlijk een beetje een hack imho
Zoiets dacht ik al, alleen dacht ik dat hij asymettrisch zou worden vanwege de 3 pixels. Update hier: http://jsfiddle.net/wh16qx4v/6/ (wie 2-5 heeft gemaakt weet ik niet...)

Klik hier om op linkedIn lid te worden van de Freelance Tweakers groep.


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Zo kan ook: http://jsfiddle.net/wh16qx4v/9/
Zie ook de nifty mouse pointer :)

P.S.: Je kan met transform natuurlijk best veel verschillende schapes maken naar je goesting.
P.S.2: zie het menu op http://mhxsolutions.nl/ met een transform:matrix()

[ Voor 83% gewijzigd door DJMaze op 15-10-2015 10:23 . Reden: Updatet de jsfiddle ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Waarom geen SVG?

HTML:
1
2
3
<svg width="200" height:"50">
    <polygon points="5,15 5,35 170,35 180,25 170,15 5,15" style="fill:none;stroke:red;stroke-width:3"></polygon>
</svg>

[ Voor 87% gewijzigd door Guillome op 14-10-2015 16:09 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Hierom:
posttoast schreef op dinsdag 13 oktober 2015 @ 17:20:
Natuurlijk kan ik hiervoor een (SVG) plaatje als achtergrond gebruiken, maar ik vind het veel fraaier om dit met puur CSS te doen.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Oeps :)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 12-10 07:45
Kan je hiervoor niet CSS clipping gebruiken?

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
posttoast schreef op dinsdag 13 oktober 2015 @ 17:20:
Natuurlijk kan ik hiervoor een (SVG) plaatje als achtergrond gebruiken, maar ik vind het veel fraaier om dit met puur CSS te doen.
Je kunt het sowieso niet met SVG doen. Als het SVG image niet exact uitgemeten is op de grootte v/d link of knop, dan zal het geschaald moeten worden. En onze grote vriend IE ondersteunt non-scaling strokes nog steeds niet. Dus dat zou aartslelijk worden.

[ Voor 3% gewijzigd door R4gnax op 15-10-2015 21:00 ]


Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:10
Dank voor al jullie meedenken :)

Maar... er zit nog geen winnaar tussen :P Het probleem is dat het pijltje uit het ontwerp niet gelijkbenig is, de punt is een flauwere hoek. Alle voorbeelden (ook die van cssarrowplease) hebben hoeken van 45 graden. Nu is het me uiteindelijk wel gelukt om er eentje te maken met een minder scherpe hoek, maar dat rendert direct heel kartelig en raar. Zou het überhaupt op deze manier kunnen?

omniscale.nl


Acties:
  • +1 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Tweakers is toch niet van de antwoorden, maar van de tips?
Ik gaf een transform hint en jij maakt m (bijna) af :)

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
DJMaze schreef op vrijdag 16 oktober 2015 @ 10:09:
[...]

Tweakers is toch niet van de antwoorden, maar van de tips?
Ik gaf een transform hint en jij maakt m (bijna) af :)
Klopt.

Het luistert helaas alleen nogal nauw om zoiets als dit helemaal werkend te krijgen wanneer je te maken hebt met hoeken anders dan 45 graden en borders dikker dan 1px. Dan moet je eigenlijk wel terugvallen op een compleet werkend voorbeeld.

Acties:
  • 0 Henk 'm!

  • n8n
  • Registratie: Juni 2007
  • Laatst online: 12-10 20:10

n8n

R4gnax schreef op donderdag 15 oktober 2015 @ 21:00:
[...]


[...]


Je kunt het sowieso niet met SVG doen. Als het SVG image niet exact uitgemeten is op de grootte v/d link of knop, dan zal het geschaald moeten worden. En onze grote vriend IE ondersteunt non-scaling strokes nog steeds niet. Dus dat zou aartslelijk worden.
Svg is inline te manipuleren omdat het xml is, je moet dan wel de breedte uitmeten met JS en dit toepassen op de lengte van het pad in je svg. Iets meer moeite maar wel mooier afgewerkt.

Nog ff een css-poging gedaan, lijnt in Safari perfect uit wanneer er niet in- of uitgezoomd wordt. De ronde hoekjes maken dat het net lekkerder aan lijkt te sluiten. Het probleem met deze techniek is dat het resultaat nogal onderhevig is aan browser interpretatie en instellingen van tekstgrootte/zoomniveau.

http://jsfiddle.net/toL8mfdh/

Afbeeldingslocatie: http://i.imgur.com/xTIBBLL.png

[ Voor 25% gewijzigd door n8n op 16-10-2015 14:15 ]


Acties:
  • 0 Henk 'm!

  • n8n
  • Registratie: Juni 2007
  • Laatst online: 12-10 20:10

n8n

http://jsfiddle.net/x8j1bLyj/ http://jsfiddle.net/x8j1bLyj/5/

Hier nogmaals met inline svg, kost vrijwel niks extra aan data. Om het aan de breedte aan te passen moet je de tweede waarde van het d-attribute wijzigen.

Edit: update gedaan met een simpele JS-functie die op basis van de breedte van het element de inline svg manipuleert en zo de breedte corrigeert. Dit werkt snel, is goed te onderhouden en heeft een beter resultaat dan hacken met css waarbij zoomen de opmaak vrijwel altijd breekt.

Afbeeldingslocatie: http://i.imgur.com/w1abGOT.png

[ Voor 54% gewijzigd door n8n op 16-10-2015 17:14 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 11:32

Bosmonster

*zucht*

Natuurlijk kan ik hiervoor een (SVG) plaatje als achtergrond gebruiken, maar ik vind het veel fraaier om dit met puur CSS te doen.
Volgens mij is het een stuk minder data om dit met een inline SVG op te lossen dan proberen het met een bak onleesbare (en bijna onbeheerbare) CSS te doen.

Acties:
  • 0 Henk 'm!

  • n8n
  • Registratie: Juni 2007
  • Laatst online: 12-10 20:10

n8n

Bosmonster schreef op vrijdag 16 oktober 2015 @ 16:25:
[...]


Volgens mij is het een stuk minder data om dit met een inline SVG op te lossen dan proberen het met een bak onleesbare (en bijna onbeheerbare) CSS te doen.
Na ongeveer 3 knoppen wint de css oplossing het wanneer je naar mijn 2 jsFiddles kijkt. Css is in dit geval een hack, alleen omdat het kan, en zelfs dat niet goed. Svg is hier veel beter geschikt voor.

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
n8n schreef op vrijdag 16 oktober 2015 @ 17:10:
Svg is hier veel beter geschikt voor.
En... je SVG is bij deze stuk in firefox 41 op 1024 breedte http://jsfiddle.net/x8j1bLyj/8/

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • n8n
  • Registratie: Juni 2007
  • Laatst online: 12-10 20:10

n8n

DJMaze schreef op vrijdag 16 oktober 2015 @ 17:24:
[...]

En... je SVG is bij deze stuk in firefox 41 op 1024 breedte http://jsfiddle.net/x8j1bLyj/8/
Kan gebeuren, ga dat niet cross browser testen, ligt waarschijnlijk aan de strict xml die svg vraagt. Neemt niet weg dat css in deze een hack is die meer glitches met zich mee brengt dan het waard is.

Edit, ah je hebt de JS weggehaald. Daarvoor is een noscript class op je html-tag.

[ Voor 9% gewijzigd door n8n op 16-10-2015 17:31 ]


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je moet het denk ik dan eerder zoeken in een combinatie. De CSS ::after dan met een SVG.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Waarom niet een border-image en een SVG? Dan kun je die :after evt weer ergens anders voor gebruiken (icoontje ofzo, gewoon future-proofing). En die SVG kan ook in "pure css" als je een data-uri gebruikt :)

Wat is trouwens de charme van "pure css"? Het gaat erom dat je de juiste tool voor de job gebruikt. SVG is goed in lijntjes tekenen, dus gebruik je SVG. Anders is dit hetzelfde argument als krampachtig proberen een piechart in css te maken (slecht idee, gebruik SVG).

En anders, wachten op corner-shape :P

[ Voor 67% gewijzigd door _Thanatos_ op 19-10-2015 18:33 ]

日本!🎌

Pagina: 1