Cresciuto nelle giovanili dell'Osijek fino al 2006 e poi in quelle dell'Hajduk Spalato, l'8 marzo[2008 esordisce in prima squadra ed in massima serie del campionato croato subentrando al compagno Duje Čop al 71º minuto della partita tra Dinamo Zagabria-Hajduk Spalato, terminata poi con una sconfitta per 1 a 0. Gioca altre 2 partite in campionato prima di essere ceduto il 1º marzo 2009 a titolo definitivo alla squadra svedese del Djurgården.
Con i Blåränderna esordisce il 6 aprile seguente nella gara di Allsvenskan vinta 1 a 0 contro l'Örebro, subentrando al 58º a Christer Youssef. Alcuni giorni dopo gioca la sua prima gara da titolare nel pareggio per 0 a 0 contro il Gefle. Nella sua prima stagione in Svezia riesce a segnare 4 gol: il primo in Svenska Cupen contro l'IFK Hässleholm il 26 aprile 2009, mentre gli altri 3 invece li segna in campionato rispettivamente contro il Brommapojkarna (20 settembre), l'Häcken (19 ottobre) e l'Örgryte (24 ottobre).
Istra 1961
Il 1º luglio 2011, dopo aver giocato 41 presenze totali con 4 gol con la maglia del Djurgårdens IF, ritorna in Croazia nelle file dell'Istria 1961. Il 22 luglio esordisce con la squadra di Pola giocando tutti i 90 minuti della sfida persa per 2 a 1 contro il Karlovac. Il primo gol in terra croata è datato 3 marzo 2012 in campionato contro il Varaždin, poi vinta per 2 a 1.
La successiva stagione colleziona 31 presenze in campionato segnando anche 4 reti: il 9 marzo 2013 contro l'Hajduk Spalato, il 6 aprile contro lo Zara, il 19 aprile contro l'Inter Zaprešić ed il 27 aprile contro il Cibalia.
Rostov
Il 1º luglio 2013 si trasferisce in Russia al Rostov, il 21 luglio seguente esordisce in Prem'er-Liga subentrando a Cimafej Kalačoŭ al 77º minuto della gara pareggiata per 2 a 2 contro il Krasnodar. Il 1º settembre 2013 segna il suo primo gol russo nel pareggio per 1 a 1 contro la Dinamo Mosca. L'8 aprile 2014 conquista il suo primo trofeo in carriera grazie alla vittoria del Rostov nella finale di Coppa di Russia contro il Krasnodar.
IL 21 agosto 2014 esordisce in UEFA Europa League nel preliminare di andata perso per 2 a 0 contro i turchi del Trabzonspor. Conclude la sua esperienza in Russia con 53 presenze totali e 2 gol segnati.
Il ritorno all'Hajduk Spalato
L'11 agosto 2015 ritorna in Croazia e ritorna nelle file dell'Hajduk Spalato, con la quale gioca in stagione 35 partite tra campionato, Coppa di Croazia ed UEFA Europa League, mettendo a segno anche un gol il 19 dello stesso anno, contro la sua ex squadra, l'Istra 1961.
Fiorentina
Il 16 agosto 2016 approda nella massima serie del campionato italiano: la Fiorentina attraverso un comunicato[2] dichiara di aver acquisito a titolo definitivo le prestazioni sportive del giocatore croato, in cambio di un milione di euro, sottoscrivendo con il giocatore un contratto biennale con opzione per un altro anno.
Tuttavia l'esperienza a Firenze si è rivelata negativa dato che per buona parte della stagione Milić è stato la riserva di Maximiliano Olivera e senza impressionare positivamente nelle 19 partite giocate tra campionato e coppe.[3]
Olympiakos
Il 23 luglio 2017 passa a titolo definitivo ai greci dell'Olympiakos per 1,5 milioni di euro.[4] Il 31 gennaio 2018, dopo aver disputato appena 4 partite tra campionato e coppe in 6 mesi viene svincolato dalla squadra greca.[5]
Napoli
Il 23 febbraio 2018 viene ufficializzato il suo tesseramento dal Napoli con un tweet del Presidente Aurelio De Laurentiis.[3][6] Sceglie di indossare la maglia numero 19. Nei 4 mesi passati al Napoli, stagione in cui la squadra ha sfiorato lo scudetto, però, non gioca neanche una partita ufficiale e rimane svincolato a fine stagione.
Crotone
Il 1º febbraio 2019 viene ufficializzato il suo tesseramento (da svincolato) al Crotone in Serie B per sostituire Bruno Martella ceduto al Brescia.[7] Sceglie di indossare il numero 16. Esordisce con la nuova maglia il 10 febbraio, giocando da titolare la partita pareggiata 1-1 contro il Verona.
Il 17 agosto 2022, tornerà in patria dopo 6 anni, accasandosi allo Zrinski Jurjevac, militante nelle serie minori croate.[9]
Nazionale
Il 10 giugno 2013 debutta con la nazionale croata nella partita amichevole disputata a Ginevra contro il Portogallo,[10] terminata con una sconfitta per 1-0 in cui ha giocato tutti i 90 minuti.[10]