I am having troubles to scale the SVG to fit the window size.
In this example, I have a wavy path and a text element, what I want to achieve here is to move the text element along the wavy path from left to right (which is done by GSAP) and stop in the half way of the path in the initial load; it will move to the end when users start scrolling.
My problem is that, the wavy path created by SVG is too long, even the half way of the path will be off the window, I tried to scale down the wavy path by using viewBox, failed; using css width: 100vw, failed.
I also used the css transform property, it did scale the wavy path down, but that was a fixed size, I want to make it as responsive as possible, which means regardless the window width, the text element always stops in the middle of the screen first ( half way of the wavy path ), then moves to the right hand side of the screen. Is this possible when using inline SVG element? If so, please point me in the right direction.
Thank you in advance!
(Please view the example in full page mode, that will explain my problem perfectly, but the scroll function will be disabled because the height in that mode is 100vh, there is no room for scrolling)
document.getElementById("MyPath").setAttribute("d", document.getElementById("Path").getAttribute("d"));
var tl = new TimelineMax({
repeat: 0,
delay: 1
});
tl.to("#Text", 3, {
attr: {
startOffset: '50%',
opacity: 1
}
});
window.addEventListener('scroll', function() {
tl.to("#Text", 3, {
attr: {
startOffset: '100%',
opacity: 0
}
});
}, true);
#import url(https://fonts.googleapis.com/css?family=Oswald);
body {
background-color: #222;
}
svg {
overflow: visible;
width: 100%;
height: 100%;
background-color: #fff;
left: 0;
top: 0;
position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/TextPlugin.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenMax.min.js"></script>
<svg xml:space="preserve">
<defs><path id="MyPath"/></defs>
<path id="Path" fill="none" stroke="#000" stroke-miterlimit="10" d="M0,188.2c186.2,84,261.8,84.9,440,66.4s295.2-130,535.2-129.4c240,0.6,357,144.3,591.1,144.3
s450.1-141.2,651.1-141.2c271.7,0,354.2,141.2,612.1,141.2c240,0,423-141.2,669.1-141.2c119.1,0,202.3,33.8,281,68.7"/>
<text font-size="7em" >
<textPath id="Text" fill='#88CE02' font-family=Oswald xlink:href="#MyPath" opacity=0 startOffset="0%" letter-spacing="5px">Love the little things.</textPath>
</text>
</svg>
If you want your SVG to scale to fit the screen (or any parent container), it needs to have a viewBox attribute. This attribute tells the browser the dimensions of the SVG content. Without it, the browser has know way of knowing how much it needs to be scaled.
Your path is about 3780 width, and the bottom of it is at y=144. So a reasonable value of viewBox would be:
viewBox="0 0 3780 150"
document.getElementById("MyPath").setAttribute("d", document.getElementById("Path").getAttribute("d"));
var tl = new TimelineMax({
repeat: 0,
delay: 1
});
tl.to("#Text", 3, {
attr: {
startOffset: '50%',
opacity: 1
}
});
window.addEventListener('scroll', function() {
tl.to("#Text", 3, {
attr: {
startOffset: '100%',
opacity: 0
}
});
}, true);
#import url(https://fonts.googleapis.com/css?family=Oswald);
body {
background-color: #222;
}
svg {
overflow: visible;
width: 100%;
height: 100%;
background-color: #fff;
left: 0;
top: 0;
position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/TextPlugin.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenMax.min.js"></script>
<svg viewBox="0 0 3780 150" xml:space="preserve">
<defs><path id="MyPath"/></defs>
<path id="Path" fill="none" stroke="#000" stroke-miterlimit="10" d="M0,188.2c186.2,84,261.8,84.9,440,66.4s295.2-130,535.2-129.4c240,0.6,357,144.3,591.1,144.3
s450.1-141.2,651.1-141.2c271.7,0,354.2,141.2,612.1,141.2c240,0,423-141.2,669.1-141.2c119.1,0,202.3,33.8,281,68.7"/>
<text font-size="7em" >
<textPath id="Text" fill='#88CE02' font-family=Oswald xlink:href="#MyPath" opacity=0 startOffset="0%" letter-spacing="5px">Love the little things.</textPath>
</text>
</svg>
Here's what you could do: add a media query defining the desired width and then apply the following styles separately for the text and path elements inside the svg element:
text {
font-size: 2em;
}
path {
-webkit-transform: scale(.3);
-ms-transform: scale(.3);
transform: scale(.3);
}
See the snippet below:
document.getElementById("MyPath").setAttribute("d", document.getElementById("Path").getAttribute("d"));
var tl = new TimelineMax({
repeat: 0,
delay: 1
});
tl.to("#Text", 3, {
attr: {
startOffset: '50%',
opacity: 1
}
});
window.addEventListener('scroll', function() {
tl.to("#Text", 3, {
attr: {
startOffset: '100%',
opacity: 0
}
});
}, true);
#import url(https://fonts.googleapis.com/css?family=Oswald);
body {
background-color: #222;
}
svg {
overflow: visible;
width: 100%;
height: 100%;
background-color: #fff;
left: 0;
top: 0;
position: absolute;
}
#media only screen and (max-width: 500px) {
text {
font-size: 2em;
}
path {
-webkit-transform: scale(.3);
-ms-transform: scale(.3);
transform: scale(.3);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/TextPlugin.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenMax.min.js"></script>
<svg xml:space="preserve">
<defs><path id="MyPath"/></defs>
<path id="Path" fill="none" stroke="#000" stroke-miterlimit="10" d="M0,188.2c186.2,84,261.8,84.9,440,66.4s295.2-130,535.2-129.4c240,0.6,357,144.3,591.1,144.3
s450.1-141.2,651.1-141.2c271.7,0,354.2,141.2,612.1,141.2c240,0,423-141.2,669.1-141.2c119.1,0,202.3,33.8,281,68.7"/>
<text font-size="7em" >
<textPath id="Text" fill='#88CE02' font-family=Oswald xlink:href="#MyPath" opacity=0 startOffset="0%" letter-spacing="5px">Love the little things.</textPath>
</text>
</svg>
I hope it helps!
I have a custom skin class that I want to apply to all scrollbars. Is there a way to set this globally in a Flex Spark application?
s|Scroller
{
skinClass: com.x.y;
}
Thanks guys I got it working :)
I place this code in the Application style tag (a style sheet would work as well),
<fx:Style>
#namespace s "library://ns.adobe.com/flex/spark";
#namespace mx "library://ns.adobe.com/flex/mx";
#namespace skins "skins.*";
s|HScrollBar
{
skinClass: ClassReference("skins.HScrollBarSkin");
}
s|VScrollBar
{
skinClass: ClassReference("skins.VScrollBarSkin");
}
</fx:Style>
The Best answer is that you apply that style to the parentApplication that means in the first page you just give that style and then it will apply to all the sub page. such like that
<mx:Style source="Style/Style.css" />
give that to all the parent page in your application.
Have a nice day.
Style.css
Application
{
backgroundColor: #FFFFFF;
themeColor: #6C76D3;
color: #333333;
}
.NumButton
{
color: #000000;
width: 35;
font-weight:bold;
}
Accordion
{
borderStyle: solid;
headerHeight: 32;
textIndent: 0;
openDuration: 219;
fillAlphas: 1, 1, 0.7, 0.7;
fillColors: #EBF0F3, #8E8FCC, #6273C9, #263692;
selectedFillColors: #D5DBE3, #8E8FCC;
headerStyleName: "myaccordionHeader";
}
AccordionHeader
{
borderStyle: solid;
headerHeight: 36;
textIndent: 0;
openDuration: 219;
fillAlphas: 0.4, 0.5, 0.7, 0.7;
fillColors: #DEE1FF, #AEBEFF, #8C86FF, #5646D3;
selectedFillColors: #AEBEFF, #8C86FF;
headerStyleName: "myaccordionHeader";
}
.myaccordionHeader
{
color: #1F213C;
fontFamily: Tahoma;
fontSize: 12;
}
I've this tabs that I wanted to make rounded only on top-right and top-left corners. But it ended up rounding all 4 corners.
What I did:
<mx:TabNavigator id="myTabNav" x="58" y="61" width="584" height="200" creationComplete="setColors(event)" styleName="myTabStyle">
<pages:One label="ThisOne" id="one" name="One"/>
<pages:Two label="Twoooooooooooh" id="two" width="584" name="two" />
<pages:Three label="Threeeeeeeeh" id="three" width="583" name="three" />
</mx:TabNavigator>
and
my pageStyles.css file is:
.myTabStyle {
tabStyleName: "myTabs";
corner-radius:15;
}
.myTabs {
backgroundColor: #FF0080;
corner-radius:10;
focusRoundedCorners: "tl tr";
skin:ClassReference('mx.skins.spark.ButtonSkin');
chromeColor: #FF0080; /* this is the tab widget itself, not the content */
border-style:outset;
}
As you can see I have the "focusRoundedCorners" to point to top-right and top-left but no luck. What I got is:
What am I doing wrong guys??
Thanks in advance.
Have a look at this tool http://www.wabysabi.com/flex/enhancedbuttonskin/
I would guess that the focus part of the focusRoundedCorners refers to how it should be when it has focus only..
So here is the solution.
You can write you own button skin or use the one here http://www.wabysabi.com/flex/enhancedbuttonskin/
named EnhancedButtonSkin.as (right-click, View-Source).
Then declare your TabNavigator component and specify its tabStyleName.
<mx:TabNavigator y="0" height="100%" right="0" left="0" id="navigator" tabStyleName="tab">
And now the css:
<fx:Style>
.tab
{
upSkin:ClassReference('com.EnhancedButtonSkin');
overSkin:ClassReference('com.EnhancedButtonSkin');
downSkin:ClassReference('com.EnhancedButtonSkin');
disabledSkin:ClassReference('com.EnhancedButtonSkin');
selectedUpSkin:ClassReference('com.EnhancedButtonSkin');
selectedOverSkin:ClassReference('com.EnhancedButtonSkin');
selectedDownSkin:ClassReference('com.EnhancedButtonSkin');
selectedDisabledSkin:ClassReference('com.EnhancedButtonSkin');
cornerRadii: 5, 5, 0, 0;
borderColors: #CC0000, #000000;
overBorderColors: #003399, #003399;
selectedBorderColors: #666666, #FFFFFF;
borderThickness: 1;
borderAlpha: 1;
fillColors: #CC3300, #F98900;
fillAlphas: 1, 1;
fillColorRatios: 0, 255;
overFillColors: #999999, #FFFFFF;
overFillAlphas: 1, 1;
overFillColorRatios: 0, 255;
selectedFillColors: #999999, #FFFFFF;
selectedFillAlphas: 1, 1;
selectedFillColorRatios: 111, 255;
highlightAlphas: 0, 0;
color: #000000;
textRollOverColor: #000000;
fontSize: 13;
}
</fx:Style>
This css will display:
how can I completely remove button effects from a Button component in Flex ?
Background, Fill and border are completely white. But still I've a black shadow around the button (see picture bloew):
http://dl.dropbox.com/u/72686/button.png
thanks
Button {
fillAlphas: 1.0, 1.0, 1.0, 1.0;
fillColors: #FFFFFF, #FFFFFF;
themeColor: #FFFFFF;
borderColor: #FFFFFF;
cornerRadius: 0;
paddingTop: 0;
paddingLeft: 0;
paddingRight: 0;
paddingBottom: 0;
horizontalGap: 0;
leading: 0;
fontWeight: normal;
color: #000000;
textSelectedColor: #000000;
textRollOverColor: #000000;
}
skin: ClassReference(null) will not work; use the below its wokrs
upSkin: ClassReference(null);
overSkin: ClassReference(null);
downSkin: ClassReference(null);
disabledSkin: ClassReference(null);
selectedUpSkin:ClassReference(null);
selectedOverSkin: ClassReference(null);
selectedDownSkin: ClassReference(null);
selectedDisabledSkin: ClassReference(null);
You should specify the Flex version, since the newly release Flex 4 has a completely different skinning architecture.
Anyhow, I assume this is Flex 3, you could try and set this:
Button {
skin: ClassReference(null);
}
Not sure it'll work, some components choke on null skins.
If it is Flex 4, I suggest creating a skin class that does what you want, even if it is empty, and setting it like so (note the namespace, s for Spark):
s|Button {
skin-class: ClassReference('my.empty.Skin');
}
Where my.empty.Skin is the fully qualified class name for your skin.