1660년(현종 1) 진사가 되고, 1662년 증광문과에 을과로 급제, 승문원의 관직과 주서 등을 거쳤다. 1666년 사관(史官)인 검열이 되고, 이어 봉교 · 겸설서로 승진하였다.
사관으로 있을 때인 1667년 왕이 지난해에 정태화(鄭太和) · 홍명하(洪命夏) · 허적(許積)을 탄핵한 이숙(李䎘) · 박증휘(朴增煇) 등 7명의 간관을 유배보내면서 사관들에게 이를 사초(史草)에 기록하지 말도록 명했으나, 왕의 거둥은 반드시 기록해야 하는 것이라며 거절하고 이를 사초에 기록하였다. 이 일로 왕의 노여움을 사서 파직당했으나, 파직의 왕명이 곧 철회됨으로써 복직되었다.
그 뒤 전적 · 정언 · 사서 · 지평 등을 거쳐 1672년 말에 접위관(接慰官)이 되어 동래에서 왜인을 접대하였다. 그 뒤 부교리 · 헌납 · 이조정랑 등을 거쳐 통정대부(通政大夫)로 승진하였다. 1675년(숙종 1)에 수원부사를 거쳐 이후 황해도관찰사 · 예조참의 · 승지 · 강원도관찰사 · 충청도수사 · 경기도관찰사 · 이조참판 겸 수어사(守禦使) · 지중추부사 등을 역임하고, 1680년 예조판서가 되었다. 이어 대사헌 · 호조판서 · 강화유수 · 병조판서 · 판의금부사 · 우참찬 · 좌참찬 · 이조판서 등을 거쳐 1687년에 우의정이 되었다. 그 사이 1683년 동지사(冬至使)로 청나라에 다녀오기도 하였다.
1688년 좌의정이 되었는데, 이 때 인조의 손자인 동평군 항(東平君杭)의 횡포를 논하다가 처벌된 박세채(朴世采), 남구만(南九萬) 등을 변호하여 왕의 노여움을 사게 되자 병을 핑계로 사직하였다. 다음해 판돈녕부사가 되었고, 이어 영돈녕부사가 되었으나, 1691년 전 해에 있었던 왕세자책봉하례에 참석하지 않은 죄로 고성(固城)에 유배되어 배소에서 죽었다. 죽은 뒤인 1694년 갑술환국으로 복관되었다. 시호는 충헌(忠憲)이다.