멋져요? CSS 만 사용하는 것 외에도 HTML 코드는 단일 요소입니다.
범위 입력 요소는 사용자가 두 경계 (최소 및 최대) 사이의 숫자 값을 선택할 수 있기 때문에 이상적입니다. 우리의 목표는이 기본 요소를 설계하고 추가 태그 나 스크립트없이 스타 등급 구성 요소로 변환하는 것입니다! 또한 마지막에 더 많은 구성 요소를 생성하므로 계속 지켜봐 주시기 바랍니다.
참고 : 이 기사는 CSS 부분에만 초점을 맞 춥니 다. UI, UX 및 접근성 측면에 대해 생각하기 위해 최선을 다했지만 내 구성 요소는 완벽하지 않았습니다. 몇 가지 단점 (오류, 접근성 문제 등)이있을 수 있으므로주의해서 사용하십시오.
요소
입력 요소와 같은 기본 요소를 디자인하는 것은 모든 기본 브라우저 스타일과 다른 내부 구조로 인해 약간 까다로울 수 있습니다. 예를 들어, 범위 입력 요소의 코드를 확인하면 Chrome (또는 Safari, Edge)과 Firefox간에 다른 HTML이 표시됩니다. <input type="range">
운 좋게도, 우리는 내가 의존 할 공통점이 있습니다. 나는 두 가지 다른 요소를 찾을 것입니다 : 메인 요소 (입력 자체) 및 슬라이더 요소 (해당 요소는 마우스를 사용하여 스 와이프하여 값을 업데이트합니다).
우리의 CSS는 주로 다음과 같습니다
유일한 단점은 슬라이더 요소의 스타일을 두 번 반복해야한다는 것입니다. 다음을 시도하지 마십시오 :
전체 선택기가 유효하지 않기 때문에 작동하지 않습니다. Chrome 등은 부분을 이해하지 못하는 반면 Firefox는 <input type="range">
부분을 이해하지 못합니다. 단순화를 위해이 기사에서는 다음 선택기를 사용할 것입니다.
그러나 데모에는 반복 스타일의 실제 선택기가 포함되어 있습니다. 소개로 충분합니다. 코딩을 시작합시다!
메인 요소 스타일 (스타)
먼저 크기를 정의합니다
우리가 각 별이 정사각형 영역에 있다고 생각하면 5 성급 등급의 경우 높이의 5 배 같은 너비가 필요하므로 를 사용하십시오.
5 값은 입력 요소의 속성의 값으로 정의됩니다.
따라서 우리는 새로 향상된 함수 (현재 크롬 만)에 의존하여 수동으로 정의하는 대신 값을 읽을 수 있습니다!
input[type="range"] {
/* 主元素样式 */
}
input[type="range"][i]::-webkit-slider-thumb {
/* Chrome、Safari和Edge的滑块样式 */
}
input[type="range"]::-moz-range-thumb {
/* Firefox的滑块样式 */
}
이제 간단히 속성을 조정하여 별 수를 제어 할 수 있습니다. 이는 속성이 브라우저에서 내부적으로 사용되므로 값을 업데이트하면 구현과 브라우저의 동작을 제어 할 수 있습니다.
이 강화 된 버전의 는 현재 크롬에서만 사용할 수 있으므로 모든 데모에는 지원되지 않는 브라우저를 돕기위한 폴백 체계가 포함되어 있습니다. attr()
다음 단계는 CSS 마스크를 사용하여 별을 만드는 것입니다. 우리는 모양을 5 번 (
값에 따라 더 이상) 반복해야하므로 마스크 크기는 또는 max
와 같거나 높이가 기본적으로 100%에 해당하기 때문에 var(--s) var(--s)
와 단순화해야합니다. var(--s) 100%
var(--s)
속성이 무엇인지 물어볼 수 있습니까? 나는 그것이 약간의 그라디언트가 필요하다고 말하는 것이 놀라운 일이 아니라고 생각하지만 SVG 일 수도 있습니다. 이 기사는 별 등급 구성 요소를 만드는 것에 관한 것이지만, 스타 부분이 다재다능하게 유지되므로 원하는 모양으로 쉽게 교체 할 수 있습니다. 그렇기 때문에이 게시물의 제목에서 "More"라고 말했습니다. 나중에 동일한 코드 구조를 사용하여 다양한 다른 변형을 얻는 방법을 볼 수 있습니다.
여기에는 별 모양을 구현하는 두 가지 다른 방법을 보여주는 데모가 있습니다. 하나는 그라디언트를 사용하고 다른 하나는 SVG를 사용하는 것입니다. <input type="range">
이 경우 SVG 구현은 더 깨끗해 보이고 코드가 짧아 지지만 그라디언트 구현이 때때로 더 나을 수 있기 때문에 두 가지 방법을 모두 기억합니다.
슬라이더 스타일 (선택된 값)
이제 슬라이더 요소에 집중합시다. 마지막 데모를 사용한 다음 별을 클릭하고 슬라이더의 위치를 확인하십시오. mask-image
좋은 소식은 모든 값 (최소에서 최대)의 경우 슬라이더는 항상 주어진 별의 영역 내에 있지만 각 별은 다른 위치를 가지고 있다는 것입니다. 값에 관계없이 위치가 항상 동일하다면 더 나을 것입니다. 이상적으로는 일관성을 위해 슬라이더는 항상 별의 중심에 있어야합니다.
이것은 위치와 업데이트 방법을 보여주는 그림입니다.
이 라인은 각 값에 대한 슬라이더 위치입니다. 왼쪽에는 슬라이더가 기본 요소의 왼쪽 가장자리에서 오른쪽 가장자리로 이동하는 기본 위치가 있습니다. 오른쪽에서는 양쪽에 약간의 공간을 추가하여 슬라이더 위치를 더 작은 영역으로 제한하면 더 나은 정렬을 얻을 수 있습니다. 이 공간은 별 크기의 절반 또는 입니다. 우리는 이것을 위해 패딩을 사용할 수 있습니다 :
슬라이더 크기에 대해 생각하지 않았기 때문에 더 낫지 만 완벽하지는 않습니다. 즉, 우리가 실제로 중심이 아닙니다. 슬라이더 크기를 매우 작게 만들기 위해 1px와 같은 너비를 사용하기 때문에 이것은 문제가되지 않습니다.
슬라이더는 이제 별 중앙에 위치한 얇은 선입니다. 나는 위치를 강조하기 위해 빨간색을 사용하지만 실제로는 투명하기 때문에 색상이 필요하지 않습니다.
당신은 우리가 여전히 최종 결과와는 거리가 멀다고 생각할 수도 있지만 거의 끝났습니다! 이 퍼즐을 완성하기 위해 속성이 누락되었습니다.
속성을 사용하면 함수를 사용하여 요소 외부에 장식을 그릴 수 있습니다. 이를 위해 슬라이더를 작고 투명하게 만듭니다. 색칠은
를 사용하여 수행됩니다. 나는 소스로 두 개의 단색의 그라디언트를 사용하겠습니다 :
우리는 다음 내용을 작성합니다 : <input type="range">
위는 요소의 각 측면에서 의 영역을 100px로 확장하고 그라디언트가 해당 영역을 채울 것임을 의미합니다. 다시 말해, 그라디언트의 각 색상은 영역의 절반, 즉 100px를 커버합니다. border-image
논리를 이해하십니까? 우리는 슬라이더의 양쪽에 넘쳐나는 음영을 만들었습니다. 별을 클릭 할 때마다 슬라이더를 논리적으로 따라갈 수있는 음영이 있습니다.