We've struggled with this too. This kinda summarises our journey, that's not to say the same things will apply to you!
Design work is done in sprint
This used to be OK when we were doing long sprints (4 weeks) and there was time for some back and forth, between the designer, UX and Marketing about what the final design should be. Even in long sprints though, if we were doing very different design to what currently existed (i.e. brand redesign), stakeholders would want more time to think than there was in the sprint.
I think this approach can work if your sprint length is reasonably long, you're working to strict brand guidelines and your PO can sign off designs themselves without having to go to other stakeholders
As our iterations got shorter and we got burnt by more stories being blocked awaiting design sign off, we tried:
Design as separate stories
This enabled us to bring the work in sooner, allowing us to better plan when we needed to start design work in order to ensure it was signed off in time to work on the story.
This has worked OK but it does cause some issues with velocity and estimation (see Lunivore's answer) and I was never keen on having dependent stories in the backlog (design is valueless without the dev, dev cant be done without the design).
We're now doing:
Design is part of our definition of ready
We have a ready for sprint column on our board - stories can only move from the backlog to ready if they are sized appropriately, have acceptance criteria and have completed, signed off designs.
This still gives us visibility of forthcoming stories that we need designs for without having 'design for xyz page' separately in the backlog and the design work is done outside of the sprint so it doesn't affect estimation or planning.
That said, we do still have some stories that come through where we end up doing dev to wireframes to get stuff in the right place and end up doing the CSS a week or two later when we've got the actual designs.