Moreno ascended the youth ranks ofClub Universidad Nacional, making his senior debut in 2006 at the age of 18. He moved abroad a year later, joining Dutch sideAZ Alkmaar, with whom he won his first league title. He joined Spanish sideEspanyol in 2011, playing with the side for four years before returning to the Netherlands withPSV Eindhoven. In 2017, Moreno had a short spell withRoma before moving back to Spain with Real Sociedad. In 2019, he joined Qatari sideAl-Gharafa. In 2021, he returned to Mexico to joinMonterrey.
Moreno made his professional debut during theClausura 2006 tournament, coming on as an 88th-minute substitute forGerardo Galindo in the 1–0 victory overSantos Laguna on 22 January.[3] He played his first full 90 minutes on 12 February in a 2–0 win overVeracruz,[4] and scored his first goal the following week in a 1–3 defeat toCruz Azul.[5] Moreno would end the Clausura making six appearances in total. He would eventually secure his position as a regular starter.
For theApertura 2007, Moreno would play in his first, and only, league final with UNAM, losing toAtlante 2–1 on aggregate.[6]
On 13 December 2007, it was announced Moreno was transferred to Dutch clubAZ in aUS$4.5 million deal.[7][8] He made hisEredivisie debut on 1 March 2008 in a 1–1 draw againstRoda JC, playing the full 90 minutes.[9] In April 2009, Moreno won his firstEredivisie title with AZ.[10] On 22 April, it was reported Moreno had signed a contract extension with AZ which would tie him to the club until 2014.[11]
On 25 July, AZ won theJohan Cruyff Shield after defeatingHeerenveen 5–1 in thefinal. Moreno made his debut in theUEFA Champions League on 16 September in a 0–1 defeat toOlympiacos.[12] On 7 February 2010, Moreno gave Alkmaar a 2–1 victory overFeyenoord by scoring a header from a corner-kick in the 87th minute.[13] He scored his third goal of the season in a 6–2 victory overRKC Waalwijk on 13 March 2010. He would score his fourth goal in a 3–0 victory overWillem II on 18 April.[14]
On 22 June 2011, it was announced Moreno would transfer to SpanishLa Liga clubEspanyol on a five-year contract for an undisclosed fee.[15] On 28 August, he made his debut in La Liga againstMallorca. On 26 September, he scored his first goal in a 1–3 loss toLevante.[16] On 3 December, he would score his second league goal in a 1–2 loss toValencia.[17] Moreno scored his third goal of the season in a 3–1 home win againstRacing de Santander.[18]
On 4 October 2012, Moreno was named Espanyol's Player of the Year for the2011–12 season, his debut season, playing 35 league matches (for a total of 3,295 minutes played) and scoring three goals with one assist.[19]
Prior to the start of the2014–15 season, it was announced Moreno would be out of action for up to six months due to a broken left tibia he suffered while playing for Mexico at the2014 FIFA World Cup, which would require surgery and rehabilitation.[20] It was rumoured the injury prevented him from signing forManchester United during the summer transfer window.[21] Moreno made his return after four months on 14 November in a friendly againstMarseille, replacingFelipe Caicedo in the 68th minute in an eventual 2–1 win.[22]
Moreno made his official return with Espanyol on 2 December, coming off the bench to replaceÁlvaro in the 73rd minute in the 2–0 victory overAlavés in the first leg of the round of 32 of theCopa del Rey.[23]
On 15 August 2015,PSV Eindhoven announced the signing of Moreno. Upon his return to the Eredivisie, Moreno signed a four-year contract for €5 million with the club.[24]
Moreno was handed a starting berth on his debut and played all 90 minutes in the 6–0 win overCambuur on 12 September. Three days later, during PSV's opening2015–16 UEFA Champions League match against Manchester United, Moreno broke the leg ofLuke Shaw as the result of a two-footed challenge.[25] He was not sanctioned for the tackle on Shaw, and Moreno went on to score the 47th-minute equaliser for PSV as they defeated Manchester United 2–1 in the match. He was later namedUEFAMan of the Match.[26]
On 17 January 2016, Moreno scored in PSV's 2–0 win overFeyenoord.[27] A week later, he scored his first double as PSV defeatedTwente 4–2 with assists provided by fellow Mexico national teammate,Andrés Guardado.[28][29]
On 8 May, Moreno played all 90 minutes in PSV's defeat ofPEC Zwolle 3–1 on the final matchday to be crowned2015–16 Eredivisie champions.[30]
On 31 July, PSV won the2016 Johan Cruyff Shield but Moreno was not present on the field or bench.
Thefollowing season, Moreno played in 39 matches across all competitions, and scored seven goals, a career-high tally, though PSV failed to defend the league as they finished in third place.
On 13 June 2017, Moreno joined Italian sideRoma on a four-year contract.[31] He made hisSerie A debut on 16 September in Roma's 3–0 win overHellas Verona, replacingKostas Manolas in the 73rd minute.[32]
On 31 January 2018, Spanish clubReal Sociedad announced the transfer of Moreno from Roma for €6 million, signing with the club until 2021.[33] On 15 February, he made his competitive debut forLa Real againstRed Bull Salzburg in theEuropa League, playing 76 minutes in the team's 2–2 draw. During midweek training, however, Moreno suffered a grade 1 injury to his internal obturator, meaning he would be ruled out for an undisclosed period of time.[34] He returned and made his debut in La Liga with Real Sociedad on 1 March in a scoreless draw againstReal Betis. Three days later, he scored his first goal againstDeportivo Alavés, giving his team the lead at the 6th minute, in an eventual 2–1 victory.[35]
He transferred toAl-Gharafa in July 2019, making him the first Mexican international player to play inQatar Stars League.[36] He made his debut the following month on 22 August in a 3–0 victory overAl-Shahania.[37] On 9 November, he would score his first goal for the team in a 2–0 victory overUmm Salal SC.[38]
During Mexico's first match at the2007 FIFA U-20 World Cup against Gambia, Moreno played as a defensive midfielder and scored Mexico's third goal in a 3–0 victory. Mexico would win their group but would be eliminated in the quarter-finals byArgentina.
On 5 June 2014, national team coachMiguel Herrera named Moreno in the final 23-man squad for the2014 World Cup.[50] On 29 June, in theround of 16 match against theNetherlands, Moreno suffered a fractured tibia after a collision with Dutch strikerArjen Robben inside his own penalty area. Moreno was stretchered off the field a few minutes before half-time and was substituted byDiego Reyes.[51] It was later reported Moreno was expected to be ruled out of action for up to six months.[52]
On 27 June 2015, during Mexico's friendly match againstCosta Rica, Moreno was substituted off at half-time after complaining of pain. On 1 July, theMexican Football Federation announced Moreno would be ruled out of the upcoming2015 CONCACAF Gold Cup tournament after a successful surgery on his right foot, which stemmed from complications related to a procedure he underwent six years prior following an injury to his fifth metatarsal.[53] He was replaced in the squad byOswaldo Alanís.[54] As Mexico won the tournament,[55] he was called up by interim managerRicardo Ferretti to participate in the subsequentCONCACAF Cup – a play-off match to determine CONCACAF's entry into the2017 FIFA Confederations Cup – against the United States. Mexico won the match 3–2 during overtime.[56]
He was called up for the2017 FIFA Confederations Cup.[58] He would score the late equalizer in the 2–2 group-stage draw againstPortugal.[59] He would go on to appear all five matches of the tournament.[59]
In May 2018, Moreno was named in Mexico's preliminary 28-mansquad for theWorld Cup,[60] and in June, was ultimately included in the final 23-man roster.[61] He would appear in all group stage matches but accumulated two yellow cards during the group stage, making him miss out on the round-of-16 0–2 loss againstBrazil.[62]
On 6 June 2019, Moreno was called up by coachGerardo Martino to participate in theCONCACAF Gold Cup.[63] Three days later, in a warm-up match againstEcuador, he would pick up an injury following a clearance.[64] He would return to the field on 29 June in thequarter-final match againstCosta Rica, coming in as anovertime substitute at the 106th minute and managing to score in thepenalty shoot-out.[65][66] On 2 July, Moreno played his100th match with Mexico againstHaiti, in a 1–0 win in thesemi-finals of the Gold Cup.[67] The team would go on to win the tournament, defeating the United States 1–0 in thefinal.[68]
AsTricaptainAndrés Guardado withdrew from the2021 Gold Cup roster due to injury, Moreno was expected to wear the captain armband,[69] but did not appear until the final group stage match due to being unfit.[70] In thefinal against the United States, Moreno withdrew during the first half of the match due to injury, being replaced byCarlos Salcedo.[71] Mexico lost the match 1–0.
In October 2022, Moreno was named in Mexico's preliminary 31-mansquad for theWorld Cup, and in November, was ultimately included in the final 26-man roster.[72]
Moreno is a left-footed defender who is capable of starting attacks from the back and "with excellent passing that characterizes the modern center back".[73] Writing forBleacher Report, Allan Jiang described him as being able to "read and quickly react in adverse situations", as well as having positional awareness. He described Moreno's playing style as retaining the dominant defensive position, jockeying and forcing the opposing player into a mistake.[74]