That was after Romelu Lukaku's 62nd-minute penalty for the visitors had been cancelled out eight minutes later by Antonio Sanabria.
AC Milan were then condemned to defeat at the San Siro by Matteo Politano's effort four minutes into the second half as Napoli moved up to fifth in the table. The Rossoneri had substitute Ante Rebic sent off in stoppage time.
Ronaldo headed the opener in the 10th minute, scored a second from the penalty spot in the 25th with his right foot and then completed his treble with a strike with his left seven minutes later, taking him to 23 league goals for the season. Giovanni Simeone made it 3-1 in the 61st minute.
Second-bottom Parma registered their first win in 18 league outings as they beat Roma 2-0 at the Stadio Ennio Tardini.
Valentin Mihaila scored early on and Hernani added a penalty 10 minutes into the second half for the hosts, who are now three points behind 17th-placed Cagliari. Torino are 18th, a point better off than Parma and with two games in hand over the sides around them.
Bologna beat Sampdoria 3-1 at home, with Musa Barrow and Mattias Svanberg scoring either side of Fabio Quagliarella's reply in the first half, and Roberto Soriano notching the Rossoblu's third after the break.
Paris St Germain missed the chance to move to the top of Ligue 1 as they suffered a shock 2-1 home loss to lowly Nantes.
Victory would have seen PSG go above leaders Lille on goal difference, but after Julian Draxler put Mauricio Pochettino's side ahead just before the break, goals from Randal Kolo Muani and Moses Simon turned things around in the second half.
Lille had earlier drawn 0-0 at fourth-placed Monaco.
Nantes are up a place to 18th, a point behind Lorient who drew 1-1 at home with Nice. Yoane Wissa scored a 66th-minute equaliser for Lorient, eight minutes after Myziane Maolida had put Nice in front.
Nimes drop to 19th and remain two points adrift of safety after also drawing 1-1 at home, against Montpellier, leading through Moussa Kone before Andy Delort levelled.
Rock-bottom Dijon lost 3-1 at home to Bordeaux, for whom Hwang Ui-jo netted a brace and Nicolas De Preville also scored. Moussa Kounate registered a late consolation for Dijon.
Lens and Metz, in sixth and seventh respectively, battled out a 2-2 draw at the Stade Bollaert-Delelis. The first half saw Jonathan Clauss put Lens ahead, Vagner equalise with a penalty and Yannick Cahuzac restore the hosts' advantage before Metz levelled again just prior to the hour mark through Thomas Delaine.
Rennes recorded a first win under Bruno Genesio as they beat Strasbourg 1-0 at home thanks to Benjamin Bourigeaud's first-half goal.
In the Bundesliga, second-placed RB Leipzig are four points behind leaders Bayern Munich after being held to a 1-1 draw at home by Eintracht Frankfurt.
Emil Forsberg's finish in the opening moments of the second half was cancelled out by Daichi Kamada in the 61st minute as Julian Nagelsmann's team dropped points for the first time in seven games.
Arminia Bielefeld moved out of the relegation places, up from 17th to 15th, with a 2-1 win at Bayer Leverkusen, their first victory under Frank Kramer.
Ritsu Doan and Masaya Okugawa put the away side two goals up before Patrik Schick pulled one back in the 85th minute.
Stuttgart beat Hoffenheim 2-0 at home courtesy of a Kasim Adams own goal and Sasa Kalajdzic effort.
In LaLiga, fourth-placed Sevilla secured a 1-0 derby win over Real Betis at home, with Youssef En-Nesyri scoring a 27th-minute winner.
That took Julen Lopetegui's side six points clear of fifth-placed Real Sociedad, who lost 1-0 at Granada, with German netting in the 51st minute.
Villarreal triumphed 3-1 at Eibar. Moi Gomez and Carlos Bacca scored for the Yellow Submarine in the first half before Sergi Enrich replied early in the second. Villarreal then had Etienne Capoue sent off in the 80th minute, before Alfonso Pedraza wrapped up their win.
Elsewhere, Celta Vigo's clash with Athletic Bilbao ended goalless.