There are a few ways to do this, I can describe how I see this working using the fragment shader.
You are right that shaders need input from the scene to animate, you can input time to make it consistently animate without worrying about user input. After you add time as uniform to your material, you can have a global or something called time, set it to zero, then in your update or animate function you can:
time += 0.001;
material.uniforms.time.value = time;
Then the rings are full meshes with no moving parts, like just like a basic ring, then in the fragment shader you pass in time and you just assign the output color like this:
vec4 color = vec4(1, 1, 1, mod(uv.x+time,1.0)); // the alpha value is the last one
then you just have to make sure the the UVs on your ring are set up that x axis is along the parameter and the y axis is the radius. I am not sure how three.js lays out the UVs for the line mesh, but you can make something like this in a 3d modeling software and set the UVs yourself. This might be too much of a pain if you aren't familiar with 3d modeling.
If this seems like too much for right now, I'd suggest using a gradient texture upon the 3d model, and rotating it. Maybe update your question with what went wrong when you tried that.
In working with three.js I always advise not shying away from getting 3d models from elsewhere and loading them in, for me, it usually is a faster way to get the desired effect.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…