A sublime strike from Ibrahim Afellay opened the scoring for the visitors with 14 minutes gone, and Marco Hoger made it 2-0 three minutes into the second half.
Robert Lewandowski responded eight minutes later with a header, but that was about the best that a below-par Dortmund side could offer, as they now face a daunting 12-point gap to leaders Bayern Munich with only eight games played, while Schalke now sit seven points off the pace in third place.
A rash of injuries left Jurgen Klopp without a host of first team players for his team selection, meaning that the likes of Moritz Leitner and Ivan Perisic were handed a chance to impress in the starting XI.
However, the changes seemed to affect Dortmund’s poise in the opening exchanges, and Schalke duly took advantage when they broke the deadlock after 14 minutes.
A cross into the area was not properly dealt with by the Dortmund defence, and Afellay pounced at the far post to direct an inch-perfect volley into the bottom corner.
The expected response from the visitors never materialized, and in fact, it was Schalke who nearly scored again. Jefferson Farfan’s pinpoint delivery found Klass-Jan Huntelaar unmarked, but the Dutch forward could only plant his header over the bar.
The match unfolded at a slow tempo, with Die Knappen happy to sit deep and soak up the Dortmund pressure in their half. However, with half time approaching, a few cracks finally began to appear in their rearguard.
First, Lewandowski released Marco Reus through on goal, but the Germany international saw his strong effort smothered by Lars Unnerstall. Moments later, Lewandowski was nearly put completely in the clear by Leitner, but his poor control destroyed what looked like a golden opening.
However, hopes of a BVB renaissance in the second half were put in serious jeopardy three minutes after the restart, as Schalke pounced on another shoddy defensive sequence to race into a two goal lead.
A loose ball from Reus was claimed by Holtby, and with Dortmund’s defence pushed high up the field, he picked out Hoger on the run, who had nearly half the pitch to himself before calmly slotting past Weidenfeller.
It could have been game over in the 53rd minute, after more poor defending on a corner saw Joel Matip poke over the bar from point blank range, after Schalke had won the initial flick on.
But just when the home side looked at their most dangerous, Dortmund, finally, decided to wake up. A free kick from Reus was hit towards the centre of the goal, where Lewandowski was waiting to flick a clever header past Unnerstall with the back of his head.
However, there was still not a lot to suggest that BVB would find a way back into the game, and Schalke nearly re-established their two goal advantage with 19 minutes remaining. Huntelaar did well to find the diagonal run of Afellay, who advanced on goal but saw his finish parried by the onrushing Weidenfeller.
Huntelaar had two chances to put matters beyond any doubt late on, first with a drive from outside the box that flew into the side netting, then with a one-on-one that was blocked by Weidenfeller.
It mattered little in the end, as Dortmund simply cound not move out of their rut, and failed to stake a serious claim for an equaliser as Schelke were able to finish with all three points in the Ruhr derby.