Why does the top fade out earlier than the bottom in this scene?
Connecting different socket types is generally a bad idea. In this case you have the Object coordinates (a Vector - as indicated by the blue socket) connected to the scalar Value input of a Multiply Math node. This will automatically convert from the vector into a scalar (ie, a plain number) by averaging each of the X,Y,Z values of the vector together - not what you want. Instead, replace the Multiply node with a Separate XYZ node and then use whichever of the X, Y, Z outputs matches your requirements (probably X as indicated in the comments).