I was working on my game and figured out a cool formula for this and just wanted to share it.
How it works
The basic premise is that you take the difference between in the Absolute Position between the element and the top of the scrolling frame and you set the Canvas Position to it.
ScrollingFrame.CanvasPosition = Vector2.new(0, (Element.AbsolutePosition.Y - ScrollingFrame.AbsolutePosition.Y))
In Practice
I put this to work in a loop with 3 elements in it. Each element has a button with an identical name. One bug I encountered was that I needed to get each frames absolute position BEFORE the player started scrolling. I helped to solve this problem by requiring the loop to go through each element BEFORE they can click on one.
The Code
local scroller = script.Parent:WaitForChild("ScrollingFrame")
local loaded = 0
local allButs = script.Parent:WaitForChild("Buttons"):GetChildren()
for i, but in pairs(allButs) do
if not but:IsA("ImageButton") then continue end
local frame :Frame = scroller:WaitForChild(but.Name)
local abosPos = frame.AbsolutePosition.Y
loaded += 1
but.MouseButton1Click:Connect(function()
if loaded < #allButs-1 then return end
scroller.CanvasPosition = Vector2.new(0, (abosPos - scroller.AbsolutePosition.Y))
end)
end
Video
Thank you for reading my first tutorial, I hope you learned something!