Michal Foksa Michal Foksa - 4 months ago 16
CSS Question

Animation, AngularJS: Animation speed in pixels per second?

If I have two lines of text one on top of the other. Content of each line is dynamic.

Is there a way to set animation speed in pixels per second? So that line would scroll with same speed regardless of their length?

Example of the situation:



div {
width: 50%;
padding-left: 10%;
float: left;
height: 50px;
overflow: hidden;
position: relative;
}

#line1 {
background-color: green;
}

#line2 {
background-color: yellow;
}

h4 {
position: absolute;
height: 100%;
margin: 0;
line-height: 50px;
text-align: left;
/* Apply animation to this element */
/* Animation delay 0.5s */
-moz-animation: line-scroll 15s linear 0.5s infinite;
-webkit-animation: line-scroll 15s linear 0.5s infinite;
animation: line-scroll 15s linear 0.5s infinite;
}

#line1 h4 {
/* width must be big enought to fit in whole text othrwise
whole text will not scroll into view */
width: 200%;
}

#line2 h4 {
/* width must be big enought to fit in whole text othrwise
whole text will not scroll into view */
width: 600%;
}

@keyframes line-scroll {
0% {
-moz-transform: translateX(0%);
/* Firefox bug fix */
-webkit-transform: translateX(0%);
/* Firefox bug fix */
transform: translateX(0%);
}
100% {
-moz-transform: translateX(-100%);
/* Firefox bug fix */
-webkit-transform: translateX(-100%);
/* Firefox bug fix */
transform: translateX(-100%);
}
}

<div id="line1">
<h4>I don't want to come off as arrogant here, but I'm the greatest botanist on this planet.</h4>
</div>

<div id="line2">
<h4>Every human being has a basic instinct: to help each other out. If a hiker gets lost in the mountains, people will coordinate a search. If a train crashes, people will line up to give blood. If an earthquake levels a city, people all over the world will send emergency supplies. This is so fundamentally human that it's found in every culture without exception. Yes, there are assholes who just don't care, but they're massively outnumbered by the people who do. ~ Mark Watney, The Martian</h4>
</div>





Means of
AngularJS directive
and
CSS
are welcome.

Answer

You can use JQuery (javascript) to get the width of headings and than calculate the duration based on the width i.e duration per pixel

width() method of jquery is used to get width of the headings.

I calculate the the duration as follows:

1s = 20px

Therefore 100px = 100/20
                = 5s 

You can increase the denominator (see the number10) in var dur1=Math.ceil(w1/10) to speed up the scrolling.
Here is the code

//getting the width of both the headings
var w1=$("#line1>h4").width();
var w2=$("#line2>h4").width();

//calculating the duration of the animation dynamically based on the width
var dur1=Math.ceil(w1/10);
var dur2=Math.ceil(w2/10);

//setting the duration dynamically
$("#line1>h4").css("animation-duration",dur1+"s");
$("#line2>h4").css("animation-duration",dur2+"s");
div {
    width: 50%;
    padding-left: 10%;
    float: left;
    height: 50px;
    overflow: hidden;
    position: relative;
}

#line1 {
    background-color: green;
}

#line2 {
    background-color: yellow;
}

h4 {
    position: absolute;
    height: 100%;
    margin: 0;
    line-height: 50px;
    text-align: left;
    /* Apply animation to this element */
    /* Animation delay 0.5s */
    -moz-animation: line-scroll 15s linear 0.5s infinite;
    -webkit-animation: line-scroll 15s linear 0.5s infinite;
    animation: line-scroll 15s linear 0.5s infinite;
}

#line1 h4 {
    /* width must be big enought to fit in whole text othrwise
    whole text will not scroll into view */
    width: 200%;
}

#line2 h4 {
    /* width must be big enought to fit in whole text othrwise
    whole text will not scroll into view */
    width: 600%;
}

@keyframes line-scroll {
    0% {
        -moz-transform: translateX(0%);
        /* Firefox bug fix */
        -webkit-transform: translateX(0%);
        /* Firefox bug fix */
        transform: translateX(0%);
    }
    100% {
        -moz-transform: translateX(-100%);
        /* Firefox bug fix */
        -webkit-transform: translateX(-100%);
        /* Firefox bug fix */
        transform: translateX(-100%);
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="line1">
    <h4>I don't want to come off as arrogant here, but I'm the greatest botanist on this planet.</h4>
</div>

<div id="line2">
    <h4>Every human being has a basic instinct: to help each other out. If a hiker gets lost in the mountains, people will coordinate a search. If a train crashes, people will line up to give blood. If an earthquake levels a city, people all over the world will send emergency supplies. This is so fundamentally human that it's found in every culture without exception. Yes, there are assholes who just don't care, but they're massively outnumbered by the people who do. ~ Mark Watney, The Martian</h4>
</div>