
웹사이트를 보다 보면 어떤 텍스트는 드래그로 선택이 되고, 어떤 요소는 아무리 마우스로 긁어도 선택되지 않는 경우가 있습니다. 이 동작을 제어할 때 사용하는 CSS 속성이 바로 user-select입니다.
처음 보면 아주 단순한 속성처럼 보이지만, 실제로는 꽤 자주 쓰입니다. 버튼처럼 굳이 드래그 선택될 필요가 없는 요소에 적용하기도 하고, 복사 경험을 정리하거나, 반대로 본문 텍스트는 선택 가능하게 유지하는 식으로 사용자 경험을 조절할 때도 사용합니다.
이번 글에서는 user-select가 정확히 무엇인지, 왜 사용하는지, 어떤 값들이 있는지, 그리고 실무에서 언제 쓰고 언제 피해야 하는지 정리해보겠습니다.
user-select란?
user-select는 사용자가 텍스트나 요소의 내용을 선택할 수 있는지 여부를 제어하는 CSS 속성입니다.
쉽게 말하면 다음과 같습니다.
- 사용자가 마우스로 드래그해서 텍스트를 선택할 수 있게 할지
- 선택되지 않도록 막을지
- 특정 방식으로만 선택되게 할지
예를 들어 아래 코드는 텍스트 선택을 막는 가장 기본적인 형태입니다.
.button-like {
user-select: none;
}
이렇게 설정하면 사용자가 해당 요소의 텍스트를 드래그해도 선택되지 않습니다.
왜 필요한가?
기본적으로 웹의 텍스트는 선택할 수 있는 것이 자연스럽습니다. 그런데 모든 요소가 반드시 선택 가능해야 하는 것은 아닙니다.
예를 들어 다음과 같은 경우를 생각해볼 수 있습니다.
- 버튼을 여러 번 클릭하다가 텍스트가 파랗게 선택되어 보기 불편한 경우
- 드래그 기반 UI에서 글자가 같이 선택되어 인터랙션이 어색해지는 경우
- 복사할 필요가 없는 장식용 텍스트에서 불필요한 선택 효과를 막고 싶은 경우
이런 상황에서 user-select를 적절히 사용하면 인터페이스가 더 깔끔하게 느껴질 수 있습니다.
다만 중요한 점이 있습니다. user-select는 보안 기능이 아닙니다. 텍스트 복사를 완전히 막는 기술이라고 생각하면 틀립니다. 단지 브라우저의 일반적인 선택 동작을 제어하는 속성일 뿐입니다.
자주 사용하는 값
1. auto
기본값입니다. 브라우저의 기본 선택 동작을 그대로 따릅니다.
.text {
user-select: auto;
}
대부분의 본문 텍스트는 별도 설정 없이 사실상 이 상태로 동작합니다.
2. none
사용자가 텍스트를 선택하지 못하게 합니다.
.no-select {
user-select: none;
}
버튼, 아이콘 라벨, 드래그 핸들 같은 요소에서 자주 사용됩니다.
3. text
선택 가능하도록 명시합니다.
.copy-area {
user-select: text;
}
상위 요소에서 user-select: none이 적용된 상황에서도, 특정 자식 요소만 다시 선택 가능하게 만들고 싶을 때 쓸 수 있습니다.
4. all
요소의 일부를 선택하려고 해도 전체 내용이 한 번에 선택되도록 유도합니다.
.code-snippet {
user-select: all;
}
코드 조각, URL, 쿠폰 코드처럼 “부분 복사”보다 “전체 복사”가 더 자연스러운 콘텐츠에서 유용합니다.
실제 사용 예제 1: 버튼 텍스트 선택 방지
가장 흔한 예시는 버튼이나 버튼처럼 동작하는 UI입니다.
HTML
<button class="action-btn">Submit</button>
CSS
.action-btn {
padding: 12px 20px;
border: none;
background: #111;
color: #fff;
border-radius: 8px;
cursor: pointer;
user-select: none;
}
이 예제는 왜 필요한가?
버튼을 빠르게 여러 번 클릭하거나 드래그하듯 눌렀을 때, 버튼 텍스트가 선택되어 파랗게 표시되는 경우가 있습니다. 기능적으로 큰 문제는 아니지만, 시각적으로 지저분하고 사용감도 좋지 않습니다.
이럴 때 user-select: none을 적용하면 버튼은 더 버튼답게 동작합니다. 즉, 클릭을 위한 요소이지 텍스트 선택을 위한 영역이 아니라는 점을 분명히 해줍니다.
실제 사용 예제 2: 드래그 UI에서 불필요한 텍스트 선택 방지
드래그 가능한 카드나 리스트에서는 user-select가 더 중요해집니다.
HTML
<div class="card">
<h3>Project Alpha</h3>
<p>Drag this card to change its order.</p>
</div>
CSS
.card {
width: 280px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 12px;
background: #fff;
cursor: grab;
user-select: none;
}
카드를 드래그할 때 텍스트가 함께 선택되면 인터랙션이 매우 어색해집니다. 이런 상황에서는 user-select: none이 사실상 UX 정리용 속성처럼 작동합니다.
실제 사용 예제 3: 코드나 링크 전체 선택 유도
이번에는 반대로 선택을 더 편하게 만드는 예시입니다.
HTML
<p class="coupon-code">WELCOME2026</p>
CSS
.coupon-code {
display: inline-block;
padding: 10px 14px;
background: #f4f4f4;
border-radius: 8px;
font-family: monospace;
user-select: all;
}
이 경우 사용자가 코드 일부만 긁으려고 해도 전체 문자열이 한 번에 선택될 수 있습니다. 쿠폰 코드나 초대 코드, 짧은 명령어처럼 통째로 복사하는 게 자연스러운 콘텐츠에 잘 맞습니다.
user-select: all은 언제 유용할까?
이 값은 일반 텍스트 본문에는 거의 맞지 않습니다. 하지만 아래 같은 콘텐츠에는 꽤 실용적입니다.
- 쿠폰 코드
- 계좌번호처럼 통째로 복사해야 하는 짧은 문자열
- API 키 안내용 예시 문자열
- 설치 명령어
- 공유 링크
예를 들어 블로그 글에서 설치 명령어를 보여줄 때도 활용할 수 있습니다.
.command {
user-select: all;
}
다만 긴 텍스트에는 불편할 수 있습니다. 사용자가 일부만 선택하고 싶어도 전체가 선택되기 때문입니다.
실무에서 자주 쓰는 패턴
실무에서는 보통 다음처럼 씁니다.
버튼, 탭, 배지, 아이콘 라벨
.ui-control {
user-select: none;
}
본문, 입력 예시, 설명 텍스트
.article-text {
user-select: text;
}
복사용 코드 영역
.copy-target {
user-select: all;
}
결국 핵심은 간단합니다.
그 요소가 “읽고 복사해야 하는 콘텐츠”인지, 아니면 “조작을 위한 UI”인지를 구분하는 것입니다.
언제 사용하면 좋을까?
user-select는 다음 같은 상황에서 유용합니다.
사용하기 좋은 경우
- 버튼이나 탭처럼 텍스트 선택이 필요 없는 UI
- 드래그 앤 드롭 인터페이스
- 빠르게 클릭하는 상호작용 요소
- 쿠폰 코드, 짧은 명령어, 링크처럼 한 번에 복사하게 만들고 싶은 콘텐츠
이런 경우에는 사용자가 의도하지 않은 선택을 줄이거나, 반대로 복사를 더 쉽게 만들 수 있습니다.
언제 사용하면 안 될까?
이 속성도 남용하면 좋지 않습니다.
피해야 하는 경우
- 본문 전체에 무조건
user-select: none을 거는 경우 - 사용자가 복사할 가능성이 있는 설명 텍스트를 막는 경우
- 접근성과 사용성을 고려하지 않고 일괄 적용하는 경우
예를 들어 아래 코드는 대체로 좋지 않습니다.
body {
user-select: none;
}
이렇게 하면 페이지 전체의 텍스트를 사용자가 복사할 수 없게 되고, 일반적인 웹 사용 경험을 해치게 됩니다. 사용자는 문장을 복사하거나 검색하려고 할 수 있고, 중요한 내용을 일부 선택해서 참고하려고 할 수도 있습니다.
즉, 선택 방지는 일부 UI에 제한적으로 적용해야 합니다. 사이트 전체에 거는 방식은 대체로 과합니다.
user-select에 대한 흔한 오해
많은 경우 user-select: none을 “복사 방지” 용도로 이해하는데, 정확히 말하면 그건 과장된 해석입니다.
user-select는 다음 정도만 할 수 있습니다.
- 마우스 드래그나 일반적인 텍스트 선택 동작을 제한
- 선택 하이라이트를 줄여서 UI를 정리
- 복사 UX를 일부 조정
하지만 다음은 할 수 없습니다.
- 텍스트 보호를 완전히 보장
- 개발자 도구나 다른 방식의 접근 차단
- 보안 기능 대체
즉, user-select는 콘텐츠 보호 수단이 아니라 선택 경험을 제어하는 UI 속성입니다.
모바일에서도 생각해야 할 점
모바일 환경에서는 길게 눌러 텍스트를 선택하거나 복사 메뉴를 띄우는 경우가 있습니다. 여기서도 user-select는 어느 정도 영향을 줄 수 있지만, 브라우저별 동작 차이가 있을 수 있습니다.
특히 모바일 사파리나 일부 브라우저에서는 선택 관련 동작이 완전히 동일하지 않을 수 있으므로, 중요한 인터랙션에서는 실제 기기 테스트가 필요합니다.
즉, 데스크톱에서 원하는 대로 보였다고 해서 모바일까지 완전히 같을 거라고 가정하면 안 됩니다.
실무 기준으로 정리하면
실무에서는 아래 기준으로 보면 됩니다.
써도 되는 경우
- 텍스트 선택이 UX를 방해하는 UI 요소
- 드래그 인터랙션이 핵심인 컴포넌트
- 전체 복사가 더 자연스러운 짧은 콘텐츠
피해야 하는 경우
- 문서 본문, 설명 문단, 사용자에게 읽히고 복사될 수 있는 내용
- 사이트 전체에 습관적으로 일괄 적용하는 경우
- 복사 방지를 보안처럼 착각하고 사용하는 경우
결론
user-select는 텍스트 선택 동작을 제어하는 CSS 속성입니다. 성격 자체는 단순하지만, 실제 사용자 경험에 꽤 직접적인 영향을 줍니다.
핵심은 이렇습니다.
- 조작용 UI에는
user-select: none - 일반 텍스트는 기본 선택 유지
- 짧은 복사용 콘텐츠에는
user-select: all
즉, 선택을 무조건 막는 것이 목적이 아니라, 요소의 성격에 맞게 선택 경험을 조절하는 것이 핵심입니다.
한 줄로 정리하면 이렇습니다.
user-select는 복사 방지용 속성이 아니라, 텍스트 선택 UX를 다듬는 도구입니다.
'UX 개발 > CSS' 카테고리의 다른 글
| CSS `will-change` 완전 이해하기: 언제 쓰고, 어떻게 써야 할까? (0) | 2026.03.13 |
|---|---|
| CSS `filter: drop-shadow` vs `box-shadow` 완벽 비교 (0) | 2025.09.05 |
| CSS 단위 선택: 실무에서 'rem' vs 'px' 고민 (0) | 2025.02.11 |
| [CSS-in-JS] 이모션(Emotion) 라이브러리 소개 (3) | 2024.09.27 |
| CSS `clip-path`의 기초 알아보기 (0) | 2024.09.15 |
