Federico Chiesa scored twice as champions Juventus produced a superb display to end AC Milan’s unbeaten league run this season.
The 23-year-old opened the scoring in the 18th minute when he played a fantastic one-two with Paulo Dybala before drilling home.
Davide Calabria levelled with a great side-foot finish before Chiesa gave Juve the lead again with his low drive.
Weston McKennie made certain of victory with a strike from close range.
Milan remain top of Serie A by a point from city rivals Inter who earlier lost 2-1 at Sampdoria. Juve, who have endured a mixed start to the campaign, are now up to fourth – seven points behind Milan.
Juve have won the past nine championships but hopes of making it 10 have taken a big knock this season after a handful of erratic displays under new coach Andrea Pirlo.
Milan, without their injured talismanic striker Zlatan Ibrahimovic, were favourites to win inside the San Siro but were rocked in the 18th minute when Chiesa struck. The Italian winger began the move on the right and then ran into the area to meet Dybala’s control and flick with a first-time strike.
The Serie A leaders regained control and began to test Wojciech Szczesny, with the Polish goalkeeper pulling off great saves to deny impressive Portuguese attacker Rafael Leao and Hakan Calhanoglu.
They finally beat the last line of defence when Leao sped down the left and picked out David Calabria, who placed his effort high past Szczesny.
The Juve goalkeeper was tested again by full-back Diogo Dalot before Chiesa put Juve back in front with a low strike from the edge of the area.
American midfielder McKennie swept in the third 14 minutes from time after good work from Dejan Kulusevski on the right.
- 5DalotSubstituted forMaldiniat 81′minutes
- 24KjaerSubstituted forContiat 81′minutes
- 13RomagnoliBooked at 90mins
- 2CalabriaSubstituted forKalulu Kyatengwaat 81′minutes
- 7Castillejo AzuagaSubstituted forColomboat 87′minutes
- 15HaugeSubstituted forDíazat 67′minutes
- 17da Conceição Leão
- 20Kalulu Kyatengwa
- 43Campos Duarte da Silva
- 13DaniloBooked at 72mins
- 4de Ligt
- 38FrabottaSubstituted forDemiralat 87′minutes
- 22ChiesaSubstituted forKulusevskiat 63′minutes
- 30BentancurBooked at 60minsSubstituted forArthurat 74′minutes
- 8RamseySubstituted forBernardeschiat 74′minutes
- 10DybalaSubstituted forMcKennieat 64′minutes
- 7Cristiano Ronaldo
- 34Da Graca
- 36Di Pardo
- Massimiliano Irrati
Match ends, Milan 1, Juventus 3.
Second Half ends, Milan 1, Juventus 3.
Cristiano Ronaldo (Juventus) wins a free kick in the defensive half.
Foul by Andrea Conti (Milan).
Leonardo Bonucci (Juventus) wins a free kick in the defensive half.
Foul by Brahim Díaz (Milan).
Adrien Rabiot (Juventus) wins a free kick on the left wing.
Dangerous play by Franck Kessié (Milan).
Attempt saved. Daniel Maldini (Milan) left footed shot from the centre of the box is saved in the centre of the goal. Assisted by Andrea Conti.
Hand ball by Franck Kessié (Milan).
Alessio Romagnoli (Milan) is shown the yellow card for a bad foul.
Cristiano Ronaldo (Juventus) wins a free kick on the right wing.
Foul by Alessio Romagnoli (Milan).
Attempt blocked. Theo Hernández (Milan) left footed shot from the left side of the box is blocked. Assisted by Brahim Díaz.
Attempt missed. Hakan Calhanoglu (Milan) right footed shot from outside the box is too high. Assisted by Theo Hernández.
Attempt missed. Alessio Romagnoli (Milan) header from the centre of the box is high and wide to the left. Assisted by Hakan Calhanoglu with a cross following a set piece situation.
Substitution, Milan. Lorenzo Colombo replaces Samu Castillejo.
Substitution, Juventus. Merih Demiral replaces Gianluca Frabotta.
Foul by Dejan Kulusevski (Juventus).
Samu Castillejo (Milan) wins a free kick on the right wing.