Reputation: 195
I want to remove the inbuilt grey small caret from ion-select
, and use my
custom caret(arrow) instead.
Code:
ion-select {
color: grey;
background:url("/assets/resources/img/ArrowDownConfig.svg");
}
But my css code is unable to precedence over the ionic(inbuilt).
You can see there are two arrows in the image, one is inbuilt and another is custom. I want to remove inbuilt(ionic) one.
Upvotes: 16
Views: 14614
Reputation: 1
ngAfterViewInit(){
setTimeout(() => {
const ionSelects = document.querySelectorAll('ion-select');
// const ionSelects:any = document.getElementsByClassName('phoselect');
let img = null;
ionSelects.forEach((ionSelect) => {
const selectIconInner = ionSelect.shadowRoot.querySelector('.select-icon').querySelector('.select-icon-inner');
if(selectIconInner){
let _cs=`right: 5px;left:0px; top: 100%;margin-top: -3px;`
selectIconInner.setAttribute("style",_cs)
}
});
}, 1000);
}
Upvotes: 0
Reputation: 89
For Ionic 4, does not support ::part selector, so we could not hide the caret by CSS. I have a idea to hide the icon that adding a layer on-top and overlap the caret icon, use same background color with ion-select
ion-select {
&.hide-caret {
opacity: 1;
&::after {
content: ' ';
width: 40px;
height: 100%;
right: 0;
top: 0;
position: absolute;
background-color: white;
}
}
}
Usage:
<ion-select class="hide-caret" ...>
Upvotes: 0
Reputation: 1
If you want to quite the icon of ion-select-option only add mode="ios" on
Upvotes: 0
Reputation: 1101
If you want just remove the carets, you can do this:
// ...other page methods
ionViewDidEnter() {
const ionSelects = document.querySelectorAll('ion-select');
ionSelects.forEach((sel) => {
sel.shadowRoot.querySelectorAll('.select-icon-inner')
.forEach((elem) => {
elem.setAttribute('style', 'display: none;');
});
});
}
Based on @Sangminem response
In addition, in my case, I'm using slot="end"
with an ion-icon
to place a replacement icon:
<ion-item lines="inset">
<ion-label position="floating">Label</ion-label>
<ion-select>
<ion-select-option value="1">Option 1</ion-select-option>
<ion-select-option value="2">Option 2</ion-select-option>
<ion-select-option value="2">Option 3</ion-select-option>
</ion-select>
<ion-icon color="danger" slot="end" name="arrow-dropdown-circle" class="ion-align-self-center"></ion-icon>
</ion-item>
Upvotes: 11
Reputation: 678
To remove the icon,
ion-select::part(icon) {
display: none !important;
}
To modify the icon,
ion-select::part(icon) {
color: #ffa612 !important;
}
Upvotes: 18
Reputation: 21
I found a way to remove default icon with css, using ::part
directive:
&::part(icon) {
display: none;
}
and the arrow disappear.
Upvotes: 1
Reputation: 1
To modify the icon, call this function
async removeSelectCaret(id){
const select = await (window.document.querySelector(`#${id}`) as HTMLIonSelectElement).componentOnReady();
select.shadowRoot.childNodes[1]['style'].display="none";
}
Upvotes: 0
Reputation: 1647
I've created this directive which you can add to your ion-select to make it look just like other ion elements with placeholder (without arrow).
Usage:
<ion-select placeholder="Choose" appNoArrow>...
Upvotes: 8
Reputation: 1
.select-icon-inner {
border-top: transparent!important;}
I think this is only possible with ioni3. If you want to solve only css in ionic4, you need to know the exact class name of select-icon in ionic4
Upvotes: 0
Reputation: 11
If there are several ion-select items, here is a sample.
TS Code :
ionViewDidEnter() {
// ion-select customizing
const ionSelects = document.querySelectorAll('ion-select');
let img = null;
ionSelects.forEach((ionSelect) => {
const selectIconInner = ionSelect.shadowRoot.querySelector('.select-icon').querySelector('.select-icon-inner');
if(selectIconInner){
selectIconInner.attributes.removeNamedItem("class");
img = document.createElement("img");
img.src = "./new-arrow-down-image.svg";
img.style.width = "12px";
img.style.paddingTop = "3px";
img.style.paddingLeft = "4px";
img.style.color = "black";
img.style.opacity = "0.5";
selectIconInner.appendChild(img);
}
});
}
Upvotes: 1
Reputation: 263
I don't know how to fix, faced same problem, but it seems to be issue with DOM Shadow
If you will find anything, let to know as well please, thanks.
Update: Found some answer
UPDATE #2
I created directive in order to have access to Shadow DOM and it's able to add styles into isolated DOM.
HTML:
<ion-select appStyle>
Directive(need to find better implementation):
constructor(private el: ElementRef) {
setTimeout(() => {
this.el.nativeElement.shadowRoot.querySelector('.select-icon-inner').setAttribute('style', 'display: none !important');
}, 3000);
}
Upvotes: 2
Reputation: 1139
To modify the icon , you can try something like this :
.select-icon-inner {
border-top: transparent!important;
}
Upvotes: -1